ARM: Thumb-2: Fix exception return sequence to restore stack correctly
authorJon Medhurst <tixy@yxit.co.uk>
Fri, 18 Mar 2011 17:32:44 +0000 (17:32 +0000)
committerTixy <tixy@medhuaa1.miniserver.com>
Wed, 13 Jul 2011 17:32:40 +0000 (17:32 +0000)
The implementation of svc_exit didn't take into account any stack hole
created by svc_entry; as happens with the undef handler when kprobes are
configured. The fix is to read the saved value of SP rather than trying
to calculate it.

Signed-off-by: Jon Medhurst <tixy@yxit.co.uk>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
arch/arm/kernel/entry-header.S

index 051166c2a932cfed1620bb3a5612383ffff12149..83e29adced6c2ee75aa74489ffacfa3cbe33bb1c 100644 (file)
        .endm
 #else  /* CONFIG_THUMB2_KERNEL */
        .macro  svc_exit, rpsr
+       ldr     lr, [sp, #S_SP]                 @ top of the stack
+       ldrd    r0, r1, [sp, #S_LR]             @ calling lr and pc
        clrex                                   @ clear the exclusive monitor
-       ldr     r0, [sp, #S_SP]                 @ top of the stack
-       ldr     r1, [sp, #S_PC]                 @ return address
-       tst     r0, #4                          @ orig stack 8-byte aligned?
-       stmdb   r0, {r1, \rpsr}                 @ rfe context
+       stmdb   lr!, {r0, r1, \rpsr}            @ calling lr and rfe context
        ldmia   sp, {r0 - r12}
-       ldr     lr, [sp, #S_LR]
-       addeq   sp, sp, #S_FRAME_SIZE - 8       @ aligned
-       addne   sp, sp, #S_FRAME_SIZE - 4       @ not aligned
+       mov     sp, lr
+       ldr     lr, [sp], #4
        rfeia   sp!
        .endm