[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