diff options
Diffstat (limited to 'arch/x86/cpu/start.S')
| -rw-r--r-- | arch/x86/cpu/start.S | 77 | 
1 files changed, 69 insertions, 8 deletions
| diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S index ee0dabe4b..e960e21f6 100644 --- a/arch/x86/cpu/start.S +++ b/arch/x86/cpu/start.S @@ -55,8 +55,16 @@ _x86boot_start:  	movl	%eax, %cr0  	wbinvd +	/* Tell 32-bit code it is being entered from an in-RAM copy */ +	movw	$GD_FLG_WARM_BOOT, %bx +	jmp	1f  _start: -	/* This is the 32-bit cold-reset entry point */ +	/* +	 * This is the 32-bit cold-reset entry point. Initialize %bx to 0 +	 * in case we're preceeded by some sort of boot stub. +	 */ +	movw	$GD_FLG_COLD_BOOT, %bx +1:  	/* Load the segement registes to match the gdt loaded in start16.S */  	movl	$(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax @@ -83,13 +91,33 @@ car_init_ret:  	 * or fully initialised SDRAM - we really don't care which)  	 * starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack  	 */ -	movl	$CONFIG_SYS_INIT_SP_ADDR, %esp -	/* Initialise the Global Data Pointer */ -	movl	$CONFIG_SYS_INIT_GD_ADDR, %eax -	movl	%eax, %edx -	addl	$GENERATED_GBL_DATA_SIZE, %edx -	call	init_gd; +	/* Stack grows down from top of CAR */ +	movl	$(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE), %esp + +	/* Reserve space on stack for global data */ +	subl	$GENERATED_GBL_DATA_SIZE, %esp + +	/* Align global data to 16-byte boundary */ +	andl	$0xfffffff0, %esp + +	/* Setup first parameter to setup_gdt */ +	movl	%esp, %eax + +	/* Reserve space for global descriptor table */ +	subl	$X86_GDT_SIZE, %esp + +	/* Align temporary global descriptor table to 16-byte boundary */ +	andl	$0xfffffff0, %esp + +	/* Set second parameter to setup_gdt */ +	movl	%esp, %edx + +	/* gd->gd_addr = gd (Required to allow gd->xyz to work) */ +	movl	%eax, (%eax) + +	/* Setup global descriptor table so gd->xyz works */ +	call	setup_gdt  	/* Set parameter to board_init_f() to boot flags */  	xorl	%eax, %eax @@ -113,9 +141,42 @@ board_init_f_r_trampoline:  	 * %eax = Address of top of new stack  	 */ -	/* Setup stack in RAM */ +	/* Stack grows down from top of SDRAM */  	movl	%eax, %esp +	/* Reserve space on stack for global data */ +	subl	$GENERATED_GBL_DATA_SIZE, %esp + +	/* Align global data to 16-byte boundary */ +	andl	$0xfffffff0, %esp + +	/* Setup first parameter to memcpy (and setup_gdt) */ +	movl	%esp, %eax + +	/* Setup second parameter to memcpy */ +	fs movl 0, %edx + +	/* Set third parameter to memcpy */ +	movl	$GENERATED_GBL_DATA_SIZE, %ecx + +	/* Copy global data from CAR to SDRAM stack */ +	call	memcpy + +	/* Reserve space for global descriptor table */ +	subl	$X86_GDT_SIZE, %esp + +	/* Align global descriptor table to 16-byte boundary */ +	andl	$0xfffffff0, %esp + +	/* Set second parameter to setup_gdt */ +	movl	%esp, %edx + +	/* gd->gd_addr = gd (Required to allow gd->xyz to work) */ +	movl	%eax, (%eax) + +	/* Setup global descriptor table so gd->xyz works */ +	call	setup_gdt +  	/* Re-enter U-Boot by calling board_init_f_r */  	call	board_init_f_r |