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

Reply via email to