aboutsummaryrefslogtreecommitdiff
path: root/arch/i386/cpu/start.S
diff options
context:
space:
mode:
authorGraeme Russ <graeme.russ@gmail.com>2011-02-12 15:11:58 +1100
committerGraeme Russ <graeme.russ@gmail.com>2011-02-12 15:11:58 +1100
commitfb0029088e5b9d3f31870715ad23dda4a2c6e7f3 (patch)
tree9294628815df86aae20900995e2d4b1aec0725e4 /arch/i386/cpu/start.S
parent96cd66426a6a615373f7f33fb2a8b7ee3925b1cf (diff)
x86: Defer setup of final stack
Diffstat (limited to 'arch/i386/cpu/start.S')
-rw-r--r--arch/i386/cpu/start.S44
1 files changed, 29 insertions, 15 deletions
diff --git a/arch/i386/cpu/start.S b/arch/i386/cpu/start.S
index 95be5a2f9..77f03322b 100644
--- a/arch/i386/cpu/start.S
+++ b/arch/i386/cpu/start.S
@@ -96,21 +96,6 @@ car_init_ret:
/* size memory */
call dram_init_f
- /* Setup stack in SDRAM */
- movl (GD_RAM_SIZE * 4)(%ebp), %esp
-
- /* Test the stack */
- pushl $0
- popl %ecx
- cmpl $0, %ecx
- jne die
- push $0x55aa55aa
- popl %ecx
- cmpl $0x55aa55aa, %ecx
- jne die
-
- wbinvd
-
/* Set parameter to board_init_f() to boot flags */
movl (GD_FLAGS * 4)(%ebp), %eax
@@ -118,6 +103,35 @@ car_init_ret:
/* indicate (lack of) progress */
movw $0x85, %ax
+ jmp die
+
+.globl relocate_code
+.type relocate_code, @function
+relocate_code:
+ /*
+ * SDRAM has been initialised, U-Boot code has been copied into
+ * RAM, BSS has been cleared and relocation adjustments have been
+ * made. It is now time to jump into the in-RAM copy of U-Boot
+ *
+ * %eax = Address of top of stack
+ * %edx = Address of Global Data
+ * %ecx = Base address of in-RAM copy of U-Boot
+ */
+
+ /* Setup stack in RAM */
+ movl %eax, %esp
+
+ /* Setup call address of in-RAM copy of board_init_r() */
+ movl $board_init_r, %ebp
+ subl (GD_RELOC_OFF * 4)(%edx), %ebp
+
+ /* Setup parameters to board_init_r() */
+ movl %edx, %eax
+ movl %ecx, %edx
+
+ /* Jump to in-RAM copy of board_init_r() */
+ call *%ebp
+
die: hlt
jmp die
hlt