Currently, a 64-bit little-endian zImage.epapr won't boot in epapr mode,
as 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 corrupt the saved link
register:

 0000000020c06018 l     O .bss   0000000000001000 _bss_stack
 0000000020c07018 l     O .bss   0000000000000008 fdt

This change allocates the minimum of 32 bytes for the base of the stack
instead.

Signed-off-by: Jeremy Kerr <j...@ozlabs.org>

---
 arch/powerpc/boot/crt0.S |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 14de4f8..bf8eeee 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 */
        beq     6f
        ld      r1,0(r8)
        li      r0,0
-       stdu    r0,-16(r1)      /* establish a stack frame */
+       stdu    r0,-32(r1)      /* establish a stack frame */
 6:
 #endif  /* __powerpc64__ */
        /* Call platform_init() */
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to