Message ID | 1325477374-6417-6-git-send-email-graeme.russ@gmail.com |
---|---|
State | Superseded |
Headers | show |
Hi Graeme, On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote: > > Signed-off-by: Graeme Russ <graeme.russ@gmail.com> Commit message? > --- > arch/x86/cpu/start.S | 20 +++++--------------- > arch/x86/include/asm/u-boot-x86.h | 2 ++ > arch/x86/lib/board.c | 25 ++++++++++++++++++++++--- > 3 files changed, 29 insertions(+), 18 deletions(-) > > diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S > index 7f9b6a7..9592158 100644 > --- a/arch/x86/cpu/start.S > +++ b/arch/x86/cpu/start.S > @@ -96,32 +96,22 @@ car_init_ret: > movw $0x85, %ax > jmp die > > -.globl relocate_code > -.type relocate_code, @function > -relocate_code: > +.globl board_init_f_r_trampoline > +.type board_init_f_r_trampoline, @function > +board_init_f_r_trampoline: > /* > * SDRAM has been initialised, U-Boot code has been copied into > * RAM, BSS has been cleared and relocation adjustments have been > * made. It is now time to jump into the in-RAM copy of U-Boot > * > * %eax = Address of top of stack *new* top of stack? > - * %edx = Address of Global Data > - * %ecx = Base address of in-RAM copy of U-Boot > */ > > /* Setup stack in RAM */ > movl %eax, %esp > > - /* Setup call address of in-RAM copy of board_init_r() */ > - movl $board_init_r, %ebp > - addl (GENERATED_GD_RELOC_OFF)(%edx), %ebp > - > - /* Setup parameters to board_init_r() */ > - movl %edx, %eax > - movl %ecx, %edx > - > - /* Jump to in-RAM copy of board_init_r() */ > - call *%ebp > + /* Re-enter U-Boot by calling board_init_f_r */ > + call board_init_f_r Isn't this a bit of a funny name? Why not call it something like call_board_init_r() ? > > die: > hlt > diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h > index 755f88a..c3d2277 100644 > --- a/arch/x86/include/asm/u-boot-x86.h > +++ b/arch/x86/include/asm/u-boot-x86.h > @@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size); > int video_bios_init(void); > int video_init(void); > > +void board_init_f_r_trampoline(ulong) __attribute__ ((noreturn)); > +void board_init_f_r(void) __attribute__ ((noreturn)); > > #endif /* _U_BOOT_I386_H_ */ > diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c > index ba6b59f..978beaa 100644 > --- a/arch/x86/lib/board.c > +++ b/arch/x86/lib/board.c > @@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags) > > gd->flags |= GD_FLG_RELOC; > > - /* Enter the relocated U-Boot! */ > - relocate_code(gd->start_addr_sp, gd, gd->relocaddr); > + /* > + * SDRAM is now initialised, U-Boot has been copied into SDRAM, > + * the BSS has been cleared etc. The final stack can now be setup > + * in SDRAM. Code execution will continue (momentarily) in Flash, > + * but with the stack in SDRAM and Global Data in temporary memory > + * (CPU cache) > + */ > + board_init_f_r_trampoline(gd->start_addr_sp); > + > + /* NOTREACHED - board_init_f_r_trampoline() does not return */ > + while (1) > + ; > +} > + > +void board_init_f_r(void) > +{ > + /* > + * Transfer execution from Flash to RAM by calculating the address > + * of the in-RAM copy of board_init_r() and calling it > + */ > + (board_init_r + gd->reloc_off)(gd, gd->relocaddr); Nice that this is in C. Regards, Simon > > - /* NOTREACHED - relocate_code() does not return */ > + /* NOTREACHED - board_init_r() does not return */ > while (1) > ; > } > -- > 1.7.5.2.317.g391b14 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot
Hi Simon, On 04/01/12 16:28, Simon Glass wrote: > Hi Graeme, > > On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote: >> >> Signed-off-by: Graeme Russ <graeme.russ@gmail.com> > > Commit message? Added in v2 > >> --- >> arch/x86/cpu/start.S | 20 +++++--------------- >> arch/x86/include/asm/u-boot-x86.h | 2 ++ >> arch/x86/lib/board.c | 25 ++++++++++++++++++++++--- >> 3 files changed, 29 insertions(+), 18 deletions(-) >> >> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S >> index 7f9b6a7..9592158 100644 >> --- a/arch/x86/cpu/start.S >> +++ b/arch/x86/cpu/start.S >> @@ -96,32 +96,22 @@ car_init_ret: >> movw $0x85, %ax >> jmp die >> >> -.globl relocate_code >> -.type relocate_code, @function >> -relocate_code: >> +.globl board_init_f_r_trampoline >> +.type board_init_f_r_trampoline, @function >> +board_init_f_r_trampoline: >> /* >> * SDRAM has been initialised, U-Boot code has been copied into >> * RAM, BSS has been cleared and relocation adjustments have been >> * made. It is now time to jump into the in-RAM copy of U-Boot >> * >> * %eax = Address of top of stack > > *new* top of stack? Changed to 'Address of top of new stack' [snip] >> - >> - /* Jump to in-RAM copy of board_init_r() */ >> - call *%ebp >> + /* Re-enter U-Boot by calling board_init_f_r */ >> + call board_init_f_r > > Isn't this a bit of a funny name? Why not call it something like > call_board_init_r() ? No, board_init_f_r is where we are still running from Flash, but RAM has been initialised so we can actually use it for the stack and Global Data. board_init_r is when we are running exclusively from RAM [snip] Regards, Graeme
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S index 7f9b6a7..9592158 100644 --- a/arch/x86/cpu/start.S +++ b/arch/x86/cpu/start.S @@ -96,32 +96,22 @@ car_init_ret: movw $0x85, %ax jmp die -.globl relocate_code -.type relocate_code, @function -relocate_code: +.globl board_init_f_r_trampoline +.type board_init_f_r_trampoline, @function +board_init_f_r_trampoline: /* * SDRAM has been initialised, U-Boot code has been copied into * RAM, BSS has been cleared and relocation adjustments have been * made. It is now time to jump into the in-RAM copy of U-Boot * * %eax = Address of top of stack - * %edx = Address of Global Data - * %ecx = Base address of in-RAM copy of U-Boot */ /* Setup stack in RAM */ movl %eax, %esp - /* Setup call address of in-RAM copy of board_init_r() */ - movl $board_init_r, %ebp - addl (GENERATED_GD_RELOC_OFF)(%edx), %ebp - - /* Setup parameters to board_init_r() */ - movl %edx, %eax - movl %ecx, %edx - - /* Jump to in-RAM copy of board_init_r() */ - call *%ebp + /* Re-enter U-Boot by calling board_init_f_r */ + call board_init_f_r die: hlt diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h index 755f88a..c3d2277 100644 --- a/arch/x86/include/asm/u-boot-x86.h +++ b/arch/x86/include/asm/u-boot-x86.h @@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size); int video_bios_init(void); int video_init(void); +void board_init_f_r_trampoline(ulong) __attribute__ ((noreturn)); +void board_init_f_r(void) __attribute__ ((noreturn)); #endif /* _U_BOOT_I386_H_ */ diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c index ba6b59f..978beaa 100644 --- a/arch/x86/lib/board.c +++ b/arch/x86/lib/board.c @@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags) gd->flags |= GD_FLG_RELOC; - /* Enter the relocated U-Boot! */ - relocate_code(gd->start_addr_sp, gd, gd->relocaddr); + /* + * SDRAM is now initialised, U-Boot has been copied into SDRAM, + * the BSS has been cleared etc. The final stack can now be setup + * in SDRAM. Code execution will continue (momentarily) in Flash, + * but with the stack in SDRAM and Global Data in temporary memory + * (CPU cache) + */ + board_init_f_r_trampoline(gd->start_addr_sp); + + /* NOTREACHED - board_init_f_r_trampoline() does not return */ + while (1) + ; +} + +void board_init_f_r(void) +{ + /* + * Transfer execution from Flash to RAM by calculating the address + * of the in-RAM copy of board_init_r() and calling it + */ + (board_init_r + gd->reloc_off)(gd, gd->relocaddr); - /* NOTREACHED - relocate_code() does not return */ + /* NOTREACHED - board_init_r() does not return */ while (1) ; }
Signed-off-by: Graeme Russ <graeme.russ@gmail.com> --- arch/x86/cpu/start.S | 20 +++++--------------- arch/x86/include/asm/u-boot-x86.h | 2 ++ arch/x86/lib/board.c | 25 ++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 18 deletions(-)