From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Tue, 3 Jan 2012 21:28:54 -0800 Subject: [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition In-Reply-To: <1325477374-6417-6-git-send-email-graeme.russ@gmail.com> References: <1325477374-6417-1-git-send-email-graeme.russ@gmail.com> <1325477374-6417-6-git-send-email-graeme.russ@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Graeme, On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ wrote: > > Signed-off-by: Graeme Russ 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 at lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot