powerpc/boot: Fix stack corruption in epapr entry point
authorJeremy Kerr <jk@ozlabs.org>
Wed, 11 Feb 2015 04:55:44 +0000 (12:55 +0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 16 Mar 2015 07:58:34 +0000 (18:58 +1100)
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>
arch/powerpc/boot/crt0.S

index 14de4f8778a7fa36ff1e0bfb1b49641913ee05a8..e0040621d00c54033d7061beedd8ea57abdf0f97 100644 (file)
@@ -218,7 +218,7 @@ p_base:     mflr    r10             /* r10 now points to runtime addr of p_base */
        beq     6f
        ld      r1,0(r8)
        li      r0,0
-       stdu    r0,-16(r1)      /* establish a stack frame */
+       stdu    r0,-112(r1)     /* establish a stack frame */
 6:
 #endif  /* __powerpc64__ */
        /* Call platform_init() */