aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2015-02-10 23:55:44 -0500
committerMichael Ellerman <mpe@ellerman.id.au>2015-03-16 03:58:34 -0400
commit8c06f0d910ca628b657dc964a7347e70070dc7d6 (patch)
tree2451a65aefa45403940a4aab08a750c2007ab009 /arch
parent90d1d44e0de0ec833634667bc1827303b2e1645e (diff)
powerpc/boot: Fix stack corruption in epapr entry point
Currently, a 64-bit little-endian zImage.epapr won't boot in epapr mode, as we never return from platform_init. Before entering C, we initialise our stack by setting r1 16 bytes below the end of the _bss_stack: stwu r0,-16(r1) /* establish a stack frame */ However, the called function will save the caller's lr in the caller's frame's lr save area, at -16(r1) to -32(r1). This means that writes to the fdt variable will corrupt the saved link register: 0000000020c06018 l O .bss 0000000000001000 _bss_stack 0000000020c07018 l O .bss 0000000000000008 fdt We'll need at least 32 bytes in the initial stack frame, to handle the LR save area. We bump this to 112 bytes, as that'll be the max required by ABIv1. Thanks to Alistair Popple for debugging help. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/boot/crt0.S2
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 14de4f8778a7..e0040621d00c 100644
--- a/arch/powerpc/boot/crt0.S
+++ b/arch/powerpc/boot/crt0.S
@@ -218,7 +218,7 @@ p_base: mflr r10 /* r10 now points to runtime addr of p_base */
218 beq 6f 218 beq 6f
219 ld r1,0(r8) 219 ld r1,0(r8)
220 li r0,0 220 li r0,0
221 stdu r0,-16(r1) /* establish a stack frame */ 221 stdu r0,-112(r1) /* establish a stack frame */
2226: 2226:
223#endif /* __powerpc64__ */ 223#endif /* __powerpc64__ */
224 /* Call platform_init() */ 224 /* Call platform_init() */