Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> writes: > in rare cases, e.g. for injecting a machine check we do intercept all > load PSW instructions via ICTL_LPSW. With facility 193 a new variant > LPSWEY was added. KVM needs to handle that as well. > > Fixes: a3efa8429266 ("KVM: s390: gen_facilities: allow facilities 165, 193, 194 and 196") > Reported-by: Marc Hartmayer <mhartmay@xxxxxxxxxxxxx> > Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> > --- > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/kvm-s390.c | 1 + > arch/s390/kvm/kvm-s390.h | 15 +++++++++++++++ > arch/s390/kvm/priv.c | 32 ++++++++++++++++++++++++++++++++ > 4 files changed, 49 insertions(+) > > diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c > index 1be19cc9d73c..1a49b89706f8 100644 > --- a/arch/s390/kvm/priv.c > +++ b/arch/s390/kvm/priv.c > @@ -797,6 +797,36 @@ static int handle_lpswe(struct kvm_vcpu *vcpu) > return 0; > } > > +static int handle_lpswey(struct kvm_vcpu *vcpu) > +{ > + psw_t new_psw; > + u64 addr; > + int rc; > + u8 ar; > + > + vcpu->stat.instruction_lpswey++; > + > + if (!test_kvm_facility(vcpu->kvm, 193)) > + return kvm_s390_inject_program_int(vcpu, PGM_OPERATION); > + > + if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) > + return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); > + > + addr = kvm_s390_get_base_disp_siy(vcpu, &ar); > + if (addr & 7) > + return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); > + > + rc = read_guest(vcpu, addr, ar, &new_psw, sizeof(new_psw)); > + if (rc) > + return kvm_s390_inject_prog_cond(vcpu, rc); > + > + vcpu->arch.sie_block->gpsw = new_psw; > + if (!is_valid_psw(&vcpu->arch.sie_block->gpsw)) > + return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); Shouldn't the gpsw get updated with new_psw after the check? POP says "The operation is suppressed on all addressing and protection exceptions." > + > + return 0; > +}