Re: [PATCH v2 15/21] arm64: entry: Point SP_EL0 at the overflow stack

From: Jinjie Ruan

Date: Thu Oct 08 2026 - 07:22:22 EST




在 2026/9/19 0:13, Will Deacon 写道:
> With SP_EL0 now available for use in the kernel, point it at the
> overflow stack so that exception entry from EL1h will later be able to
> switch to the overflow stack by writing to SPSel.
>
> Cc: Mark Rutland <mark.rutland@xxxxxxx>
> Signed-off-by: Will Deacon <will@xxxxxxxxxx>
> ---
> arch/arm64/kernel/entry.S | 2 ++
> arch/arm64/kernel/head.S | 3 +++
> arch/arm64/kernel/smp.c | 12 ++++++++++--
> 3 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index a45be0a837c8..6958ee238649 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -227,6 +227,8 @@ alternative_cb_end
> mrs x21, sp_el0
> ldr_this_cpu tsk, __entry_task, x20
> msr tpidrro_el0, tsk
> + adr_this_cpu x19, overflow_stack + OVERFLOW_STACK_SIZE, x20
> + msr sp_el0, x19
>
> /*
> * Ensure MDSCR_EL1.SS is clear, since we can unmask debug exceptions
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index c33551ee6572..27a19e1a0ee6 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -210,6 +210,9 @@ SYM_CODE_END(preserve_boot_args)
> ldr w\tmp2, [\tsk, #TSK_TI_CPU]
> ldr \tmp1, [\tmp1, \tmp2, lsl #3]
> set_this_cpu_offset \tmp1
> +
> + adr_this_cpu \tmp1, overflow_stack + OVERFLOW_STACK_SIZE, \tmp2
> + msr sp_el0, \tmp1
> .endm
>
> /*
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index 702dee8d0db5..4c122d6598de 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -51,6 +51,7 @@
> #include <asm/processor.h>
> #include <asm/smp_plat.h>
> #include <asm/sections.h>
> +#include <asm/stacktrace.h>
> #include <asm/tlbflush.h>
> #include <asm/ptrace.h>
> #include <asm/virt.h>
> @@ -448,8 +449,15 @@ void __init smp_cpus_done(unsigned int max_cpus)
>
> static void __init set_boot_cpu_offset(void)
> {
> - asm volatile("msr tpidr_el1, %0"
> - :: "r" (per_cpu_offset(0)) : "memory");
> + u64 ovf_sp = (u64)raw_cpu_ptr(overflow_stack) + OVERFLOW_STACK_SIZE;
> +
> + asm volatile(
> + " msr tpidr_el1, %1\n"
> + " add %0, %0, %1\n"
> + " msr sp_el0, %0" /* Update the overflow stack pointer */
> + : "+r" (ovf_sp)
> + : "r" (per_cpu_offset(0))
> + : "memory");

Reviewed-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>

> }
>
> void __init smp_prepare_boot_cpu(void)

--
Best regards,
Jinjie