From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vikram Narayanan Date: Sun, 04 Nov 2012 20:36:14 +0530 Subject: [U-Boot] [PATCH v2 1/2] arm: move C runtime setup code in crt0.S In-Reply-To: <1352028725-26683-2-git-send-email-albert.u.boot@aribaud.net> References: <1352001421-25913-1-git-send-email-albert.u.boot@aribaud.net> <1352028725-26683-1-git-send-email-albert.u.boot@aribaud.net> <1352028725-26683-2-git-send-email-albert.u.boot@aribaud.net> Message-ID: <50968466.1050507@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Albert, On 11/4/2012 5:02 PM, Albert ARIBAUD wrote: > Move all the C runtime setup code from every start.S > in arch/arm into arch/arm/lib/crt0.S. This covers > the code sequence from isetting up the initial stack > to calling into board_init_r(). > > Also, rewrite the C runtime setup and make functions > board_init_*() and relocate_code() behave according to > normal C semantics (no jumping across the C stack any > more, etc). > > Some SPL targets had to be touched because they use > start.S exolicitly or for some reason; the relevant > maintainers and custodians are cc:ed. > > Signed-off-by: Albert ARIBAUD > --- > Changes in v2: > - moved description from cover letter to patch commit msg > - added note about tests in the cover letter > - fixed baords with CONFIG_SPL but not CONFIG_SPL_STACK > diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S > new file mode 100644 > index 0000000..fd6bd92 > --- /dev/null > +++ b/arch/arm/lib/crt0.S > @@ -0,0 +1,180 @@ > +/* > + * crt0 - C-runtime startup Code for ARM U-Boot > + * > + * Copyright (c) 2012 Albert ARIBAUD > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include > +#include > + > +/* > + * This file handles the target-independent stages of the U-Boot > + * start-up where a C runtime environment is needed. Its entry point > + * is _main and is branched into from the target's start.S file. > + * > + * _main execution sequence is: > + * > + * 1. Set up initial environment for calling board_init_f(). > + * This environment only provides a stack and a place to store > + * the GD ('global data') structure. In this context, VARIABLE > + * global data, initialized or not (BSS), are UNAVAILABLE; only > + * CONSTANT initialized data are available. > + * > + * 2. Call board_init_f(). This function prepares the hardware for > + * execution from DDR. As DDR may not be available, board_init_f() > + * must use GD to store any data which must be passed on to later, > + * stages, including the reloction destination and the new stack > + * pointer address, below which the stack resides and above it the > + * new GD resides. > + * > + * 3. Set up intermediate environment where the stack and GD are the > + * ones allocated by board_init_f() in DDR, but BSS and initialized > + * non-const data are still not available. > + * > + * 4. Call relocate_code(). This function relocates U-Boot from its > + * current location into the relocation destination computed by > + * board_init_f(). > + * > + * 5. Set up final environment for calling board_init_r(). This > + * environment has BSS (initialized to 0), initialized non-const > + * data (initialized to their intended value), and stack in DDR. > + * GD has but retained values set by board_init_f(). Some CPUs > + * have some work to do at this point, so call c_runtime_cpu_setup. > + * > + * 6. Call noard_init_r(). If the function returns, reset the board. > + */ s/noard_init_r/board_init_r > + > +/* > + * offset of the nand_boot() function for SPL crt > + */ > + > +#if defined(CONFIG_NAND_SPL) > + > +.globl nand_boot > +_nand_boot: > + .word nand_boot > + > +#elif ! defined(CONFIG_SPL_BUILD) > + > +/* > + * offset of the board_init_r() function for non-SPL crt > + */ > + > +.globl board_init_r > +_board_init_r: > + .word board_init_r > + > +#endif > + > +/* > + * start and end of BSS > + */ > + > +.globl __bss_start > +.globl __bss_end__ > + > +/* > + * entry point of crt0 sequence > + */ > + > +.global _main > + > +_main: > + > +/* > + * Set up initial C runtime environment and call board_init_f(0). > + */ > + > +#if defined(CONFIG_NAND_SPL) > + /* deprecated, use instead CONFIG_SPL_BUILD */ > + ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) > +#elif defined(CONFIG_SPL_BUILD)&& defined(CONFIG_SPL_STACK) > + ldr sp, =(CONFIG_SPL_STACK) > +#else > + ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) > +#endif > + bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ > + mov r8, sp /* GD is above SP */ > + mov r0, #0 > + bl board_init_f > + > +/* > + * Set up intermediate environment (new sp and gd) and call > + * relocate_code(addr_sp, gd, addr_moni). Trick here is that > + * we'll return 'here' but relocated. > + */ > + > + ldr sp, [r8, #GD_START_ADDR_SP] /* r8 = gd->start_addr_sp */ > + ldr r8, [r8, #GD_BD] /* r8 = gd->bd */ > + sub r8, r8, #GD_SIZE /* new GD is below bd */ > + > +#ifndef CONFIG_SPL_BUILD In some places the other style is used. "!(defined)". Any particular reasons for switching b/w these two styles? > + > + adr lr, here > + ldr r0, [r8, #GD_RELOC_OFF] /* lr = gd->start_addr_sp */ > + add lr, lr, r0 > + ldr r0, [r8, #GD_START_ADDR_SP] /* r0 = gd->start_addr_sp */ > + mov r1, r8 /* r1 = gd */ > + ldr r2, [r8, #GD_RELOCADDR] /* r2 = gd->relocaddr */ > + b relocate_code > +here: > + > +#endif > + > +/* Set up final (full) environment */ > + > + bl c_runtime_cpu_setup /* we still call old routine here */ > + > + ldr r0, =__bss_start /* this is auto-relocated! */ > + ldr r1, =__bss_end__ /* this is aotu-relocated! */ s/aotu/auto Regards, Vikram