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
>

Reply via email to