[U-Boot] [PATCH v2 1/2] arm: move C runtime setup code in crt0.S
Andreas Bießmann
andreas.devel at googlemail.com
Mon Nov 5 09:31:55 CET 2012
Dear Albert Aribaud,
On 04.11.2012 12:32, 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 <albert.u.boot at aribaud.net>
> ---
> 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
>
> arch/arm/cpu/arm1136/start.S | 62 ++--------
> arch/arm/cpu/arm1176/start.S | 62 ++--------
> arch/arm/cpu/arm720t/start.S | 53 ++-------
> arch/arm/cpu/arm920t/start.S | 61 ++--------
> arch/arm/cpu/arm925t/start.S | 61 ++--------
> arch/arm/cpu/arm926ejs/start.S | 80 ++-----------
> arch/arm/cpu/arm946es/start.S | 56 ++-------
> arch/arm/cpu/arm_intcm/start.S | 63 ++--------
> arch/arm/cpu/armv7/start.S | 58 +++-------
> arch/arm/cpu/ixp/start.S | 55 ++-------
> arch/arm/cpu/pxa/start.S | 63 ++--------
> arch/arm/cpu/s3c44b0/start.S | 55 ++-------
> arch/arm/cpu/sa1100/start.S | 50 ++------
> arch/arm/lib/Makefile | 2 +
> arch/arm/lib/board.c | 11 --
> arch/arm/lib/crt0.S | 180 +++++++++++++++++++++++++++++
> include/common.h | 2 +-
> include/configs/socfpga_cyclone5.h | 2 +-
> lib/asm-offsets.c | 10 ++
> nand_spl/board/freescale/mx31pdk/Makefile | 6 +-
> nand_spl/board/karo/tx25/Makefile | 6 +-
> 21 files changed, 324 insertions(+), 674 deletions(-)
> create mode 100644 arch/arm/lib/crt0.S
>
<snip>
> 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 <albert.u.boot at aribaud.net>
> + *
> + * 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 <config.h>
> +#include <asm-offsets.h>
> +
> +/*
> + * 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()
DDR means DRAM in general?
> + * 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
------------------------^
Full stop? The rest of the sentence makes no sense to me.
> + * 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.
> + */
> +
> +/*
> + * 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 */
I wonder if we can emit a #warning here
> + 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
> +
> + 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! */
> +
> + mov r2, #0x00000000 /* prepare zero to clear BSS */
> +
> +clbss_l:cmp r0, r1 /* while not at end of BSS */
> + strlo r2, [r0] /* clear 32-bit BSS word */
> + addlo r0, r0, #4 /* move to next
> + bhs clbss_l
> +
> +#ifdef CONFIG_SPL_BUILD
I think this should be negated. The coloured LED stuff was enabled for
non SPL builds before!
> +
> + bl coloured_LED_init
> + bl red_led_on
> +
> +#endif
> +
> + /* call board_init_r(gd_t *id, ulong dest_addr) */
Shouldn't this move down in the #elif path?
> +
> + mov lr, pc
> +
> +#if defined(CONFIG_NAND_SPL)
> + ldr pc, _nand_boot
> +
> +#elif ! defined(CONFIG_SPL_BUILD)
> +
> + /* setup parameters for board_init_r */
> + mov r0, r8 /* gd_t */
> + ldr r1, [r8, #GD_RELOCADDR] /* dest_addr */
> + /* call board_init_r */
> + ldr pc, _board_init_r /* this is auto-relocated! */
> +
> +#endif
> +
> + /* we should not return. */
Best regards
Andreas Bießmann
More information about the U-Boot
mailing list