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 v2 1/6] s390x: add function to set DAT mode for all interrupts
Date: Tue, 16 May 2023 15:04:51 +0200 [thread overview]
Message-ID: <20230516130456.256205-2-nrb@linux.ibm.com> (raw)
In-Reply-To: <20230516130456.256205-1-nrb@linux.ibm.com>
When toggling DAT or switch address space modes, it is likely that
interrupts should be handled in the same DAT or address space mode.
Add a function which toggles DAT and address space mode for all
interruptions, except restart interrupts.
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
lib/s390x/asm/interrupt.h | 4 ++++
lib/s390x/interrupt.c | 38 ++++++++++++++++++++++++++++++++++++++
lib/s390x/mmu.c | 5 +++--
3 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/lib/s390x/asm/interrupt.h b/lib/s390x/asm/interrupt.h
index 35c1145f0349..55759002dce2 100644
--- a/lib/s390x/asm/interrupt.h
+++ b/lib/s390x/asm/interrupt.h
@@ -83,6 +83,10 @@ void expect_ext_int(void);
uint16_t clear_pgm_int(void);
void check_pgm_int_code(uint16_t code);
+#define IRQ_DAT_ON true
+#define IRQ_DAT_OFF false
+void irq_set_dat_mode(bool dat, uint64_t as);
+
/* Activate low-address protection */
static inline void low_prot_enable(void)
{
diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c
index 3f993a363ae2..1180ec44d72f 100644
--- a/lib/s390x/interrupt.c
+++ b/lib/s390x/interrupt.c
@@ -9,6 +9,7 @@
*/
#include <libcflat.h>
#include <asm/barrier.h>
+#include <asm/mem.h>
#include <asm/asm-offsets.h>
#include <sclp.h>
#include <interrupt.h>
@@ -104,6 +105,43 @@ void register_ext_cleanup_func(void (*f)(struct stack_frame_int *))
THIS_CPU->ext_cleanup_func = f;
}
+/**
+ * irq_set_dat_mode - Set the DAT mode of all interrupt handlers, except for
+ * restart.
+ * This will update the DAT mode and address space mode of all interrupt new
+ * PSWs.
+ *
+ * Since enabling DAT needs initalized CRs and the restart new PSW is often used
+ * to initalize CRs, the restart new PSW is never touched to avoid the chicken
+ * and egg situation.
+ *
+ * @dat specifies whether to use DAT or not
+ * @as specifies the address space mode to use - one of AS_PRIM, AS_ACCR,
+ * AS_SECN or AS_HOME.
+ */
+void irq_set_dat_mode(bool dat, uint64_t as)
+{
+ struct psw* irq_psws[] = {
+ OPAQUE_PTR(GEN_LC_EXT_NEW_PSW),
+ OPAQUE_PTR(GEN_LC_SVC_NEW_PSW),
+ OPAQUE_PTR(GEN_LC_PGM_NEW_PSW),
+ OPAQUE_PTR(GEN_LC_MCCK_NEW_PSW),
+ OPAQUE_PTR(GEN_LC_IO_NEW_PSW),
+ NULL /* sentinel */
+ };
+
+ assert(as == AS_PRIM || as == AS_ACCR || as == AS_SECN || as == AS_HOME);
+
+ for (struct psw *irq_psw = irq_psws[0]; irq_psw != NULL; irq_psw++) {
+ if (!dat)
+ irq_psw->mask &= ~PSW_MASK_DAT;
+ else
+ irq_psw->mask |= PSW_MASK_DAT | as << (63 - 16);
+ }
+
+ mb();
+}
+
static void fixup_pgm_int(struct stack_frame_int *stack)
{
/* If we have an error on SIE we directly move to sie_exit */
diff --git a/lib/s390x/mmu.c b/lib/s390x/mmu.c
index b474d7021d3f..199bd3fbc9c8 100644
--- a/lib/s390x/mmu.c
+++ b/lib/s390x/mmu.c
@@ -12,6 +12,7 @@
#include <asm/pgtable.h>
#include <asm/arch_def.h>
#include <asm/barrier.h>
+#include <asm/interrupt.h>
#include <vmalloc.h>
#include "mmu.h"
@@ -41,8 +42,8 @@ static void mmu_enable(pgd_t *pgtable)
/* enable dat (primary == 0 set as default) */
enable_dat();
- /* we can now also use DAT unconditionally in our PGM handler */
- lowcore.pgm_new_psw.mask |= PSW_MASK_DAT;
+ /* we can now also use DAT in all interrupt handlers */
+ irq_set_dat_mode(IRQ_DAT_ON, AS_PRIM);
}
/*
--
2.39.1
next prev parent reply other threads:[~2023-05-16 13:05 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-16 13:04 [kvm-unit-tests PATCH v2 0/6] s390x: Add support for running guests without MSO/MSL Nico Boehr
2023-05-16 13:04 ` Nico Boehr [this message]
2023-05-16 17:17 ` [kvm-unit-tests PATCH v2 1/6] s390x: add function to set DAT mode for all interrupts Claudio Imbrenda
2023-05-17 12:25 ` Nico Boehr
2023-05-17 13:04 ` Claudio Imbrenda
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 2/6] s390x: sie: switch to home space mode before entering SIE Nico Boehr
2023-05-16 17:22 ` Claudio Imbrenda
2023-05-17 12:44 ` Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 3/6] s390x: lib: don't forward PSW when handling exception in SIE Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 4/6] s390x: fix compile of interrupt.c Nico Boehr
2023-05-16 17:24 ` Claudio Imbrenda
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 5/6] s390x: lib: sie: don't reenter SIE on pgm int Nico Boehr
2023-05-16 17:30 ` Claudio Imbrenda
2023-05-17 12:52 ` Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 6/6] s390x: add a test for SIE without MSO/MSL Nico Boehr
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=20230516130456.256205-2-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.