[U-Boot] [PATCH v2 28/63] x86: Refactor relocation to prepare for 64-bit
Bin Meng
bmeng.cn at gmail.com
Wed Dec 28 11:29:23 CET 2016
Hi Simon,
On Sun, Nov 20, 2016 at 4:25 AM, Simon Glass <sjg at chromium.org> wrote:
> Move the core relocation code into a separate function so that the checking
> code can be used for 64-bit relocation also.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2: None
>
> arch/x86/lib/relocate.c | 57 ++++++++++++++++++++++++++++---------------------
> 1 file changed, 33 insertions(+), 24 deletions(-)
>
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> index 0d683bf..21cd1db 100644
> --- a/arch/x86/lib/relocate.c
> +++ b/arch/x86/lib/relocate.c
> @@ -47,38 +47,18 @@ int clear_bss(void)
> return 0;
> }
>
> -/*
> - * This function has more error checking than you might expect. Please see
> - * the commit message for more informaiton.
> - */
> -int do_elf_reloc_fixups(void)
> +static void do_elf_reloc_fixups32(unsigned int text_base, uintptr_t size,
> + Elf32_Rel *re_src, Elf32_Rel *re_end)
> {
> - Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
> - Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
> -
> Elf32_Addr *offset_ptr_rom, *last_offset = NULL;
> Elf32_Addr *offset_ptr_ram;
> - unsigned int text_base = 0;
> -
> - /* The size of the region of u-boot that runs out of RAM. */
> - uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> -
> - if (gd->flags & GD_FLG_SKIP_RELOC)
> - return 0;
> - if (re_src == re_end)
> - panic("No relocation data");
>
> -#ifdef CONFIG_SYS_TEXT_BASE
> - text_base = CONFIG_SYS_TEXT_BASE;
> -#else
> - panic("No CONFIG_SYS_TEXT_BASE");
> -#endif
> do {
> /* Get the location from the relocation entry */
> - offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
> + offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset;
>
> /* Check that the location of the relocation is in .text */
> - if (offset_ptr_rom >= (Elf32_Addr *)text_base &&
> + if (offset_ptr_rom >= (Elf32_Addr *)(uintptr_t)text_base &&
> offset_ptr_rom > last_offset) {
>
> /* Switch to the in-RAM version */
> @@ -103,6 +83,35 @@ int do_elf_reloc_fixups(void)
> last_offset = offset_ptr_rom;
>
> } while (++re_src < re_end);
> +}
> +
> +/*
> + * This function has more error checking than you might expect. Please see
> + * the commit message for more informaiton.
nits: I suspect we should add the commit id here since you refactored
the code in this commit, so guess it's not easy for people to track
previous commit id..
> + */
> +int do_elf_reloc_fixups(void)
> +{
> + void *re_src = (void *)(&__rel_dyn_start);
> + void *re_end = (void *)(&__rel_dyn_end);
> + uint text_base;
> +
> + /* The size of the region of u-boot that runs out of RAM. */
> + uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> +
> + if (gd->flags & GD_FLG_SKIP_RELOC)
> + return 0;
> + if (re_src == re_end) {
> + printf("No relocation data %p %p", re_src, re_end);
can we use: panic() instead of printf() here?
> + while (1);
> + panic("No relocation data");
The above 2 lines are not needed
> + }
> +
> +#ifdef CONFIG_SYS_TEXT_BASE
> + text_base = CONFIG_SYS_TEXT_BASE;
> +#else
> + panic("No CONFIG_SYS_TEXT_BASE");
> +#endif
> + do_elf_reloc_fixups32(text_base, size, re_src, re_end);
>
> return 0;
> }
> --
Regards,
Bin
More information about the U-Boot
mailing list