On Fri, Feb 6, 2026 at 7:42 AM Tom Rini <[email protected]> wrote:
>
> Historically, when we have an appended device tree and also our
> resulting binary will contain the BSS section, we have ensured that
> everything will be where it's expected to be by declaring that the BSS
> is overlayed with a symbol matches the end of the port of the ELF binary
> that is objcopy'd to the binary we concatenate with. This in turn means
> that the logic to generate a "pad" file, which is the size found in the
> __bss_size symbol, will be correct and then we can concatenate the
> device tree and it will begin at __bss_size at run time.
>
> With commit 5ffc1dcc26d3 ("arm: Remove rel.dyn from SPL linker scripts")
> we removed this overlay as part of trying to ensure that we met both the
> requirements of the device tree to be 8 byte aligned as well as that our
> logic to generate the -pad file would match what ended up in the
> resulting binary. While it was correct to remove an unused section it
> did not solve ultimately solve the problem for all cases.
>
> To really fix the problem, we need to do two things. First, our final
> section prior to _image_binary_end must be 8 byte aligned (for the case
> of having a separate BSS and so our appended DTB exists at this
> location). This cannot be '.binman_sym_table' as it may be empty, and in
> turn the ELF type would be NOBITS and so not copied with objcopy. The
> __u_boot_list section will never be empty, so it is our final section,
> and ends with a '. = ALIGN(8)' statement. Second, as this is the end of
> our copied data it is safe to declare that the BSS starts here, so use
> the OVERLAY keyword to place the BSS here.
>
> Fixes: 5ffc1dcc26d3 ("arm: Remove rel.dyn from SPL linker scripts")
> Reported-by: Brian Sune <[email protected]>
> Reported-by: Phil Phil Sutter <[email protected]>
> Signed-off-by: Tom Rini <[email protected]>
> ---
> Cc: Richard Henderson <[email protected]>
> Cc: Ilias Apalodimas <[email protected]>
> Cc: Marek Vasut <[email protected]>
> Cc: Nobuhiro Iwamatsu <[email protected]>
> Cc: Nathan Barrett-Morrison <[email protected]>
> Cc: Greg Malysa <[email protected]>
> Cc: Ian Roberts <[email protected]>
> Cc: Vasileios Bimpikas <[email protected]>
> Cc: Utsav Agarwal <[email protected]>
> Cc: Arturs Artamonovs <[email protected]>
> Cc: [email protected]
>
> So, first, with the exception of:
> axm brppt2 imx28_btt3 imx28_xea mk808 taurus work_92105
> all platforms using arch/arm/cpu/u-boot-spl.lds do NOT enable
> CONFIG_SPL_SEPARATE_BSS. And of those, only brppt2 enables SPL_OF_REAL.
> As an aside, I'm thinking that there is room for a clean-up / merger of
> arch/arm/cpu/u-boot-spl.lds and arch/arm/mach-omap2/u-boot-spl.lds
> (*widely* used outside of mach-omap2). But for this patch, that one case
> is handled correctly, with the first change I explained. All other 32bit
> platforms are handled with the second.
>
> Which means second, 64bit ARM platforms. With the exception of:
> socfpga_agilex7m socfpga_n5x_atf socfpga_n5x_vab socfpga_stratix10_atf
> all ARM64 SPL_FRAMEWORK using platforms use the
> arch/arm/cpu/armv8/u-boot-spl.lds explicitly. These other ones set
> CONFIG_SPL_LDSCRIPT to a non-existant file and then fall back to using
> arch/arm/cpu/armv8/u-boot-spl.lds. There are only 4 platforms which
> don't use a separate BSS section and so could trip up the above as well:
> r8a779g0_whitehawk r8a779g3_sparrowhawk sc598-som-ezkit-spl 
> sc598-som-ezlite-spl
> I have inspected the Renesas platforms manually, and I'm a little unsure
> how this case works on the two sc598 platforms.
> ---
>  arch/arm/cpu/armv8/u-boot-spl.lds | 15 ++++++++-------
>  arch/arm/cpu/u-boot-spl.lds       | 12 ++++++------
>  2 files changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/arch/arm/cpu/armv8/u-boot-spl.lds 
> b/arch/arm/cpu/armv8/u-boot-spl.lds
> index b732133ce76d..39020a1fddde 100644
> --- a/arch/arm/cpu/armv8/u-boot-spl.lds
> +++ b/arch/arm/cpu/armv8/u-boot-spl.lds
> @@ -49,12 +49,6 @@ SECTIONS
>         } >.sram
>  #endif
>
> -       __u_boot_list : {
> -               . = ALIGN(8);
> -               KEEP(*(SORT(__u_boot_list*)));
> -               . = ALIGN(8);
> -       } >.sram
> -
>         .binman_sym_table : {
>                 . = ALIGN(8);
>                 __binman_sym_start = .;
> @@ -63,6 +57,12 @@ SECTIONS
>                 . = ALIGN(8);
>         } > .sram
>
> +       __u_boot_list : {
> +               . = ALIGN(8);
> +               KEEP(*(SORT(__u_boot_list*)));
> +               . = ALIGN(8);
> +       } >.sram
> +
>         __image_copy_end = .;
>         _end = .;
>         _image_binary_end = .;
> @@ -75,7 +75,7 @@ SECTIONS
>                 __bss_end = .;
>         } >.sdram
>  #else
> -       .bss (NOLOAD) : {
> +       .bss _image_binary_end (OVERLAY) : {
>                 __bss_start = .;
>                 *(.bss*)
>                  . = ALIGN(8);
> @@ -99,5 +99,6 @@ SECTIONS
>
>  ASSERT(_image_binary_end % 8 == 0, \
>         "_image_binary_end must be 8-byte aligned for device tree");
> +
>  ASSERT(ADDR(.bss) % 8 == 0, \
>         ".bss must be 8-byte aligned");


For ARM v7 on SoCFPGA GEN5 no issue under AC501:

Tested-by: Brian Sune <[email protected]>

Boot Message as follows:

U-Boot SPL 2026.04-rc1-00154-gb5213bbfdcb1-dirty (Feb 06 2026 - 09:11:02 +0800)


U-Boot 2026.04-rc1-00154-gb5213bbfdcb1-dirty (Feb 06 2026 - 09:11:02 +0800)

CPU:   Altera SoCFPGA Platform
FPGA:  Altera Cyclone V, SE/A2 or SX/C2, version 0x0
BOOT:  SD/MMC Internal Transceiver (3.0V)
DRAM:  1 GiB
Core:  29 devices, 15 uclasses, devicetree: separate
MMC:   dwmmc0@ff704000: 0
Loading Environment from MMC... Card did not respond to voltage select! : -110
*** Warning - No block device, using default environment

In:    serial
Out:   serial
Err:   serial
Model: CoreCourse AC501SoC
Net:
Warning: ethernet@ff702000 (eth0) using random MAC address - 36:e3:3d:93:85:a5
eth0: ethernet@ff702000
Hit any key to stop autoboot: 0


> diff --git a/arch/arm/cpu/u-boot-spl.lds b/arch/arm/cpu/u-boot-spl.lds
> index c578c3ebf821..97083319d39d 100644
> --- a/arch/arm/cpu/u-boot-spl.lds
> +++ b/arch/arm/cpu/u-boot-spl.lds
> @@ -31,16 +31,16 @@ SECTIONS
>                 *(.data*)
>         }
>
> -       . = ALIGN(4);
> -       __u_boot_list : {
> -               KEEP(*(SORT(__u_boot_list*)));
> -       }
> -
>         . = ALIGN(4);
>         .binman_sym_table : {
>                 __binman_sym_start = .;
>                 KEEP(*(SORT(.binman_sym*)));
>                 __binman_sym_end = .;
> +       }
> +
> +       . = ALIGN(4);
> +       __u_boot_list : {
> +               KEEP(*(SORT(__u_boot_list*)));
>                 . = ALIGN(8);
>         }
>
> @@ -48,7 +48,7 @@ SECTIONS
>         _image_binary_end = .;
>         _end = .;
>
> -       .bss : {
> +       .bss _image_binary_end (OVERLAY) : {
>                 __bss_start = .;
>                 *(.bss*)
>                  . = ALIGN(8);
> --
> 2.43.0
>

Reply via email to