[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