summaryrefslogtreecommitdiff
path: root/arch/arm/kernel/entry-armv.S
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2021-11-25 10:26:44 +0100
committerArd Biesheuvel <ardb@kernel.org>2021-12-06 12:49:17 +0100
commit7b9896c352073156a325c3bb0dc4c46e06e2a468 (patch)
treea9e6e3be8a6a2b91a147f3e9ae82dfb7fbd860e5 /arch/arm/kernel/entry-armv.S
parent4e918ab13eaf40f19938659cb5a22c93172778a8 (diff)
ARM: percpu: add SMP_ON_UP support
Permit the use of the TPIDRPRW system register for carrying the per-CPU offset in generic SMP configurations that also target non-SMP capable ARMv6 cores. This uses the SMP_ON_UP code patching framework to turn all TPIDRPRW accesses into reads/writes of entry #0 in the __per_cpu_offset array. While at it, switch over some existing direct TPIDRPRW accesses in asm code to invocations of a new helper that is patched in the same way when necessary. Note that CPU_V6+SMP without SMP_ON_UP results in a kernel that does not boot on v6 CPUs without SMP extensions, so add this dependency to Kconfig as well. Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Tested-by: Marc Zyngier <maz@kernel.org> Tested-by: Vladimir Murzin <vladimir.murzin@arm.com> # ARMv7M
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
-rw-r--r--arch/arm/kernel/entry-armv.S16
1 files changed, 3 insertions, 13 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index 7f7ac963445c..43d917f0d9a9 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -35,15 +35,14 @@
.macro irq_handler, from_user:req
mov r0, sp
#ifdef CONFIG_IRQSTACKS
- mov_l r2, irq_stack_ptr @ Take base address
- mrc p15, 0, r3, c13, c0, 4 @ Get CPU offset
#ifdef CONFIG_UNWINDER_ARM
mov fpreg, sp @ Preserve original SP
#else
mov r8, fp @ Preserve original FP
mov r9, sp @ Preserve original SP
#endif
- ldr sp, [r2, r3] @ Load SP from per-CPU var
+ ldr_this_cpu sp, irq_stack_ptr, r2, r3
+
.if \from_user == 0
UNWIND( .setfp fpreg, sp )
@
@@ -876,16 +875,7 @@ __bad_stack:
THUMB( bx pc )
THUMB( nop )
THUMB( .arm )
- mrc p15, 0, ip, c13, c0, 4 @ Get per-CPU offset
-
- .globl overflow_stack_ptr
- .reloc 0f, R_ARM_ALU_PC_G0_NC, overflow_stack_ptr
- .reloc 1f, R_ARM_ALU_PC_G1_NC, overflow_stack_ptr
- .reloc 2f, R_ARM_LDR_PC_G2, overflow_stack_ptr
- add ip, ip, pc
-0: add ip, ip, #-4
-1: add ip, ip, #0
-2: ldr ip, [ip, #4]
+ ldr_this_cpu_armv6 ip, overflow_stack_ptr
str sp, [ip, #-4]! @ Preserve original SP value
mov sp, ip @ Switch to overflow stack