]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: scs: Remove redundant save/restore of SCS SP on entry to/from EL0
authorWill Deacon <will@kernel.org>
Fri, 13 Mar 2026 12:32:19 +0000 (12:32 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 13 Mar 2026 17:17:58 +0000 (17:17 +0000)
When returning to userspace, the SCS is empty and so the SCS SP just
points to the base address of the SCS page.

Rather than saving and restoring this address in the current task, we
can simply restore the SCS SP to point at the base of the stack on entry
to EL1 from EL0.

Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/scs.h
arch/arm64/kernel/entry.S

index 0fbc2e7867d3efaa5666caf11164ee71f40d1f1a..a15a2968e7b66aa7deaf1aa3e265c448c202f0e9 100644 (file)
 #ifdef CONFIG_SHADOW_CALL_STACK
        scs_sp  .req    x18
 
+       .macro scs_load_current_base
+       get_current_task scs_sp
+       ldr     scs_sp, [scs_sp, #TSK_TI_SCS_BASE]
+       .endm
+
        .macro scs_load_current
        get_current_task scs_sp
        ldr     scs_sp, [scs_sp, #TSK_TI_SCS_SP]
@@ -19,6 +24,9 @@
        str     scs_sp, [\tsk, #TSK_TI_SCS_SP]
        .endm
 #else
+       .macro scs_load_current_base
+       .endm
+
        .macro scs_load_current
        .endm
 
index f8018b5c1f9ad07eae82627decbe67c5524e5cb7..ab476ba060d104472868c39e9c526a1cc213d028 100644 (file)
@@ -273,7 +273,7 @@ alternative_if ARM64_HAS_ADDRESS_AUTH
 alternative_else_nop_endif
 1:
 
-       scs_load_current
+       scs_load_current_base
        .else
        add     x21, sp, #PT_REGS_SIZE
        get_current_task tsk
@@ -378,8 +378,6 @@ alternative_if ARM64_WORKAROUND_845719
 alternative_else_nop_endif
 #endif
 3:
-       scs_save tsk
-
        /* Ignore asynchronous tag check faults in the uaccess routines */
        ldr     x0, [tsk, THREAD_SCTLR_USER]
        clear_mte_async_tcf x0