Commit 499b2ea1 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

[ARM] 3103/1: ARM EABI: stack pointer must be 64-bit aligned (part 2)

Patch from Nicolas Pitre

We must make sure that assembly code that modifies the stack pointer
before calling a C function does it so it remains 64-bit aligned.
Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 2dede2d8
...@@ -177,41 +177,42 @@ int __down_trylock(struct semaphore * sem) ...@@ -177,41 +177,42 @@ int __down_trylock(struct semaphore * sem)
* ip contains the semaphore pointer on entry. Save the C-clobbered * ip contains the semaphore pointer on entry. Save the C-clobbered
* registers (r0 to r3 and lr), but not ip, as we use it as a return * registers (r0 to r3 and lr), but not ip, as we use it as a return
* value in some cases.. * value in some cases..
* To remain AAPCS compliant (64-bit stack align) we save r4 as well.
*/ */
asm(" .section .sched.text,\"ax\",%progbits \n\ asm(" .section .sched.text,\"ax\",%progbits \n\
.align 5 \n\ .align 5 \n\
.globl __down_failed \n\ .globl __down_failed \n\
__down_failed: \n\ __down_failed: \n\
stmfd sp!, {r0 - r3, lr} \n\ stmfd sp!, {r0 - r4, lr} \n\
mov r0, ip \n\ mov r0, ip \n\
bl __down \n\ bl __down \n\
ldmfd sp!, {r0 - r3, pc} \n\ ldmfd sp!, {r0 - r4, pc} \n\
\n\ \n\
.align 5 \n\ .align 5 \n\
.globl __down_interruptible_failed \n\ .globl __down_interruptible_failed \n\
__down_interruptible_failed: \n\ __down_interruptible_failed: \n\
stmfd sp!, {r0 - r3, lr} \n\ stmfd sp!, {r0 - r4, lr} \n\
mov r0, ip \n\ mov r0, ip \n\
bl __down_interruptible \n\ bl __down_interruptible \n\
mov ip, r0 \n\ mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc} \n\ ldmfd sp!, {r0 - r4, pc} \n\
\n\ \n\
.align 5 \n\ .align 5 \n\
.globl __down_trylock_failed \n\ .globl __down_trylock_failed \n\
__down_trylock_failed: \n\ __down_trylock_failed: \n\
stmfd sp!, {r0 - r3, lr} \n\ stmfd sp!, {r0 - r4, lr} \n\
mov r0, ip \n\ mov r0, ip \n\
bl __down_trylock \n\ bl __down_trylock \n\
mov ip, r0 \n\ mov ip, r0 \n\
ldmfd sp!, {r0 - r3, pc} \n\ ldmfd sp!, {r0 - r4, pc} \n\
\n\ \n\
.align 5 \n\ .align 5 \n\
.globl __up_wakeup \n\ .globl __up_wakeup \n\
__up_wakeup: \n\ __up_wakeup: \n\
stmfd sp!, {r0 - r3, lr} \n\ stmfd sp!, {r0 - r4, lr} \n\
mov r0, ip \n\ mov r0, ip \n\
bl __up \n\ bl __up \n\
ldmfd sp!, {r0 - r3, pc} \n\ ldmfd sp!, {r0 - r4, pc} \n\
"); ");
EXPORT_SYMBOL(__down_failed); EXPORT_SYMBOL(__down_failed);
......
...@@ -306,9 +306,9 @@ ENTRY(__modsi3) ...@@ -306,9 +306,9 @@ ENTRY(__modsi3)
Ldiv0: Ldiv0:
str lr, [sp, #-4]! str lr, [sp, #-8]!
bl __div0 bl __div0
mov r0, #0 @ About as wrong as it could be. mov r0, #0 @ About as wrong as it could be.
ldr pc, [sp], #4 ldr pc, [sp], #8
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment