Hi Graeme >I have the same problem. I am in the process of finalising some other x86 >common code to make the custom board port more seemless before I dig deeper.
>I do, however, feel that a look at the nios code (lib_nios/board.c) might >shed some light on the issue. Specifically the comment in do_go_exec: > >unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[]) > >{ > /* > * x86 does not use a dedicated register to pass the pointer > * to the global_data > */ > argv[-1] = (char *)gd; > return entry (argc, argv); >} >I think the lib_i386 implementation of do_go_exec() is not right I carefully read the codes related to the do_go function, and I find that(u boot 1.1.6): In do_go() functions: #if defined(CONFIG_I386) /* * x86 does not use a dedicated register to pass the pointer * to the global_data */ argv[0] = (char *)gd; #endif But in app_startup function: void app_startup(char **argv) { unsigned long * cp = &__bss_start; /* Zero out BSS */ while (cp < &_end) { *cp++ = 0; } #if defined(CONFIG_I386) /* x86 does not have a dedicated register for passing global_data */ global_data = (gd_t *)argv[-1]; jt = global_data->jt; #endif } The gd is not in the same place :see do_go is argv[0], and app_startup is (gd_t *)argv[-1]. But later I modified the global_data = (gd_t *)argv[-1]; in app_startup function to global_data = (gd_t *)argv[0], the change still does not make sense. Any ideas? Maybe I should change the argv[0] = (char *)gd; in do_go function to argv[-1] = (char *)gd; Thanks Lance Zhang _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot