Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> writes: > Am 01.07.24 um 08:08 schrieb Sven Schnelle: >> Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> writes: >> >>> 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." > > Only for exception of the instruction but not for the target PSW. > POP says: > > The other PSW fields which are to be loaded by the > instruction are not checked for validity before they are > loaded. However, immediately after loading, a speci- > fication exception is recognized, and a program inter- > ruption occurs, when any of the following is true for > the newly loaded PSW Ok, sorry for the noise.