FVP: Fix AArch32 stack functions to be ABI-compliant
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>
Thu, 20 Jul 2017 15:42:50 +0000 (16:42 +0100)
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>
Tue, 1 Aug 2017 13:33:47 +0000 (14:33 +0100)
plat_get_my_stack is called from C, so it can't expect argument
registers to be preserved. Stash registers temporarily onto the stack
instead.

plat_set_my_stack is called during early init, when there exists no
stack. Use any register other than argument registers to stash temporary
values.

Change-Id: I98052e20671d0933201d45ec7a5affccd71ce08c
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
plat/common/aarch32/platform_mp_stack.S

index e43047e551979037693fa1496f1213d0e7de244d..6c3d08de359dcbd53a042e478603d136ef743f56 100644 (file)
@@ -19,9 +19,9 @@
         * -----------------------------------------------------
         */
 func plat_get_my_stack
-       mov     r3, lr
+       push    {r4, lr}
        get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
-       bx      r3
+       pop     {r4, pc}
 endfunc        plat_get_my_stack
 
        /* -----------------------------------------------------
@@ -32,10 +32,10 @@ endfunc     plat_get_my_stack
         * -----------------------------------------------------
         */
 func plat_set_my_stack
-       mov     r3, lr
+       mov     r4, lr
        get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
        mov     sp, r0
-       bx      r3
+       bx      r4
 endfunc plat_set_my_stack
 
        /* -----------------------------------------------------