diff options
-rw-r--r-- | arch/powerpc/cpu/ppc4xx/start.S | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/arch/powerpc/cpu/ppc4xx/start.S b/arch/powerpc/cpu/ppc4xx/start.S index 5647d712d6..7633abc1a1 100644 --- a/arch/powerpc/cpu/ppc4xx/start.S +++ b/arch/powerpc/cpu/ppc4xx/start.S @@ -743,8 +743,16 @@ _start: /*----------------------------------------------------------------*/ /* Setup the stack in internal SRAM */ /*----------------------------------------------------------------*/ - lis r1,CONFIG_SYS_INIT_RAM_ADDR@h - ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET@l + lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h + ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l + /* + * Reserve space for globals and store address for initialization + * with board_init_f_init_reserve() in r14 + */ + mr r3, r1 + bl board_init_f_alloc_reserve + mr r1, r3 + mr r14, r3 li r0,0 stwu r0,-4(r1) stwu r0,-4(r1) /* Terminate call chain */ @@ -760,13 +768,9 @@ _start: #endif bl cpu_init_f /* run low-level CPU init code (from Flash) */ - mr r3, r1 - bl board_init_f_alloc_reserve - mr r1, r3 + /* address for globals was stored in r14 */ + mr r3, r14 bl board_init_f_init_reserve - li r0,0 - stwu r0, -4(r1) - stwu r0, -4(r1) li r3, 0 bl board_init_f /* NOTREACHED - board_init_f() does not return */ @@ -831,8 +835,16 @@ _start: * for their primordial stack, setup stack here directly after the * SDRAM is initialized in ext_bus_cntlr_init. */ - lis r1, CONFIG_SYS_INIT_RAM_ADDR@h - ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET /* set up the stack in SDRAM */ + lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h + ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l + /* + * Reserve space for globals and store address for initialization + * with board_init_f_init_reserve() in r14 + */ + mr r3, r1 + bl board_init_f_alloc_reserve + mr r1, r3 + mr r14, r3 li r0, 0 /* Make room for stack frame header and */ stwu r0, -4(r1) /* clear final stack frame so that */ @@ -972,8 +984,16 @@ _start: * Load the initial stack pointer and data area and convert the size, * in bytes, to the number of words to initialize to a known value. */ - lis r1, CONFIG_SYS_INIT_RAM_ADDR@h - ori r1, r1, CONFIG_SYS_INIT_SP_OFFSET@l + lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h + ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l + /* + * Reserve space for globals and store address for initialization + * with board_init_f_init_reserve() in r14 + */ + mr r3, r1 + bl board_init_f_alloc_reserve + mr r1, r3 + mr r14, r3 lis r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@h ori r4, r4, (CONFIG_SYS_INIT_RAM_SIZE >> 2)@l @@ -993,6 +1013,7 @@ _start: * Make room for stack frame header and clear final stack frame so * that stack backtraces terminate cleanly. */ + li r0, 0 stwu r0, -4(r1) stwu r0, -4(r1) @@ -1011,10 +1032,16 @@ _start: /* * Stack in OCM. */ - - /* Set up Stack at top of OCM */ - lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@h - ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)@l + lis r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@h + ori r1, r1, (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)@l + /* + * Reserve space for globals and store address for initialization + * with board_init_f_init_reserve() in r14 + */ + mr r3, r1 + bl board_init_f_alloc_reserve + mr r1, r3 + mr r14, r3 /* Set up a zeroized stack frame so that backtrace works right */ li r0, 0 @@ -1035,12 +1062,9 @@ _start: GET_GOT /* initialize GOT access */ bl cpu_init_f /* run low-level CPU init code (from Flash) */ - mr r3, r1 - bl board_init_f_alloc_reserve - mr r1, r3 + /* address for globals was stored in r14 */ + mr r3, r14 bl board_init_f_init_reserve - stwu r0, -4(r1) - stwu r0, -4(r1) li r3, 0 bl board_init_f /* run first part of init code (from Flash) */ /* NOTREACHED - board_init_f() does not return */ |