[PATCH 14/21] arm64: sdei: Support SDEI events from kernel handler and thread modes
Will Deacon
will at kernel.org
Mon Sep 7 09:42:39 PDT 2026
Section 5.2.2 ("Event resume context") of the SDEI specification states
that, as a result of an SDEI_EVENT_COMPLETE_AND_RESUME call:
| SPSR_ELc is set to the PSTATE when the event was taken
In preparation for making use of both thread and handler modes in the
kernel, adjust the SDEI event handler so that we return to the correct
kernel vector for the interrupted mode.
Signed-off-by: Will Deacon <will at kernel.org>
---
arch/arm64/kernel/sdei.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c
index 778f2a1faac8..6337ce905593 100644
--- a/arch/arm64/kernel/sdei.c
+++ b/arch/arm64/kernel/sdei.c
@@ -208,7 +208,7 @@ unsigned long __kprobes do_sdei_event(struct pt_regs *regs,
int i, err = 0;
int clobbered_registers = 4;
u64 elr = read_sysreg(elr_el1);
- u32 kernel_mode = read_sysreg(CurrentEL) | 1; /* +SPSel */
+ u32 kernel_mode = read_sysreg(CurrentEL);
unsigned long vbar = read_sysreg(vbar_el1);
if (arm64_kernel_unmapped_at_el0())
@@ -233,7 +233,7 @@ unsigned long __kprobes do_sdei_event(struct pt_regs *regs,
pr_warn("unsafe: exception during handler\n");
}
- mode = regs->pstate & (PSR_MODE32_BIT | PSR_MODE_MASK);
+ mode = regs->pstate & (PSR_MODE32_BIT | PSR_MODE_MASK) & ~PSR_MODE_h_BIT;
/*
* If we interrupted the kernel with interrupts masked, we always go
@@ -251,7 +251,7 @@ unsigned long __kprobes do_sdei_event(struct pt_regs *regs,
* address'.
*/
if (mode == kernel_mode)
- return vbar + 0x280;
+ return vbar + (regs->pstate & PSR_MODE_h_BIT ? 0x280 : 0x80);
else if (mode & PSR_MODE32_BIT)
return vbar + 0x680;
--
2.55.0.979.g7e5102b832-goog
More information about the linux-arm-kernel
mailing list