diff options
| author | Graeme Russ <graeme.russ@gmail.com> | 2011-02-12 15:11:58 +1100 | 
|---|---|---|
| committer | Graeme Russ <graeme.russ@gmail.com> | 2011-02-12 15:11:58 +1100 | 
| commit | fb0029088e5b9d3f31870715ad23dda4a2c6e7f3 (patch) | |
| tree | 9294628815df86aae20900995e2d4b1aec0725e4 | |
| parent | 96cd66426a6a615373f7f33fb2a8b7ee3925b1cf (diff) | |
| download | olio-uboot-2014.01-fb0029088e5b9d3f31870715ad23dda4a2c6e7f3.tar.xz olio-uboot-2014.01-fb0029088e5b9d3f31870715ad23dda4a2c6e7f3.zip | |
x86: Defer setup of final stack
| -rw-r--r-- | arch/i386/cpu/start.S | 44 | ||||
| -rw-r--r-- | arch/i386/lib/board.c | 6 | 
2 files changed, 33 insertions, 17 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 diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index d71623242..60fa982e3 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -189,6 +189,7 @@ void board_init_f(ulong boot_flags)  	ulong *src_addr;  	ulong *end_addr; +	void *addr_sp;  	void *dest_addr;  	ulong rel_offset;  	Elf32_Rel *re_src; @@ -198,6 +199,7 @@ void board_init_f(ulong boot_flags)  	/* Calculate destination RAM Address and relocation offset */  	dest_addr = (void *)gd->ram_size; +	addr_sp = dest_addr;  	dest_addr -= CONFIG_SYS_STACK_SIZE;  	dest_addr -= (bss_end - text_start);  	rel_offset = text_start - dest_addr; @@ -242,9 +244,9 @@ void board_init_f(ulong boot_flags)  	gd->flags |= GD_FLG_RELOC;  	/* Enter the relocated U-Boot! */ -	(board_init_r - rel_offset)(gd, (ulong)dest_addr); +	relocate_code((ulong)addr_sp, gd, (ulong)dest_addr); -	/* NOTREACHED - board_init_f() does not return */ +	/* NOTREACHED - relocate_code() does not return */  	while(1);  } |