On Thu, 4 Jun 2026 at 23:19, Ilias Apalodimas <[email protected]> wrote: > > Hi Randolph > > On Thu, 4 Jun 2026 at 18:51, <[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. > > 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 <[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 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 > >

