[PATCHv10 4/4] memory: reserve from start_addr_sp to initial_relocaddr

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jun 4 22:31:26 CEST 2026


On Thu, 4 Jun 2026 at 23:19, Ilias Apalodimas
<ilias.apalodimas at linaro.org> wrote:
>
> Hi Randolph
>
> On Thu, 4 Jun 2026 at 18:51, <rs at ti.com> wrote:
> >
> > From: Randolph Sapp <rs at ti.com>
> >
> > Add a new global data struct member called initial_relocaddr. This
> > stores the original value of relocaddr, directly from setup_dest_addr.
> > This is specifically to avoid any adjustments made by other init
> > functions.
> >
> > Reserve the memory from gd->start_addr_sp - CONFIG_STACK_SIZE to
> > gd->initial_relocaddr instead of gd->ram_top. This allows platform
> > specific relocation addresses to work without unnecessarily painting
> > over a large range.
>
> Looking at this again, I don't think you can reserve only up to
> initial_relocaddr. That's the base address we relocate and everything
> else (.data, .bss) etc should be living above that address. We have to
> account for the size of the relocated u-boot binary + bss and reserve
> those areas as well.

Ok ignore this, I forgot we subtract all that from the initial reloc
addr, so this is fine

You can keep the r-b tag

Cheers
/Ilias
>
> Cheers
> /Ilias
> >
> > Signed-off-by: Randolph Sapp <rs at ti.com>
> > Reviewed-by: Simon Glass <sjg at chromium.org>
> > Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> > ---
> > v7:
> >         - Reinstate bank hopping logic for U-Boot reserved region
> >         - Update description for gd->initial_relocaddr, make it clear this is
> >           also an exclusive value
> >         - Leave the PRAM region out of the reservation. Previous commit messages
> >           indicate that this is intended.
> > v8:
> >         - Adjust initial_relocaddr doc string
> > ---
> >  common/board_f.c                  | 9 ++++++++-
> >  include/asm-generic/global_data.h | 9 +++++++++
> >  lib/efi_loader/efi_memory.c       | 2 +-
> >  lib/lmb.c                         | 7 ++++---
> >  4 files changed, 22 insertions(+), 5 deletions(-)
> >
> > diff --git a/common/board_f.c b/common/board_f.c
> > index ce87c619e68..aeb53b4c274 100644
> > --- a/common/board_f.c
> > +++ b/common/board_f.c
> > @@ -330,6 +330,8 @@ __weak int arch_setup_dest_addr(void)
> >
> >  static int setup_dest_addr(void)
> >  {
> > +       int ret;
> > +
> >         debug("Monitor len: %08x\n", gd->mon_len);
> >         /*
> >          * Ram is setup, size stored in gd !!
> > @@ -356,7 +358,12 @@ static int setup_dest_addr(void)
> >         gd->relocaddr = gd->ram_top;
> >         debug("Ram top: %08llX\n", (unsigned long long)gd->ram_top);
> >
> > -       return arch_setup_dest_addr();
> > +       ret = arch_setup_dest_addr();
> > +       if (ret)
> > +               return ret;
> > +
> > +       gd->initial_relocaddr = gd->relocaddr;
> > +       return 0;
> >  }
> >
> >  #ifdef CFG_PRAM
> > diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> > index 745d2c3a966..8d1d49b1133 100644
> > --- a/include/asm-generic/global_data.h
> > +++ b/include/asm-generic/global_data.h
> > @@ -107,6 +107,15 @@ struct global_data {
> >          * GDB using the 'add-symbol-file u-boot <relocaddr>' command.
> >          */
> >         unsigned long relocaddr;
> > +       /**
> > +        * @initial_relocaddr: top address of U-Boot in RAM
> > +        *
> > +        * This should be the value of relocaddr after setup_dest_addr() and
> > +        * before reserve_pram() or any other allocations or reservations shift
> > +        * it. This address will, depending on the platform, be equivalent to
> > +        * ram_top and should also be considered an exclusive address.
> > +        */
> > +       unsigned long initial_relocaddr;
> >         /**
> >          * @irq_sp: IRQ stack pointer
> >          */
> > diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> > index 2feb29f0a2c..c3da7c20cb2 100644
> > --- a/lib/efi_loader/efi_memory.c
> > +++ b/lib/efi_loader/efi_memory.c
> > @@ -871,7 +871,7 @@ static void add_u_boot_and_runtime(void)
> >         /* Add U-Boot */
> >         uboot_start = ((uintptr_t)map_sysmem(gd->start_addr_sp, 0) -
> >                        uboot_stack_size) & ~EFI_PAGE_MASK;
> > -       uboot_pages = ((uintptr_t)map_sysmem(gd->ram_top - 1, 0) -
> > +       uboot_pages = ((uintptr_t)map_sysmem(gd->initial_relocaddr - 1, 0) -
> >                        uboot_start + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
> >         efi_update_memory_map(uboot_start, uboot_pages, EFI_BOOT_SERVICES_CODE,
> >                               false, false);
> > diff --git a/lib/lmb.c b/lib/lmb.c
> > index 8f12c6ad8e5..27c8565e590 100644
> > --- a/lib/lmb.c
> > +++ b/lib/lmb.c
> > @@ -540,13 +540,14 @@ static void lmb_reserve_uboot_region(void)
> >         ulong pram = 0;
> >
> >         rsv_start = gd->start_addr_sp - CONFIG_STACK_SIZE;
> > -       end = gd->ram_top;
> > +       end = gd->initial_relocaddr;
> >
> >         /*
> >          * Reserve memory from aligned address below the bottom of U-Boot stack
> > -        * until end of RAM area to prevent LMB from overwriting that memory.
> > +        * until the original relocation address to prevent LMB from
> > +        * overwriting that memory.
> >          */
> > -       debug("## Current stack ends at 0x%08lx ", (ulong)rsv_start);
> > +       debug("## Current stack ends at 0x%08lx\n", (ulong)rsv_start);
> >
> >  #ifdef CFG_PRAM
> >         pram = env_get_ulong("pram", 10, CFG_PRAM);
> > --
> > 2.54.0
> >


More information about the U-Boot mailing list