On Wed, 13 May 2026 at 23:49, <[email protected]> wrote: > > From: Randolph Sapp <[email protected]> > > 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. > > Signed-off-by: Randolph Sapp <[email protected]> > Reviewed-by: Simon Glass <[email protected]> > ---
Reviewed-by: Ilias Apalodimas <[email protected]> > > 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 046a2bb4641..9d7eda9422f 100644 > --- a/lib/efi_loader/efi_memory.c > +++ b/lib/efi_loader/efi_memory.c > @@ -869,7 +869,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 >

