New i386 board (includes code relocation)
RFC PATCH 3/3 New i386 board (includes code relocation)
Added relocation code
Removed temporary testing code
Signed-off-by Graeme Russ <[email protected]>
--
board/eNET/eNET.c +0 -74
@@ -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 ; }
cpu/i386/start.S +38 -2
@@ -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
examples/82559_eeprom.c +0 -1
@@ -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>
lib_i386/board.c +31 -7
@@ -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 )/*