From: Anup Patel <anup.patel@oss.qualcomm.com>
To: Palmer Dabbelt <palmer@dabbelt.com>,
Paul Walmsley <pjw@kernel.org>, Alexandre Ghiti <alex@ghiti.fr>,
Himanshu Chauhan <himanshu.chauhan@oss.qualcomm.com>,
Conor Dooley <conor@kernel.org>,
Atish Patra <atish.patra@linux.dev>,
Anup Patel <anup@brainfault.org>
Cc: Zhanpeng Zhang <zhangzhanpeng.jasper@bytedance.com>,
Yunhui Cui <cuiyunhui@bytedance.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
Will Deacon <will@kernel.org>, Thomas Gleixner <tglx@kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
Randy Dunlap <rdunlap@infradead.org>,
Shuah Khan <shuah@kernel.org>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: [PATCH v11 3/9] riscv: sse: mask events during shutdown and kexec
Date: Wed, 28 Oct 2026 22:25:25 +0530 [thread overview]
Message-ID: <20261028165531.940336-4-anup.patel@oss.qualcomm.com> (raw)
In-Reply-To: <20261028165531.940336-1-anup.patel@oss.qualcomm.com>
From: Zhanpeng Zhang <zhangzhanpeng.jasper@bytedance.com>
SSE delivery is independent of normal S-mode interrupts. Firmware may also
retain an event registration until Linux explicitly unregisters it. A hart
must therefore stop accepting SSE events before Linux stops servicing the
registered handler.
Mask SSE on the local hart before panic stop, CPU stop, restart, poweroff,
and crash shutdown paths. This prevents firmware from entering Linux-owned
handler state after the corresponding CPU or kernel context is no longer
valid.
A crash kernel cannot identify or take ownership of registrations
inherited from the crashed kernel. Reject a later normal kexec while such
SSE state may still exist, rather than transferring unknown firmware state
to another kernel.
Signed-off-by: Zhanpeng Zhang <zhangzhanpeng.jasper@bytedance.com>
Reviewed-by: Himanshu Chauhan <himanshu.chauhan@oss.qualcomm.com>
---
arch/riscv/kernel/machine_kexec.c | 11 +++++++++++
arch/riscv/kernel/reset.c | 18 ++++++++++++++++++
arch/riscv/kernel/smp.c | 17 +++++++++++++++++
3 files changed, 46 insertions(+)
diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c
index 738df176ff6f..24e7affae70b 100644
--- a/arch/riscv/kernel/machine_kexec.c
+++ b/arch/riscv/kernel/machine_kexec.c
@@ -14,10 +14,13 @@
#include <asm/set_memory.h> /* For set_memory_x() */
#include <linux/compiler.h> /* For unreachable() */
#include <linux/cpu.h> /* For cpu_down() */
+#include <linux/crash_dump.h>
#include <linux/reboot.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
+#include <asm/sse.h>
+
/*
* machine_kexec_prepare - Initialize kexec
*
@@ -36,6 +39,13 @@ machine_kexec_prepare(struct kimage *image)
unsigned int control_code_buffer_sz = 0;
int i = 0;
+ /* A crash kernel cannot tear down registrations inherited from firmware. */
+ if (is_kdump_kernel() && image->type != KEXEC_TYPE_CRASH &&
+ riscv_sse_available()) {
+ pr_err("Normal kexec from a crash kernel is unsupported with SSE\n");
+ return -EOPNOTSUPP;
+ }
+
/* Find the Flattened Device Tree and save its physical address */
for (i = 0; i < image->nr_segments; i++) {
if (image->segment[i].memsz <= sizeof(fdt))
@@ -127,6 +137,7 @@ void
machine_crash_shutdown(struct pt_regs *regs)
{
local_irq_disable();
+ riscv_sse_mask_current_hart();
/* shutdown non-crashing cpus */
crash_smp_send_stop();
diff --git a/arch/riscv/kernel/reset.c b/arch/riscv/kernel/reset.c
index 14eb08a6db85..fdab37e7ae52 100644
--- a/arch/riscv/kernel/reset.c
+++ b/arch/riscv/kernel/reset.c
@@ -6,6 +6,20 @@
#include <linux/efi.h>
#include <linux/reboot.h>
#include <linux/pm.h>
+#include <linux/smp.h>
+
+#include <asm/sse.h>
+
+#ifndef CONFIG_SMP
+void __noreturn panic_smp_self_stop(void)
+{
+ riscv_sse_mask_current_hart();
+ local_irq_disable();
+
+ for (;;)
+ cpu_relax();
+}
+#endif
static void __noreturn default_power_off(void)
{
@@ -18,6 +32,8 @@ EXPORT_SYMBOL(pm_power_off);
void machine_restart(char *cmd)
{
+ riscv_sse_mask_current_hart();
+
/*
* UpdateCapsule() depends on the system being reset via ResetSystem().
*/
@@ -30,12 +46,14 @@ void machine_restart(char *cmd)
void machine_halt(void)
{
+ riscv_sse_mask_current_hart();
do_kernel_power_off();
default_power_off();
}
void machine_power_off(void)
{
+ riscv_sse_mask_current_hart();
do_kernel_power_off();
default_power_off();
}
diff --git a/arch/riscv/kernel/smp.c b/arch/riscv/kernel/smp.c
index eddbc3ad06c9..9ad38df48271 100644
--- a/arch/riscv/kernel/smp.c
+++ b/arch/riscv/kernel/smp.c
@@ -22,10 +22,13 @@
#include <linux/irq.h>
#include <linux/irq_work.h>
#include <linux/nmi.h>
+#include <linux/panic.h>
#include <asm/tlbflush.h>
#include <asm/cacheflush.h>
#include <asm/cpu_ops.h>
+#include <asm/sbi.h>
+#include <asm/sse.h>
enum ipi_message_type {
IPI_RESCHEDULE,
@@ -78,8 +81,18 @@ int riscv_hartid_to_cpuid(unsigned long hartid)
return -ENOENT;
}
+void __noreturn panic_smp_self_stop(void)
+{
+ riscv_sse_mask_current_hart();
+ local_irq_disable();
+
+ for (;;)
+ cpu_relax();
+}
+
static void ipi_stop(void)
{
+ riscv_sse_mask_current_hart();
set_cpu_online(smp_processor_id(), false);
while (1)
wait_for_interrupt();
@@ -90,6 +103,7 @@ static atomic_t waiting_for_crash_ipi = ATOMIC_INIT(0);
static inline void ipi_cpu_crash_stop(unsigned int cpu, struct pt_regs *regs)
{
+ riscv_sse_mask_current_hart();
crash_save_cpu(regs, cpu);
atomic_dec(&waiting_for_crash_ipi);
@@ -253,6 +267,8 @@ void smp_send_stop(void)
{
unsigned long timeout;
+ riscv_sse_mask_current_hart();
+
if (num_online_cpus() > 1) {
cpumask_t mask;
@@ -300,6 +316,7 @@ void crash_smp_send_stop(void)
return;
cpus_stopped = 1;
+ riscv_sse_mask_current_hart();
/*
* If this cpu is the only one alive at this point in time, online or
--
2.43.0
next prev parent reply other threads:[~2026-10-28 16:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 16:55 [PATCH v11 0/9] riscv: add SBI Supervisor Software Events support Anup Patel
2026-10-28 16:55 ` [PATCH v11 1/9] riscv: add SBI SSE extension definitions Anup Patel
2026-10-28 16:55 ` [PATCH v11 2/9] riscv: add support for SBI Supervisor Software Events extension Anup Patel
2026-10-28 16:55 ` Anup Patel [this message]
2026-10-28 16:55 ` [PATCH v11 4/9] drivers: firmware: add riscv SSE support Anup Patel
2026-10-28 16:55 ` [PATCH v11 5/9] riscv: mm: avoid enabling interrupts for nofault page faults Anup Patel
2026-10-28 16:55 ` [PATCH v11 6/9] perf: RISC-V: support callchains with SSE delivery Anup Patel
2026-10-28 16:55 ` [PATCH v11 7/9] perf: RISC-V: add support for SSE event Anup Patel
2026-10-28 16:55 ` [PATCH v11 8/9] selftests/riscv: add SSE test module Anup Patel
2026-10-28 16:55 ` [PATCH v11 9/9] selftests/riscv: add perf user-stack SSE copy regression test Anup Patel
2026-10-29 3:06 ` [PATCH v11 0/9] riscv: add SBI Supervisor Software Events support Zhanpeng Zhang
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=20261028165531.940336-4-anup.patel@oss.qualcomm.com \
--to=anup.patel@oss.qualcomm.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alex@ghiti.fr \
--cc=alexander.shishkin@linux.intel.com \
--cc=anup@brainfault.org \
--cc=atish.patra@linux.dev \
--cc=conor@kernel.org \
--cc=corbet@lwn.net \
--cc=cuiyunhui@bytedance.com \
--cc=himanshu.chauhan@oss.qualcomm.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=rdunlap@infradead.org \
--cc=shuah@kernel.org \
--cc=tglx@kernel.org \
--cc=will@kernel.org \
--cc=zhangzhanpeng.jasper@bytedance.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
all inboxes | Powered by JetHome®