The ARM64 setup_c function saved the link register (x30) in the caller
save register (x15). This is fragile as a constructor might use x15,
thus save it on the stack just like ARM32 and RISC-V.

Fixes: bb07ef11d6 ("ARM/ARM64/RISC-V: pbl: add constructor support")
Signed-off-by: Stefan Kerkmann <[email protected]>
---
 arch/arm/cpu/setupc_64.S | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/arm/cpu/setupc_64.S b/arch/arm/cpu/setupc_64.S
index e3c6149e27..b1cfea47b1 100644
--- a/arch/arm/cpu/setupc_64.S
+++ b/arch/arm/cpu/setupc_64.S
@@ -10,10 +10,10 @@
  * setup_c: clear bss if not yet done
  */
 ENTRY(setup_c)
+       str x30, [sp, #-16]!
        adr_l   x0, bss_cleared
        ldr     w1, [x0]
        cbnz    w1, 1f                  /* skip if already done */
-       mov     x15, x30
        adr_l   x0, __bss_start
        mov     x1, #0
        adr_l   x2, __bss_stop
@@ -25,8 +25,9 @@ ENTRY(setup_c)
 #ifdef __PBL__
        bl      pbl_do_ctors
 #endif
-       mov     x30, x15
-1:     ret
+1:
+       ldr x30, [sp], #16
+       ret
 ENDPROC(setup_c)
 
 .section .data.bss_cleared

-- 
2.47.3


Reply via email to