[U-Boot] [PATCH v4 3/4] generic board patch of manual reloc and zero gd_t

Simon Glass sjg at chromium.org
Wed Aug 21 07:27:46 CEST 2013


Hi David,

On Tue, Aug 20, 2013 at 4:48 AM,  <fenghua at phytium.com.cn> wrote:
> From: David Feng <fenghua at phytium.com.cn>
>
> 1. function board_init_f in board_f.c should firstly zero gd_t structure
>    before it call initcall_run_list, otherwise the debug print will go run
>    if DEBUG is defined. Because the printf function will use global data
>    to determine whether serial port is initialized and could be written.
> 2. function board_init_r in board_r.c should firstly relocate init_sequence_r
>    table before it call initcall_run_list. Command table also should be relocated.
>
> Signed-off-by: David Feng <fenghua at phytium.com.cn>
> ---
>  common/board_f.c |    6 ++++++
>  common/board_r.c |   17 +++++++++++++++++
>  2 files changed, 23 insertions(+)
>
> diff --git a/common/board_f.c b/common/board_f.c
> index 5e738fb..f437bcb 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -1009,6 +1009,12 @@ void board_init_f(ulong boot_flags)
>         gd = &data;
>  #endif
>
> +       /*
> +        * Zero gd_t first, otherwise the debug print in initcall_run_list
> +        * function before zero_global_data is called will go wrong.
> +        */
> +       memset((void *)gd, 0, sizeof(gd_t));
> +

Yes, we need this. You should drop the zero_global_data() or whatever
currently does the memset()

>         gd->flags = boot_flags;
>
>         if (initcall_run_list(init_sequence_f))
> diff --git a/common/board_r.c b/common/board_r.c
> index 86ca1cb..1b4bdd2 100644
> --- a/common/board_r.c
> +++ b/common/board_r.c
> @@ -157,6 +157,13 @@ static int initr_reloc_global_data(void)
>          */
>         gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
>  #endif
> +#ifdef CONFIG_NEEDS_MANUAL_RELOC
> +       /*
> +        * We have to relocate the command table manually
> +        */
> +       fixup_cmdtable(ll_entry_start(cmd_tbl_t, cmd),
> +                       ll_entry_count(cmd_tbl_t, cmd));
> +#endif /* CONFIG_NEEDS_MANUAL_RELOC */

Should this be done here or in main_loop()? How is this currently done
when not using generic board?

>         return 0;
>  }
>
> @@ -899,6 +906,7 @@ init_fnc_t init_sequence_r[] = {
>         initr_modem,
>  #endif
>         run_main_loop,
> +       NULL,
>  };
>
>  void board_init_r(gd_t *new_gd, ulong dest_addr)
> @@ -906,6 +914,15 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
>  #ifndef CONFIG_X86
>         gd = new_gd;
>  #endif
> +#ifdef CONFIG_NEEDS_MANUAL_RELOC
> +       /*
> +        * We have to relocate the init_sequence_r table manually
> +        */
> +       init_fnc_t      *init_fnc_ptr;
> +       for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr)
> +               *init_fnc_ptr = (init_fnc_t *)((unsigned long)(*init_fnc_ptr) + gd->reloc_off);
> +#endif /* CONFIG_NEEDS_MANUAL_RELOC */
> +
>         if (initcall_run_list(init_sequence_r))
>                 hang();
>

Regards,
Simon


More information about the U-Boot mailing list