summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
authorArd Biesheuvel <ardb@kernel.org>2021-12-02 09:36:59 +0100
committerArd Biesheuvel <ardb@kernel.org>2021-12-06 12:49:17 +0100
commitcafc0eab168917ec9c0cd47d530a40cd40eb2928 (patch)
tree92146e58caa9f383a8a6894aeeaa54bb1c563f7f /arch/arm/kernel
parentARM: implement THREAD_INFO_IN_TASK for uniprocessor systems (diff)
downloadlinux-cafc0eab168917ec9c0cd47d530a40cd40eb2928.tar.xz
linux-cafc0eab168917ec9c0cd47d530a40cd40eb2928.zip
ARM: v7m: enable support for IRQ stacks
Enable support for IRQ stacks on !MMU, and add the code to the IRQ entry path to switch to the IRQ stack if not running from it already. 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')
-rw-r--r--arch/arm/kernel/entry-v7m.S17
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
index 4e0d318b67c6..de8a60363c85 100644
--- a/arch/arm/kernel/entry-v7m.S
+++ b/arch/arm/kernel/entry-v7m.S
@@ -40,11 +40,24 @@ __irq_entry:
@ Invoke the IRQ handler
@
mov r0, sp
- stmdb sp!, {lr}
+ ldr_this_cpu sp, irq_stack_ptr, r1, r2
+
+ @
+ @ If we took the interrupt while running in the kernel, we may already
+ @ be using the IRQ stack, so revert to the original value in that case.
+ @
+ subs r2, sp, r0 @ SP above bottom of IRQ stack?
+ rsbscs r2, r2, #THREAD_SIZE @ ... and below the top?
+ movcs sp, r0
+
+ push {r0, lr} @ preserve LR and original SP
+
@ routine called with r0 = struct pt_regs *
bl generic_handle_arch_irq
- pop {lr}
+ pop {r0, lr}
+ mov sp, r0
+
@
@ Check for any pending work if returning to user
@