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 v1 3/4] s390x: lib: sie: don't reenter SIE on pgm int
Date: Mon, 27 Mar 2023 10:21:17 +0200 [thread overview]
Message-ID: <20230327082118.2177-4-nrb@linux.ibm.com> (raw)
In-Reply-To: <20230327082118.2177-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.
Add a flag PROG_PGM_IN_SIE set by the pgm int fixup which indicates a
program interrupt has occured in SIE. Check for the flag in sie() and if
it's set return from sie() to give the host the ability to react on the
exception. The host may check if a PGM int has occured in the guest
using the new function sie_had_pgm_int().
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
lib/s390x/interrupt.c | 6 ++++++
lib/s390x/sie.c | 10 +++++++++-
lib/s390x/sie.h | 1 +
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
index eb3d6a9b701d..9baf7a003f52 100644
--- a/lib/s390x/interrupt.c
+++ b/lib/s390x/interrupt.c
@@ -106,10 +106,16 @@ void register_ext_cleanup_func(void (*f)(struct stack_frame_int *))
static void fixup_pgm_int(struct stack_frame_int *stack)
{
+ struct kvm_s390_sie_block *sblk;
+
/* If we have an error on SIE we directly move to sie_exit */
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;
+
+ /* set a marker in sie_block that a PGM int occured */
+ sblk = *((struct kvm_s390_sie_block **)(stack->grs0[13] + __SF_SIE_CONTROL));
+ sblk->prog0c |= PROG_PGM_IN_SIE;
return;
}
diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c
index 22141ded1a90..5e9ae7115c47 100644
--- a/lib/s390x/sie.c
+++ b/lib/s390x/sie.c
@@ -44,6 +44,11 @@ void sie_handle_validity(struct vm *vm)
vm->validity_expected = false;
}
+bool sie_had_pgm_int(struct vm *vm)
+{
+ return vm->sblk->prog0c & PROG_PGM_IN_SIE;
+}
+
void sie(struct vm *vm)
{
uint64_t old_cr13;
@@ -68,7 +73,10 @@ void sie(struct vm *vm)
lowcore.io_new_psw.mask |= PSW_MASK_DAT_HOME;
mb();
- while (vm->sblk->icptcode == 0) {
+ /* clear PGM int marker, which might still be set */
+ vm->sblk->prog0c &= ~PROG_PGM_IN_SIE;
+
+ while (vm->sblk->icptcode == 0 && !sie_had_pgm_int(vm)) {
sie64a(vm->sblk, &vm->save_area);
sie_handle_validity(vm);
}
diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h
index 0b00fb709776..8ab755dc9456 100644
--- a/lib/s390x/sie.h
+++ b/lib/s390x/sie.h
@@ -37,6 +37,7 @@ struct kvm_s390_sie_block {
uint32_t ibc : 12;
uint8_t reserved08[4]; /* 0x0008 */
#define PROG_IN_SIE (1<<0)
+#define PROG_PGM_IN_SIE (1<<1)
uint32_t prog0c; /* 0x000c */
union {
uint8_t reserved10[16]; /* 0x0010 */
--
2.39.1
next prev parent reply other threads:[~2023-03-27 8:21 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-27 8:21 [kvm-unit-tests PATCH v1 0/4] s390x: Add support for running guests without MSO/MSL Nico Boehr
2023-03-27 8:21 ` [kvm-unit-tests PATCH v1 1/4] s390x: sie: switch to home space mode before entering SIE Nico Boehr
2023-03-28 14:13 ` Janosch Frank
2023-03-29 12:50 ` Nico Boehr
2023-03-29 13:00 ` Claudio Imbrenda
2023-03-29 13:42 ` Janosch Frank
2023-03-29 14:58 ` Nico Boehr
2023-03-27 8:21 ` [kvm-unit-tests PATCH v1 2/4] s390x: lib: don't forward PSW when handling exception in SIE Nico Boehr
2023-03-27 8:21 ` Nico Boehr [this message]
2023-03-28 13:42 ` [kvm-unit-tests PATCH v1 3/4] s390x: lib: sie: don't reenter SIE on pgm int Janosch Frank
2023-03-28 14:16 ` Nico Boehr
2023-03-28 17:01 ` Claudio Imbrenda
2023-03-29 12:51 ` Nico Boehr
2023-03-27 8:21 ` [kvm-unit-tests PATCH v1 4/4] s390x: add a test for SIE without MSO/MSL Nico Boehr
2023-04-05 19:55 ` Nina Schoetterl-Glausch
2023-04-06 8:01 ` Janosch Frank
2023-04-13 9:43 ` Nico Boehr
2023-04-13 16:33 ` Nina Schoetterl-Glausch
2023-04-14 10:10 ` Nico Boehr
2023-04-14 10:24 ` Nina Schoetterl-Glausch
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=20230327082118.2177-4-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