[PATCHv5 6/6] memory: reserve from start_addr_sp to initial_relocaddr
Randolph Sapp
rs at ti.com
Fri May 8 23:33:49 CEST 2026
On Tue May 5, 2026 at 6:24 AM CDT, Ilias Apalodimas wrote:
> Hi Randolph,
>
> On Wed, 22 Apr 2026 at 20:10, <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.
>>
>> Since PRAM comes out of this initial area up to initial_relocaddr, we no
>> longer need to account for it separately.
>
> Several CI tests are complaining with this series.
> https://source.denx.de/u-boot/custodians/u-boot-tpm/-/pipelines/29989
>
> Can you have a look?
>
> Thanks
> /Ilias
>
>>
>> Signed-off-by: Randolph Sapp <rs at ti.com>
>> ---
>> common/board_f.c | 9 ++++++-
>> include/asm-generic/global_data.h | 7 ++++++
>> lib/efi_loader/efi_memory.c | 2 +-
>> lib/lmb.c | 39 +++++--------------------------
>> 4 files changed, 22 insertions(+), 35 deletions(-)
>>
>> diff --git a/common/board_f.c b/common/board_f.c
>> index ce87c619e68..31c6eb725fb 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 != 0)
>> + return ret;
>> +
>> + gd->initial_relocaddr = gd->relocaddr;
>> + return ret;
>> }
>>
>> #ifdef CFG_PRAM
>> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
>> index 745d2c3a966..6c60a79c2ab 100644
>> --- a/include/asm-generic/global_data.h
>> +++ b/include/asm-generic/global_data.h
>> @@ -107,6 +107,13 @@ struct global_data {
>> * GDB using the 'add-symbol-file u-boot <relocaddr>' command.
>> */
>> unsigned long relocaddr;
>> + /**
>> + * @initial_relocaddr: end of memory currently in use by uboot
>> + *
>> + * This should be the original value of relocaddr before any other
>> + * allocations or reservations shift it.
>> + */
>> + 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..ece05c142f0 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, 0) -
Ugh, It's specifically when gd->initial_relocaddr == gd->ram_top. Something
in map_sysmem gets angry. Seems weird to me though. The ram_top value is
supposed to be addressable.
It's ram_size - 1 on physical boards. GDB tells me that is not the case in the
sandbox though. Fun.
>> 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 9a8c70b778a..e5d4d726ab1 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->initial_relocaddr - 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);
>> + debug("## Current stack ends at 0x%08lx\n", (ulong)rsv_start);
>>
>> -#ifdef CFG_PRAM
>> - pram = env_get_ulong("pram", 10, CFG_PRAM);
>> - pram = pram << 10; /* size is in kB */
>> -#endif
>> -
>> - 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, size, LMB_NOOVERWRITE);
>>
>> - 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;
>> - }
>> }
>>
>> static void lmb_reserve_common(void *fdt_blob)
>> --
>> 2.53.0
>>
More information about the U-Boot
mailing list