Added relocation code Removed temporary testing code
Signed-off-by: Graeme Russ <[EMAIL PROTECTED]> -- diff --git a/board/eNET/eNET.c b/board/eNET/eNET.c index 1b4af58..5355fb6 100644 --- a/board/eNET/eNET.c +++ b/board/eNET/eNET.c @@ -45,40 +45,6 @@ DECLARE_GLOBAL_DATA_PTR; #define PRINTF(fmt,args...) #endif - -extern int do_autoscript (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_bdinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -/* extern int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); */ -extern int do_coninfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_itest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_md (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_mm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_nm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_mw (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_cp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_base (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_sleep (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_setenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_imgextract (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern int do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); - - void hw_watchdog_reset(void) { u16 wd_state; @@ -95,8 +61,6 @@ void hw_watchdog_reset(void) } } -/* ------------------------------------------------------------------------- */ - void init_sc520_enet (void) { @@ -595,44 +559,6 @@ int last_stage_init(void) major = minor = 0; printf("Serck Controls eNET\n"); - printf("last_stage_init() at %08lx\n", (ulong)last_stage_init); - - printf("autoscript => do_autoscript() @ 0x%08lx\n", (ulong)do_autoscript); - printf("bdinfo => do_bdinfo() @ 0x%08lx\n", (ulong)do_bdinfo); - printf("go => do_go() @ 0x%08lx\n", (ulong)do_go); - printf("reset => do_reset() @ 0x%08lx\n", (ulong)do_reset); - printf("bootm => do_bootm() @ 0x%08lx\n", (ulong)do_bootm); - printf("boot => do_bootd() @ 0x%08lx\n", (ulong)do_bootd); - printf("bootd => do_bootd() @ 0x%08lx\n", (ulong)do_bootd); - printf("iminfo => do_iminfo() @ 0x%08lx\n", (ulong)do_iminfo); -/* printf("imls => do_imls() @ 0x%08lx\n", (ulong)do_imls); */ - printf("imls => do_imls() @ <undefined>\n"); - printf("coninfo => do_coninfo() @ 0x%08lx\n", (ulong)do_coninfo); - printf("itest => do_itest() @ 0x%08lx\n", (ulong)do_itest); - printf("loads => do_load_serial() @ 0x%08lx\n", (ulong)do_load_serial); - printf("loadb => do_load_serial_bin() @ 0x%08lx\n", (ulong)do_load_serial_bin); - printf("loady => do_load_serial_bin() @ 0x%08lx\n", (ulong)do_load_serial_bin); - printf("md => do_mem_md() @ 0x%08lx\n", (ulong)do_mem_md); - printf("mm => do_mem_mm() @ 0x%08lx\n", (ulong)do_mem_mm); - printf("nm => do_mem_nm() @ 0x%08lx\n", (ulong)do_mem_nm); - printf("mw => do_mem_mw() @ 0x%08lx\n", (ulong)do_mem_mw); - printf("cp => do_mem_cp() @ 0x%08lx\n", (ulong)do_mem_cp); - printf("cmp => do_mem_cmp() @ 0x%08lx\n", (ulong)do_mem_cmp); - printf("crc32 => do_mem_crc() @ 0x%08lx\n", (ulong)do_mem_crc); - printf("base => do_mem_base() @ 0x%08lx\n", (ulong)do_mem_base); - printf("loop => do_mem_loop() @ 0x%08lx\n", (ulong)do_mem_loop); - printf("mtest => do_mem_mtest() @ 0x%08lx\n", (ulong)do_mem_mtest); - printf("sleep => do_sleep() @ 0x%08lx\n", (ulong)do_sleep); - printf("printenv => do_printenv() @ 0x%08lx\n", (ulong)do_printenv); - printf("setenv => do_setenv() @ 0x%08lx\n", (ulong)do_setenv); - printf("saveenv => do_saveenv() @ 0x%08lx\n", (ulong)do_saveenv); - printf("run => do_run() @ 0x%08lx\n", (ulong)do_run); - printf("imxtract => do_imgextract() @ 0x%08lx\n", (ulong)do_imgextract); - printf("version => do_version() @ 0x%08lx\n", (ulong)do_version); - printf("echo => do_echo() @ 0x%08lx\n", (ulong)do_echo); - printf("help => do_help() @ 0x%08lx\n", (ulong)do_help); - printf("? => do_help() @ 0x%08lx\n", (ulong)do_help); - return 0; } diff --git a/cpu/i386/start.S b/cpu/i386/start.S index 84888aa..6330dd8 100644 --- a/cpu/i386/start.S +++ b/cpu/i386/start.S @@ -174,8 +174,41 @@ bss_fail: bss_ok: - wbinvd + /* 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 $CFG_RELOC_ADDR, %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: + + wbinvd /* indicate progress */ movw $0x05, %ax @@ -183,7 +216,10 @@ bss_ok: jmp show_boot_progress_asm .progress4: - call start_i386boot /* Enter, U-boot! */ + /* Jump to the RAM copy of start_i386boot */ + movl $start_i386boot, %ebp + addl $(CFG_RELOC_ADDR - TEXT_BASE), %ebp + call *%ebp /* Enter, U-boot! */ /* indicate (lack of) progress */ movw $0x85, %ax diff --git a/examples/82559_eeprom.c b/examples/82559_eeprom.c index 047d3aa..5e2eee9 100644 --- a/examples/82559_eeprom.c +++ b/examples/82559_eeprom.c @@ -19,7 +19,6 @@ */ #define _PPC_STRING_H_ /* avoid unnecessary str/mem functions */ -/* #define _LINUX_STRING_H_ */ /* avoid unnecessary str/mem functions */ #include <common.h> #include <exports.h> diff --git a/lib_i386/board.c b/lib_i386/board.c index f3da0a2..b7ab1a7 100644 --- a/lib_i386/board.c +++ b/lib_i386/board.c @@ -57,7 +57,7 @@ extern long _i386boot_bios_size; * which is somewhat inconveient ... */ ulong i386boot_start = (ulong)&_i386boot_start; /* code start (in flash) defined in start.S */ ulong i386boot_end = (ulong)&_i386boot_end; /* code end (in flash) */ -ulong i386boot_romdata_start = (ulong)&_i386boot_romdata_start; /* datasegment in flash (also code+rodata end) */ +ulong i386boot_romdata_start = (ulong)&_i386boot_romdata_start; /* data segment in flash (also code+rodata end) */ ulong i386boot_romdata_dest = (ulong)&_i386boot_romdata_dest; /* data location segment in ram */ ulong i386boot_romdata_size = (ulong)&_i386boot_romdata_size; /* size of data segment */ ulong i386boot_bss_start = (ulong)&_i386boot_bss_start; /* bss start */ @@ -139,7 +139,6 @@ static int display_banner (void) i386boot_bss_start+i386boot_bss_size, i386boot_bss_start+i386boot_bss_size+CFG_STACK_SIZE-1); - return (0); } @@ -163,13 +162,13 @@ static int display_dram_config (void) return (0); } - +#if 0 static void display_flash_config (ulong size) { puts ("Flash: "); print_size (size, "\n"); } - +#endif /* * Breath some life into the board... @@ -217,9 +216,9 @@ gd_t *gd; void start_i386boot (void) { + cmd_tbl_t *cmdtp; char *s; int i; - ulong size; static gd_t gd_data; static bd_t bd_data; init_fnc_t **init_fnc_ptr; @@ -246,18 +245,42 @@ void start_i386boot (void) } show_boot_progress(0x23); + gd->reloc_off = CFG_RELOC_ADDR - TEXT_BASE; + + for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) { + ulong addr; + addr = (ulong) (cmdtp->cmd) + gd->reloc_off; + cmdtp->cmd = + (int (*)(struct cmd_tbl_s *, int, int, char *[]))addr; + + addr = (ulong)(cmdtp->name) + gd->reloc_off; + cmdtp->name = (char *)addr; + + if (cmdtp->usage) { + addr = (ulong)(cmdtp->usage) + gd->reloc_off; + cmdtp->usage = (char *)addr; + } +#ifdef CFG_LONGHELP + if (cmdtp->help) { + addr = (ulong)(cmdtp->help) + gd->reloc_off; + cmdtp->help = (char *)addr; + } +#endif + } + +#if 0 /* configure available FLASH banks */ size = flash_init(); display_flash_config(size); show_boot_progress(0x24); - +#endif show_boot_progress(0x25); /* initialize environment */ env_relocate (); show_boot_progress(0x26); - +#if 0 /* IP Address */ bd_data.bi_ip_addr = getenv_IPaddr ("ipaddr"); @@ -277,6 +300,7 @@ void start_i386boot (void) s = (*e) ? e + 1 : e; } } +#endif #if defined(CONFIG_PCI) /* _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot