From: "Kiryl Shutsemau (Meta)" <kas@kernel.org>
To: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
James Morse <james.morse@arm.com>
Cc: "Kiryl Shutsemau (Meta)" <kas@kernel.org>,
Marc Zyngier <maz@kernel.org>,
Doug Anderson <dianders@chromium.org>,
Usama Arif <usama.arif@linux.dev>,
Breno Leitao <leitao@debian.org>, Dawei Li <dawei.li@linux.dev>,
mrigendrachaubey <mrigendra.chaubey@gmail.com>,
kernel-team@meta.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: [PATCH 0/2] arm64: sdei: Handle exceptions taken inside the event handler
Date: Wed, 4 Nov 2026 18:09:32 +0000 [thread overview]
Message-ID: <20261104180936.2981070-1-kas@kernel.org> (raw)
An SDEI event can land anywhere, and a synchronous exception taken by its
handler breaks the context it interrupted:
- With KPTI, an event that lands in user space runs the handler on the
trampoline vectors, whose current-EL half is empty. The exception
loops there and the CPU is lost.
- The exception overwrites ELR, SPSR, ESR and FAR. If the event landed
in exception entry or return, the interrupted context runs on the
handler's values: a task gets SIGILL, or the kernel oopses on a fault
it never took.
Patch 1 runs the handler on the kernel vectors. Patch 2 saves and
restores the exception registers around it.
Handlers take such exceptions in normal operation now that SDEI delivers
NMI backtraces: show_regs() reads through _nofault() accessors that
fault, and a kprobe or WARN anywhere in the path takes a BRK.
Tested under QEMU TCG with TF-A, 4 CPUs, 20 x sysrq-l under load, with a
test-only copy_from_kernel_nofault() of address 0x10 in
sdei_nmi_handler():
- v7.4-rc1, KPTI on: CPUs stuck in the trampoline vectors, RCU stalls.
- v7.4-rc1, KPTI off: 60 "unsafe: exception during handler" warnings,
SIGILL and SIGSEGV in user tasks, and an oops in execve().
- With the series, KPTI on and off: no warnings, no stalls.
Patch 2 was also run on arm64 hardware with firmware SDEI, where a plain
sysrq-l was enough to trigger the warning without it.
Kiryl Shutsemau (Meta) (2):
arm64: sdei: Run the event handler on the kernel vectors
arm64: sdei: Preserve the interrupted context's exception registers
arch/arm64/kernel/sdei.c | 83 +++++++++++++++++++++++++++++++++++-----
1 file changed, 74 insertions(+), 9 deletions(-)
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.54.0
next reply other threads:[~2026-11-04 18:09 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 18:09 Kiryl Shutsemau (Meta) [this message]
2026-11-04 18:09 ` [PATCH 1/2] arm64: sdei: Run the event handler on the kernel vectors Kiryl Shutsemau (Meta)
2026-11-04 18:28 ` Usama Arif
2026-11-05 11:38 ` Kiryl Shutsemau
2026-11-04 18:09 ` [PATCH 2/2] arm64: sdei: Preserve the interrupted context's exception registers Kiryl Shutsemau (Meta)
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=20261104180936.2981070-1-kas@kernel.org \
--to=kas@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=dawei.li@linux.dev \
--cc=dianders@chromium.org \
--cc=james.morse@arm.com \
--cc=kernel-team@meta.com \
--cc=leitao@debian.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=mrigendra.chaubey@gmail.com \
--cc=usama.arif@linux.dev \
--cc=will@kernel.org \
/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.