[PATCHv8 3/3] memory: reserve from start_addr_sp to initial_relocaddr
Ilias Apalodimas
ilias.apalodimas at linaro.org
Fri May 15 09:38:32 CEST 2026
On Wed, 13 May 2026 at 23:49, <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.
>
> 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 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
>
More information about the U-Boot
mailing list