i386: Final Relocation
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
This commit is contained in:
committed by
Wolfgang Denk
parent
cabe579480
commit
1c409bc710
@@ -37,7 +37,7 @@
|
||||
#include <command.h>
|
||||
#include <asm/interrupt.h>
|
||||
|
||||
int cpu_init(void)
|
||||
int cpu_init_f(void)
|
||||
{
|
||||
/* initialize FPU, reset EM, set MP and NE */
|
||||
asm ("fninit\n" \
|
||||
@@ -46,9 +46,13 @@ int cpu_init(void)
|
||||
"orl $0x22, %eax\n" \
|
||||
"movl %eax, %cr0\n" );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cpu_init_r(void)
|
||||
{
|
||||
/* Initialize core interrupt and exception functionality of CPU */
|
||||
cpu_init_interrupts ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,8 +63,8 @@ static inline void load_idt(const struct desc_ptr *dtr)
|
||||
|
||||
void set_vector(u8 intnum, void *routine)
|
||||
{
|
||||
idt[intnum].base_high = (u16)((u32)(routine + gd->reloc_off) >> 16);
|
||||
idt[intnum].base_low = (u16)((u32)(routine + gd->reloc_off) & 0xffff);
|
||||
idt[intnum].base_high = (u16)((u32)(routine) >> 16);
|
||||
idt[intnum].base_low = (u16)((u32)(routine) & 0xffff);
|
||||
}
|
||||
|
||||
void irq_0(void);
|
||||
|
||||
130
cpu/i386/start.S
130
cpu/i386/start.S
@@ -63,11 +63,8 @@ early_board_init_ret:
|
||||
jmp mem_init
|
||||
mem_init_ret:
|
||||
|
||||
/* check ammount of configured memory
|
||||
* (we need atleast bss start+bss size+stack size) */
|
||||
movl $_i386boot_bss_start, %ecx /* BSS start */
|
||||
addl $_i386boot_bss_size, %ecx /* BSS size */
|
||||
addl $CONFIG_SYS_STACK_SIZE, %ecx
|
||||
/* Check we have enough memory for stack */
|
||||
movl $CONFIG_SYS_STACK_SIZE, %ecx
|
||||
cmpl %ecx, %eax
|
||||
jae mem_ok
|
||||
|
||||
@@ -78,6 +75,8 @@ mem_init_ret:
|
||||
.progress0a:
|
||||
jmp die
|
||||
mem_ok:
|
||||
/* Set stack pointer to upper memory limit*/
|
||||
movl %eax, %esp
|
||||
|
||||
/* indicate progress */
|
||||
movw $0x02, %ax
|
||||
@@ -85,12 +84,7 @@ mem_ok:
|
||||
jmp show_boot_progress_asm
|
||||
.progress1:
|
||||
|
||||
/* create a stack after the bss */
|
||||
movl $_i386boot_bss_start, %eax
|
||||
addl $_i386boot_bss_size, %eax
|
||||
addl $CONFIG_SYS_STACK_SIZE, %eax
|
||||
movl %eax, %esp
|
||||
|
||||
/* Test the stack */
|
||||
pushl $0
|
||||
popl %eax
|
||||
cmpl $0, %eax
|
||||
@@ -116,115 +110,19 @@ stack_ok:
|
||||
jmp show_boot_progress_asm
|
||||
.progress2:
|
||||
|
||||
/* copy data section to ram, size must be 4-byte aligned */
|
||||
movl $_i386boot_romdata_dest, %edi /* destination address */
|
||||
movl $_i386boot_romdata_start, %esi /* source address */
|
||||
movl $_i386boot_romdata_size, %ecx /* number of bytes to copy */
|
||||
movl %ecx, %eax
|
||||
andl $3, %eax
|
||||
jnz data_fail
|
||||
|
||||
shrl $2, %ecx /* copy 4 byte each time */
|
||||
cld
|
||||
cmpl $0, %ecx
|
||||
je data_ok
|
||||
data_segment:
|
||||
movsl
|
||||
loop data_segment
|
||||
jmp data_ok
|
||||
data_fail:
|
||||
/* indicate (lack of) progress */
|
||||
movw $0x83, %ax
|
||||
movl $.progress2a, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress2a:
|
||||
jmp die
|
||||
|
||||
data_ok:
|
||||
|
||||
/* indicate progress */
|
||||
movw $0x04, %ax
|
||||
movl $.progress3, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress3:
|
||||
|
||||
/* clear bss section in ram, size must be 4-byte aligned */
|
||||
movl $_i386boot_bss_start, %edi /* MK_CHG BSS start */
|
||||
movl $_i386boot_bss_size, %ecx /* BSS size */
|
||||
movl %ecx, %eax
|
||||
andl $3, %eax
|
||||
jnz bss_fail
|
||||
shrl $2, %ecx /* clear 4 byte each time */
|
||||
cld
|
||||
cmpl $0, %ecx
|
||||
je bss_ok
|
||||
bss:
|
||||
movl $0, (%edi)
|
||||
add $4, %edi
|
||||
loop bss
|
||||
jmp bss_ok
|
||||
|
||||
bss_fail:
|
||||
/* indicate (lack of) progress */
|
||||
movw $0x84, %ax
|
||||
movl $.progress3a, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress3a:
|
||||
jmp die
|
||||
|
||||
bss_ok:
|
||||
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
|
||||
/* indicate progress */
|
||||
movw $0x06, %ax
|
||||
movl $.progress6, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress6:
|
||||
|
||||
/* copy text section to ram, size must be 4-byte aligned */
|
||||
movl $CONFIG_SYS_BL_START_RAM, %edi /* destination address */
|
||||
movl $TEXT_BASE, %esi /* source address */
|
||||
movl $_i386boot_text_size, %ecx /* number of bytes to copy */
|
||||
movl %ecx, %eax
|
||||
andl $3, %eax
|
||||
jz text_copy /* Already 4-byte aligned */
|
||||
subl $4, %eax /* Add extra bytes to size */
|
||||
addl %eax, %ecx
|
||||
text_copy:
|
||||
shrl $2, %ecx /* copy 4 byte each time */
|
||||
cld
|
||||
cmpl $0, %ecx
|
||||
je text_ok
|
||||
text_segment:
|
||||
movsl
|
||||
loop text_segment
|
||||
jmp text_ok
|
||||
text_fail:
|
||||
/* indicate (lack of) progress */
|
||||
movw $0x86, %ax
|
||||
movl $.progress5a, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress5a:
|
||||
jmp die
|
||||
|
||||
text_ok:
|
||||
#endif
|
||||
wbinvd
|
||||
|
||||
/* Get upper memory limit */
|
||||
movl %esp, %ecx
|
||||
subl $CONFIG_SYS_STACK_SIZE, %ecx
|
||||
|
||||
/* indicate progress */
|
||||
movw $0x05, %ax
|
||||
movl $.progress4, %ebp
|
||||
jmp show_boot_progress_asm
|
||||
.progress4:
|
||||
/* Create a Stack Frame */
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
|
||||
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
|
||||
/* Jump to the RAM copy of start_i386boot */
|
||||
movl $start_i386boot, %ebp
|
||||
addl $(CONFIG_SYS_BL_START_RAM - TEXT_BASE), %ebp
|
||||
call *%ebp /* Enter, U-boot! */
|
||||
#else
|
||||
call start_i386boot /* Enter, U-boot! */
|
||||
#endif
|
||||
/* stack_limit parameter */
|
||||
pushl %ecx
|
||||
call board_init_f /* Enter, U-boot! */
|
||||
|
||||
/* indicate (lack of) progress */
|
||||
movw $0x85, %ax
|
||||
|
||||
Reference in New Issue
Block a user