Message ID | 1500028867-134709-36-git-send-email-borntraeger@de.ibm.com |
---|---|
State | New |
Headers | show |
On 14.07.2017 12:41, Christian Borntraeger wrote: > From: "Jason J. Herne" <jjherne@linux.vnet.ibm.com> > > In QEMU, a guest VCPU always started in and never was able to leave > z/Architecture mode. Now we have an architected way of showing this > condition. > > The SIGP SET ARCHITECTURE instruction is simply rejected. Linux as guest > seems to not care about the return value, which is a good thing > The new handling is just like already being in z/Architecture mode. > > We'll not try to fake absence of this facility, but still not indicate > the facility in case some strange CPU model turned z/Architecture off > completely (which doesn't work either way but let's us see how a > guest would react on a lack of this facility). > > Signed-off-by: Jason J. Herne <jjherne@linux.vnet.ibm.com> > Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> > Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > target/s390x/cpu_features.c | 5 +++-- > target/s390x/kvm.c | 38 +++++++++++--------------------------- > 2 files changed, 14 insertions(+), 29 deletions(-) > > diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c > index e5a3f71..fa887d9 100644 > --- a/target/s390x/cpu_features.c > +++ b/target/s390x/cpu_features.c > @@ -337,8 +337,9 @@ void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, > int bit_nr; > > if (type == S390_FEAT_TYPE_STFL && test_bit(S390_FEAT_ZARCH, features)) { > - /* z/Architecture is always active if around */ > - data[0] |= 0x20; > + /* Features that are always active */ > + data[0] |= 0x20; /* z/Architecture */ > + data[17] |= 0x20; /* Configuration-z-architectural-mode */ > } This also requires changes in TCG , no? (set architecture there is left untouched)
On 17.07.2017 19:33, David Hildenbrand wrote: > On 14.07.2017 12:41, Christian Borntraeger wrote: >> From: "Jason J. Herne" <jjherne@linux.vnet.ibm.com> >> >> In QEMU, a guest VCPU always started in and never was able to leave >> z/Architecture mode. Now we have an architected way of showing this >> condition. >> >> The SIGP SET ARCHITECTURE instruction is simply rejected. Linux as guest >> seems to not care about the return value, which is a good thing >> The new handling is just like already being in z/Architecture mode. >> >> We'll not try to fake absence of this facility, but still not indicate >> the facility in case some strange CPU model turned z/Architecture off >> completely (which doesn't work either way but let's us see how a >> guest would react on a lack of this facility). >> >> Signed-off-by: Jason J. Herne <jjherne@linux.vnet.ibm.com> >> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> >> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> >> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> >> --- >> target/s390x/cpu_features.c | 5 +++-- >> target/s390x/kvm.c | 38 +++++++++++--------------------------- >> 2 files changed, 14 insertions(+), 29 deletions(-) >> >> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c >> index e5a3f71..fa887d9 100644 >> --- a/target/s390x/cpu_features.c >> +++ b/target/s390x/cpu_features.c >> @@ -337,8 +337,9 @@ void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, >> int bit_nr; >> >> if (type == S390_FEAT_TYPE_STFL && test_bit(S390_FEAT_ZARCH, features)) { >> - /* z/Architecture is always active if around */ >> - data[0] |= 0x20; >> + /* Features that are always active */ >> + data[0] |= 0x20; /* z/Architecture */ >> + data[17] |= 0x20; /* Configuration-z-architectural-mode */ >> } > > This also requires changes in TCG , no? (set architecture there is left > untouched) > > Never mind, just realized we do our own block creation in do_stfle....
diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c index e5a3f71..fa887d9 100644 --- a/target/s390x/cpu_features.c +++ b/target/s390x/cpu_features.c @@ -337,8 +337,9 @@ void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, int bit_nr; if (type == S390_FEAT_TYPE_STFL && test_bit(S390_FEAT_ZARCH, features)) { - /* z/Architecture is always active if around */ - data[0] |= 0x20; + /* Features that are always active */ + data[0] |= 0x20; /* z/Architecture */ + data[17] |= 0x20; /* Configuration-z-architectural-mode */ } feat = find_first_bit(features, S390_FEAT_MAX); diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index 3a80f1f..8c6cc0a 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -1757,41 +1757,25 @@ static int sigp_set_architecture(S390CPU *cpu, uint32_t param, { CPUState *cur_cs; S390CPU *cur_cpu; + bool all_stopped = true; - /* due to the BQL, we are the only active cpu */ CPU_FOREACH(cur_cs) { cur_cpu = S390_CPU(cur_cs); - if (cur_cpu->env.sigp_order != 0) { - return SIGP_CC_BUSY; + + if (cur_cpu == cpu) { + continue; } - cpu_synchronize_state(cur_cs); - /* all but the current one have to be stopped */ - if (cur_cpu != cpu && - s390_cpu_get_state(cur_cpu) != CPU_STATE_STOPPED) { - *status_reg &= 0xffffffff00000000ULL; - *status_reg |= SIGP_STAT_INCORRECT_STATE; - return SIGP_CC_STATUS_STORED; + if (s390_cpu_get_state(cur_cpu) != CPU_STATE_STOPPED) { + all_stopped = false; } } - switch (param & 0xff) { - case SIGP_MODE_ESA_S390: - /* not supported */ - return SIGP_CC_NOT_OPERATIONAL; - case SIGP_MODE_Z_ARCH_TRANS_ALL_PSW: - case SIGP_MODE_Z_ARCH_TRANS_CUR_PSW: - CPU_FOREACH(cur_cs) { - cur_cpu = S390_CPU(cur_cs); - cur_cpu->env.pfault_token = -1UL; - } - break; - default: - *status_reg &= 0xffffffff00000000ULL; - *status_reg |= SIGP_STAT_INVALID_PARAMETER; - return SIGP_CC_STATUS_STORED; - } + *status_reg &= 0xffffffff00000000ULL; - return SIGP_CC_ORDER_CODE_ACCEPTED; + /* Reject set arch order, with czam we're always in z/Arch mode. */ + *status_reg |= (all_stopped ? SIGP_STAT_INVALID_PARAMETER : + SIGP_STAT_INCORRECT_STATE); + return SIGP_CC_STATUS_STORED; } static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)