[PATCH v7 0/5] riscv: add support for SBI Supervisor Software Events
Paul Walmsley
pjw at kernel.org
Thu Oct 9 18:32:31 PDT 2025
Hi Clément,
On Mon, 8 Sep 2025, Clément Léger wrote:
> The SBI Supervisor Software Events (SSE) extensions provides a mechanism
> to inject software events from an SBI implementation to supervisor
> software such that it preempts all other supervisor level traps and
> interrupts. This extension is introduced by the SBI v3.0 specification[1].
>
> Various events are defined and can be send asynchronously to supervisor
> software (RAS, PMU, DEBUG, Asynchronous page fault) from SBI as well
> as platform specific events. Events can be either local (per-hart) or
> global. Events can be nested on top of each other based on priority and
> can interrupt the kernel at any time.
>
> First patch adds the SSE definitions. Second one adds support for SSE
> at arch level (entry code and stack allocations) and third one at driver
> level. Finally, the last patch add support for SSE events in the SBI PMU
> driver. Additional testing for that part is highly welcomed since there
> are a lot of possible path that needs to be exercised.
>
> Amongst the specific points that needs to be handle is the interruption
> at any point of the kernel execution and more specifically at the
> beginning of exception handling. Due to the fact that the exception entry
> implementation uses the SCRATCH CSR as both the current task struct and
> as the temporary register to switch the stack and save register, it is
> difficult to reliably get the current task struct if we get interrupted
> at this specific moment (ie, it might contain 0, the task pointer or tp).
> A fixup-like mechanism is not possible due to the nested nature of SSE
> which makes it really hard to obtain the original interruption site. In
> order to retrieve the task in a reliable manner, add an additional
> __sse_entry_task per_cpu array which stores the current task. Ideally,
> we would need to modify the way we retrieve/store the current task in
> exception handling so that it does not depend on the place where it's
> interrupted.
>
> Contrary to pseudo NMI [2], SSE does not modifies the way interrupts are
> handled and does not adds any overhead to existing code. Moreover, it
> provides "true" NMI-like interrupts which can interrupt the kernel at
> any time (even in exception handling). This is particularly crucial for
> RAS errors which needs to be handled as fast as possible to avoid any
> fault propagation.
>
> A test suite is available as a separate kselftest module. In order to
> build it, you can use the following command:
>
> $ KDIR=<build_dir> make O=build TARGETS="riscv/sse"-j $(($(nproc)-1)) -C tools/testing/selftests
>
> Then load the module using:
>
> $ sh run_sse_test.sh
>
> A KVM SBI SSE extension implementation is available at [2].
>
> Link: https://github.com/riscv-non-isa/riscv-sbi-doc/releases/download/v3.0-rc7/riscv-sbi.pdf [1]
> Link: https://github.com/rivosinc/linux/tree/dev/cleger/sse_kvm [2]
I updated these to apply on Linus' current master, commit 5472d60c129f,
cleaned up the checkpatch.pl --strict issues, applied Anup's pr_info()
suggestion, and pushed them up here to make it convenient for folks to
integrate and test:
https://git.kernel.org/pub/scm/linux/kernel/git/pjw/riscv.git/?h=riscv-experimental-for-v6.18
Am assuming you didn't have other changes that you wanted to make; let me
know if that's not the case.
I noticed that you asked for folks to do additional testing, particularly
of the SBI PMU driver integration, but didn't notice any additional
Tested-by:s. It would be great if other folks on the list could do some
focused testing now, particularly since we're on v7 of this series, and
I'm sure others care about this.
thanks,
- Paul
More information about the linux-riscv
mailing list