public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Nico Boehr <nrb@linux.ibm.com>
To: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [kvm-unit-tests PATCH v7 5/8] s390x: lib: sie: don't reenter SIE on pgm int
Date: Fri,  3 Nov 2023 10:29:34 +0100	[thread overview]
Message-ID: <20231103092954.238491-6-nrb@linux.ibm.com> (raw)
In-Reply-To: <20231103092954.238491-1-nrb@linux.ibm.com>

At the moment, when a PGM int occurs while in SIE, we will just reenter
SIE after the interrupt handler was called.

This is because sie() has a loop which checks icptcode and re-enters SIE
if it is zero.

However, this behaviour is quite undesirable for SIE tests, since it
doesn't give the host the chance to assert on the PGM int. Instead, we
will just re-enter SIE, on nullifing conditions even causing the
exception again.

In sie(), check whether a pgm int code is set in lowcore. If it has,
exit the loop so the test can react to the interrupt. Add a new function
read_pgm_int_code() to obtain the interrupt code.

Note that this introduces a slight oddity with sie and pgm int in
certain cases: If a PGM int occurs between a expect_pgm_int() and sie(),
we will now never enter SIE until the pgm_int_code is cleared by e.g.
clear_pgm_int().

Also add missing include of facility.h to mem.h.

Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
 lib/s390x/asm/interrupt.h | 14 ++++++++++++++
 lib/s390x/asm/mem.h       |  1 +
 lib/s390x/sie.c           |  4 +++-
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/lib/s390x/asm/interrupt.h b/lib/s390x/asm/interrupt.h
index d01f8a89641a..7f73d473b346 100644
--- a/lib/s390x/asm/interrupt.h
+++ b/lib/s390x/asm/interrupt.h
@@ -97,4 +97,18 @@ static inline void low_prot_disable(void)
 	ctl_clear_bit(0, CTL0_LOW_ADDR_PROT);
 }
 
+/**
+ * read_pgm_int_code - Get the program interruption code of the last pgm int
+ * on the current CPU.
+ *
+ * This is similar to clear_pgm_int(), except that it doesn't clear the
+ * interruption information from lowcore.
+ *
+ * Returns 0 when none occurred.
+ */
+static inline uint16_t read_pgm_int_code(void)
+{
+	return lowcore.pgm_int_code;
+}
+
 #endif
diff --git a/lib/s390x/asm/mem.h b/lib/s390x/asm/mem.h
index 64ef59b546a4..94d58c34f53f 100644
--- a/lib/s390x/asm/mem.h
+++ b/lib/s390x/asm/mem.h
@@ -8,6 +8,7 @@
 #ifndef _ASMS390X_MEM_H_
 #define _ASMS390X_MEM_H_
 #include <asm/arch_def.h>
+#include <asm/facility.h>
 
 /* create pointer while avoiding compiler warnings */
 #define OPAQUE_PTR(x) ((void *)(((uint64_t)&lowcore) + (x)))
diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c
index 7f4474555ff7..a97096948460 100644
--- a/lib/s390x/sie.c
+++ b/lib/s390x/sie.c
@@ -13,6 +13,7 @@
 #include <libcflat.h>
 #include <sie.h>
 #include <asm/page.h>
+#include <asm/interrupt.h>
 #include <libcflat.h>
 #include <alloc_page.h>
 
@@ -79,7 +80,8 @@ void sie(struct vm *vm)
 	/* also handle all interruptions in home space while in SIE */
 	irq_set_dat_mode(true, AS_HOME);
 
-	while (vm->sblk->icptcode == 0) {
+	/* leave SIE when we have an intercept or an interrupt so the test can react to it */
+	while (vm->sblk->icptcode == 0 && !read_pgm_int_code()) {
 		sie64a(vm->sblk, &vm->save_area);
 		sie_handle_validity(vm);
 	}
-- 
2.41.0


  parent reply	other threads:[~2023-11-03  9:30 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-03  9:29 [kvm-unit-tests PATCH v7 0/8] s390x: Add support for running guests without MSO/MSL Nico Boehr
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 1/8] lib: s390x: introduce bitfield for PSW mask Nico Boehr
2023-11-03 13:35   ` Claudio Imbrenda
2023-11-03 13:43   ` Janosch Frank
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 2/8] s390x: add function to set DAT mode for all interrupts Nico Boehr
2023-11-03 13:40   ` Claudio Imbrenda
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 3/8] s390x: sie: switch to home space mode before entering SIE Nico Boehr
2023-11-03 13:39   ` Janosch Frank
2023-11-03 13:44   ` Claudio Imbrenda
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 4/8] s390x: lib: don't forward PSW when handling exception in SIE Nico Boehr
2023-11-03  9:29 ` Nico Boehr [this message]
2023-11-03 13:48   ` [kvm-unit-tests PATCH v7 5/8] s390x: lib: sie: don't reenter SIE on pgm int Claudio Imbrenda
2023-11-03 13:53   ` Janosch Frank
2023-11-06 16:36     ` Nico Boehr
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 6/8] s390x: add test source dir to include paths Nico Boehr
2023-11-03 13:56   ` Janosch Frank
2023-11-03 13:57   ` Claudio Imbrenda
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 7/8] s390x: add a test for SIE without MSO/MSL Nico Boehr
2023-11-03 14:12   ` Claudio Imbrenda
2023-11-03 14:16   ` Janosch Frank
2023-11-06 15:51     ` Nico Boehr
2023-11-06 10:39   ` Heiko Carstens
2023-11-03  9:29 ` [kvm-unit-tests PATCH v7 8/8] lib: s390x: interrupt: remove TEID_ASCE defines Nico Boehr
2023-11-03 14:14   ` Claudio Imbrenda
2023-11-03 14:18   ` Janosch Frank

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231103092954.238491-6-nrb@linux.ibm.com \
    --to=nrb@linux.ibm.com \
    --cc=frankja@linux.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox