[U-Boot] [PATCH 29/48] x86: Allow relocation code to build without text base

Bin Meng bmeng.cn at gmail.com
Thu Jul 23 12:03:31 CEST 2015


Hi Simon,

On Wed, Jul 22, 2015 at 11:49 PM, Simon Glass <sjg at chromium.org> wrote:
> This code currently requires CONFIG_SYS_TEXT_BASE but this should be
> unnecessary. As a first step, remove the build-time limitation and report an
> error instead.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>

But please see nits below.

>
>  arch/x86/lib/relocate.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> index 0839f59..79c1af3 100644
> --- a/arch/x86/lib/relocate.c
> +++ b/arch/x86/lib/relocate.c
> @@ -56,6 +56,7 @@ int do_elf_reloc_fixups(void)
>
>         Elf32_Addr *offset_ptr_rom, *last_offset = NULL;
>         Elf32_Addr *offset_ptr_ram;
> +       unsigned int text_base;

Should we initialize text_base to 0? I suspect there will be warnings
for uninitialized variable when CONFIG_SYS_TEXT_BASE is not defined.

>
>         /* The size of the region of u-boot that runs out of RAM. */
>         uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> @@ -65,29 +66,33 @@ int do_elf_reloc_fixups(void)
>         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;
>
>                 /* Check that the location of the relocation is in .text */
> -               if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE &&
> -                               offset_ptr_rom > last_offset) {
> +               if (offset_ptr_rom >= (Elf32_Addr *)text_base &&
> +                   offset_ptr_rom > last_offset) {
>
>                         /* Switch to the in-RAM version */
>                         offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
>                                                         gd->reloc_off);
>
>                         /* Check that the target points into .text */
> -                       if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
> -                                       *offset_ptr_ram <=
> -                                       (CONFIG_SYS_TEXT_BASE + size)) {
> +                       if (*offset_ptr_ram >= text_base &&
> +                           *offset_ptr_ram <= text_base + size) {
>                                 *offset_ptr_ram += gd->reloc_off;
>                         } else {
>                                 debug("   %p: rom reloc %x, ram %p, value %x,"
>                                         " limit %" PRIXPTR "\n", re_src,
>                                         re_src->r_offset, offset_ptr_ram,
>                                         *offset_ptr_ram,
> -                                       CONFIG_SYS_TEXT_BASE + size);
> +                                       text_base + size);
>                         }
>                 } else {
>                         debug("   %p: rom reloc %x, last %p\n", re_src,
> --

Regards,
Bin


More information about the U-Boot mailing list