riscv: Fix SMP when shadow call stacks are enabled
authorSamuel Holland <samuel.holland@sifive.com>
Tue, 21 Nov 2023 21:19:29 +0000 (13:19 -0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 6 Dec 2023 15:15:19 +0000 (07:15 -0800)
This fixes two bugs in SCS initialization for secondary CPUs. First,
the SCS was not initialized at all in the spinwait boot path. Second,
the code for the SBI HSM path attempted to initialize the SCS before
enabling the MMU. However, that involves dereferencing the thread
pointer, which requires the MMU to be enabled.

Fix both issues by setting up the SCS in the common secondary entry
path, after enabling the MMU.

Fixes: d1584d791a29 ("riscv: Implement Shadow Call Stack")
Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
Link: https://lore.kernel.org/r/20231121211958.3158576-1-samuel.holland@sifive.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/head.S

index b77397432403d9ef028fea6855cdc97aea143d00..76ace1e0b46f623a119cc07a08ad8923079e1c81 100644 (file)
@@ -154,7 +154,6 @@ secondary_start_sbi:
        XIP_FIXUP_OFFSET a3
        add a3, a3, a1
        REG_L sp, (a3)
-       scs_load_current
 
 .Lsecondary_start_common:
 
@@ -165,6 +164,7 @@ secondary_start_sbi:
        call relocate_enable_mmu
 #endif
        call .Lsetup_trap_vector
+       scs_load_current
        tail smp_callin
 #endif /* CONFIG_SMP */