[kvm-unit-tests PATCH v3 4/6] s390x: lib: don't forward PSW when handling exception in SIE

Nico Boehr
2023-06-01T07:02:37Z

When we're handling a pgm int in SIE, we want to return to the SIE
cleanup after handling the exception. That's why we set pgm_old_psw to
the sie_exit label in fixup_pgm_int.

On nullifing pgm ints, fixup_pgm_int will also forward the old PSW such
that we don't cause an pgm int again.

However, when we want to return to the sie_exit label, this is not
needed (since we've manually set pgm_old_psw). Instead, forwarding the
PSW might cause us to skip an instruction or end up in the middle of an
instruction.

So, let's just skip the rest of the fixup in case we're inside SIE.

Note that we're intentionally not fixing up the PSW in the guest; that's
best left to the test at hand by registering their own psw fixup.

Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
lib/s390x/interrupt.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
index d97b5a3a7e97..3f07068877ee 100644
--- a/lib/s390x/interrupt.c
+++ b/lib/s390x/interrupt.c
@@ -145,6 +145,7 @@ static void fixup_pgm_int(struct stack_frame_int *stack)
if (lowcore.pgm_old_psw.addr >= (uint64_t)&sie_entry &&
lowcore.pgm_old_psw.addr <= (uint64_t)&sie_exit) {
lowcore.pgm_old_psw.addr = (uint64_t)&sie_exit;
+ return;
}

switch (lowcore.pgm_int_code) {
--
2.39.1