[PATCHv3 6/6] memory: reserve from start_addr_sp to end_addr_sp

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Apr 16 16:37:49 CEST 2026


Hi Randolph,


On Mon, 13 Apr 2026 at 23:36, <rs at ti.com> wrote:
>
> From: Randolph Sapp <rs at ti.com>
>
> Add a new global data struct member called end_addr_sp. 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->end_addr_sp instead of gd->ram_top. This allows platform specific
> relocation addresses to work without unnecessarily painting over a large
> range.
>

Is there a platform we can test the changes? Running the in QEMU had
no differences.

> Signed-off-by: Randolph Sapp <rs at ti.com>
> ---

[...]

>  #ifdef CFG_PRAM
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index 745d2c3a966..2f3ef26a17c 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -115,6 +115,12 @@ struct global_data {
>          * @start_addr_sp: initial stack pointer address
>          */
>         unsigned long start_addr_sp;
> +       /**
> +        * @end_addr_sp: the end of memory currently in use by uboot,
> +        *               should be the original value of the relocaddr before
> +        *               any other allocations shift it
> +        */
> +       unsigned long end_addr_sp;
>         /**
>          * @reloc_off: relocation offset
>          */
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index b3b292ebf56..bd0d875a8cd 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -870,8 +870,8 @@ 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_start + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
> +       uboot_pages = ((gd->end_addr_sp - uboot_start) + EFI_PAGE_MASK) >>
> +                     EFI_PAGE_SHIFT;

The map_sysmem dance is still needed here for sandbox.

>         efi_update_memory_map(uboot_start, uboot_pages, EFI_BOOT_SERVICES_CODE,
>                               false, false);
>  #if defined(__aarch64__)
> diff --git a/lib/lmb.c b/lib/lmb.c
> index 7ecc548d831..da61b005154 100644
> --- a/lib/lmb.c
> +++ b/lib/lmb.c
> @@ -534,46 +534,19 @@ static long lmb_reserve(phys_addr_t base, phys_size_t size, u32 flags)
>
>  static void lmb_reserve_uboot_region(void)
>  {
> -       int bank;
> -       ulong end, bank_end;
> +       ulong size;
>         phys_addr_t rsv_start;
> -       ulong pram = 0;
>
>         rsv_start = gd->start_addr_sp - CONFIG_STACK_SIZE;
> -       end = gd->ram_top;
> +       size = gd->end_addr_sp - rsv_start;
>
> -       /*
> -        * Reserve memory from aligned address below the bottom of U-Boot stack
> -        * until end of RAM area to prevent LMB from overwriting that memory.
> -        */
> -       debug("## Current stack ends at 0x%08lx ", (ulong)rsv_start);
> -
> -#ifdef CFG_PRAM
> -       pram = env_get_ulong("pram", 10, CFG_PRAM);
> -       pram = pram << 10; /* size is in kB */
> -#endif

This functionality is removed, but we still have boards defining CFG_PRAM

> +       debug("## Current stack ends at 0x%08lx\n", (ulong)rsv_start);
>
> -       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
> -               if (!gd->bd->bi_dram[bank].size ||
> -                   rsv_start < gd->bd->bi_dram[bank].start)
> -                       continue;
> -               /* Watch out for RAM at end of address space! */
> -               bank_end = gd->bd->bi_dram[bank].start +
> -                       gd->bd->bi_dram[bank].size - 1;
> -               if (rsv_start > bank_end)
> -                       continue;
> -               if (bank_end > end)
> -                       bank_end = end - 1;
> -
> -               lmb_reserve(rsv_start, bank_end - rsv_start - pram + 1,
> +       if (gd->flags & GD_FLG_SKIP_RELOC)
> +               lmb_reserve((phys_addr_t)(uintptr_t)_start, gd->mon_len,
>                             LMB_NOOVERWRITE);
> -
> -               if (gd->flags & GD_FLG_SKIP_RELOC)
> -                       lmb_reserve((phys_addr_t)(uintptr_t)_start,
> -                                   gd->mon_len, LMB_NOOVERWRITE);
> -
> -               break;
> -       }
> +       else
> +               lmb_reserve(rsv_start, size, LMB_NOOVERWRITE);
>  }
>
>  static void lmb_reserve_common(void *fdt_blob)
> --
> 2.53.0
>

Thanks
/Ilias


More information about the U-Boot mailing list