[PATCH 2/3] kvm: s390: Fix LPSW/E early exception bear behavior

Janosch Frank
2026-04-23T12:39:31Z

When loading a PSW a lot of specification exceptions are recognized
after the PSW has been loaded. In these cases the load PSW(E) succeeds
but the loaded PSW was invalid. Since the load completed we need to
set the bear.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Fixes: 1653545abc68 ("KVM: s390: Fix lpsw/e breaking event handling")
---
arch/s390/kvm/priv.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index cc0553da14cb..56e63679f9d1 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -736,9 +736,11 @@ int kvm_s390_handle_lpsw(struct kvm_vcpu *vcpu)
gpsw->mask = (new_psw.mask & ~PSW32_MASK_BASE) << 32;
gpsw->mask |= new_psw.addr & PSW32_ADDR_AMODE;
gpsw->addr = new_psw.addr & ~PSW32_ADDR_AMODE;
+ vcpu->arch.sie_block->gbea = iaddr;
+
if (!is_valid_psw(gpsw))
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
- vcpu->arch.sie_block->gbea = iaddr;
+
return 0;
}

@@ -762,9 +764,11 @@ static int handle_lpswe(struct kvm_vcpu *vcpu)
if (rc)
return kvm_s390_inject_prog_cond(vcpu, rc);
vcpu->arch.sie_block->gpsw = new_psw;
+ vcpu->arch.sie_block->gbea = iaddr;
+
if (!is_valid_psw(&vcpu->arch.sie_block->gpsw))
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
- vcpu->arch.sie_block->gbea = iaddr;
+
return 0;
}

--
2.51.0