> From: Eugen Hristev <eugen.hris...@microchip.com> > Date: Thu, 15 Dec 2022 13:58:25 +0200 > > Newer DTC require that the DTB start address is aligned at 8 bytes. > In the u-boot.bin case, the u-boot-nodtb.bin is concatenated with the > DTB, but there is no alignment/padding to the next 8byte aligned address. > This causes the board to fail booting, because the FDT will claim > that the DTB inside u-boot.bin is not a valid DTB, it will fail with > -FDT_ERR_ALIGNMENT. > To solve this, have the u-boot binary `_end` aligned with 8 bytes. > The objcopy in the Makefile will create the u-boot-nodtb.bin and it has to > be truncated to 8 bytes to correspond to the u-boot.map file which will > have the `_end` aligned to 8 bytes. > The lds files which use devicetrees have been changed to align the `_end` > tag with 8 bytes. > > This patch is also a prerequisite to have the possibility to update the > dtc inside u-boot to newer versions (1.6.1+) > > Signed-off-by: Eugen Hristev <eugen.hris...@microchip.com> > --- > Hi, > > I could not test all affected boards, it's an impossible task. > I tried this on at91 boards which I have, and ran the CI on denx. > I cannot guarantee that no other boards are affected, so this patch is a bit > of an RFC. > If the u-boot-nodtb.bin does not have the size equal with the corresponding > one in u-boot.map, the binary_size_check will fail at build time with > something like this: > > u-boot.map shows a binary size of 502684 > but u-boot-nodtb.bin shows 502688 > > Thanks, > Eugen > > Makefile | 2 ++ > arch/arm/cpu/armv8/u-boot.lds | 4 ++-- > arch/arm/cpu/u-boot-spl.lds | 1 + > arch/arm/cpu/u-boot.lds | 1 + > arch/arm/lib/elf_arm_efi.lds | 5 +++++ > arch/arm/mach-at91/arm926ejs/u-boot-spl.lds | 2 +- > arch/arm/mach-at91/armv7/u-boot-spl.lds | 2 +- > arch/arm/mach-zynq/u-boot-spl.lds | 2 +- > arch/mips/cpu/u-boot.lds | 2 +- > arch/sandbox/cpu/u-boot.lds | 6 ++++++ > arch/sh/cpu/u-boot.lds | 2 ++ > board/ti/am335x/u-boot.lds | 1 + > tools/binman/test/u_boot_binman_embed.lds | 2 +- > 13 files changed, 25 insertions(+), 7 deletions(-) > > diff --git a/Makefile b/Makefile > index 9d84f96481..b4d387bcce 100644 > --- a/Makefile > +++ b/Makefile > @@ -1317,6 +1317,8 @@ endif > > u-boot-nodtb.bin: u-boot FORCE > $(call if_changed,objcopy_uboot) > +# Make sure the size is 8 byte-aligned. > + @truncate -s %8 $@
$ truncate ksh: truncate: not found In other words: truncate(1) isn't a standard UNIX utility and not present on OpenBSD for example. It isn't part of POSIX and therefore its usage is unportable. Please find a different solution. > $(BOARD_SIZE_CHECK) > > u-boot.ldr: u-boot > diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds > index 8fe4682dd2..e5fa4ef95c 100644 > --- a/arch/arm/cpu/armv8/u-boot.lds > +++ b/arch/arm/cpu/armv8/u-boot.lds > @@ -145,10 +145,10 @@ SECTIONS > *(.__rel_dyn_end) > } > > - _end = .; > - > . = ALIGN(8); > > + _end = .; > + > .bss_start : { > KEEP(*(.__bss_start)); > } > diff --git a/arch/arm/cpu/u-boot-spl.lds b/arch/arm/cpu/u-boot-spl.lds > index fb2189d50d..732ed42db1 100644 > --- a/arch/arm/cpu/u-boot-spl.lds > +++ b/arch/arm/cpu/u-boot-spl.lds > @@ -55,6 +55,7 @@ SECTIONS > > .end : > { > + . = ALIGN(8); > *(.__end) > } > > diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds > index f25f72b2e0..274e1a7d30 100644 > --- a/arch/arm/cpu/u-boot.lds > +++ b/arch/arm/cpu/u-boot.lds > @@ -193,6 +193,7 @@ SECTIONS > > .end : > { > + . = ALIGN(8); > *(.__end) > } > > diff --git a/arch/arm/lib/elf_arm_efi.lds b/arch/arm/lib/elf_arm_efi.lds > index 767ebda635..f3867021d3 100644 > --- a/arch/arm/lib/elf_arm_efi.lds > +++ b/arch/arm/lib/elf_arm_efi.lds > @@ -54,6 +54,11 @@ SECTIONS > .rel.data : { *(.rel.data) *(.rel.data*) } > _data_size = . - _etext; > > + .end : { > + . = ALIGN(8); > + *(.__end) > + } > + > /DISCARD/ : { > *(.rel.reloc) > *(.eh_frame) > diff --git a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds > b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds > index 1a8bf94dee..d7e5d81ecc 100644 > --- a/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds > +++ b/arch/arm/mach-at91/arm926ejs/u-boot-spl.lds > @@ -31,7 +31,7 @@ SECTIONS > . = ALIGN(4); > __u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram > > - . = ALIGN(4); > + . = ALIGN(8); > __image_copy_end = .; > > .end : > diff --git a/arch/arm/mach-at91/armv7/u-boot-spl.lds > b/arch/arm/mach-at91/armv7/u-boot-spl.lds > index 6ca725fc4c..2a0a1b4b86 100644 > --- a/arch/arm/mach-at91/armv7/u-boot-spl.lds > +++ b/arch/arm/mach-at91/armv7/u-boot-spl.lds > @@ -38,7 +38,7 @@ SECTIONS > . = ALIGN(4); > __u_boot_list : { KEEP(*(SORT(__u_boot_list*))) } > .sram > > - . = ALIGN(4); > + . = ALIGN(8); > __image_copy_end = .; > > .end : > diff --git a/arch/arm/mach-zynq/u-boot-spl.lds > b/arch/arm/mach-zynq/u-boot-spl.lds > index 8c18d3f91f..c0320dbe1e 100644 > --- a/arch/arm/mach-zynq/u-boot-spl.lds > +++ b/arch/arm/mach-zynq/u-boot-spl.lds > @@ -41,7 +41,7 @@ SECTIONS > KEEP(*(SORT(__u_boot_list*))); > } > .sram > > - . = ALIGN(4); > + . = ALIGN(8); > > _image_binary_end = .; > > diff --git a/arch/mips/cpu/u-boot.lds b/arch/mips/cpu/u-boot.lds > index 9a4ebcd151..182e9bc6e5 100644 > --- a/arch/mips/cpu/u-boot.lds > +++ b/arch/mips/cpu/u-boot.lds > @@ -56,7 +56,7 @@ SECTIONS > . += CONFIG_MIPS_RELOCATION_TABLE_SIZE - 4; > } > > - . = ALIGN(4); > + . = ALIGN(8); > _end = .; > > .bss __rel_start (OVERLAY) : { > diff --git a/arch/sandbox/cpu/u-boot.lds b/arch/sandbox/cpu/u-boot.lds > index ba8dee50c7..3fbca6d248 100644 > --- a/arch/sandbox/cpu/u-boot.lds > +++ b/arch/sandbox/cpu/u-boot.lds > @@ -51,6 +51,12 @@ SECTIONS > *(.dynsym) > __dyn_sym_end = .; > } > + > + .end : > + { > + . = ALIGN(8); > + *(.__end) > + } > } > > INSERT BEFORE .data; > diff --git a/arch/sh/cpu/u-boot.lds b/arch/sh/cpu/u-boot.lds > index d360eea7eb..226f50b19c 100644 > --- a/arch/sh/cpu/u-boot.lds > +++ b/arch/sh/cpu/u-boot.lds > @@ -74,6 +74,8 @@ SECTIONS > KEEP(*(SORT(__u_boot_list*))); > } >ram > > + . = ALIGN(8); > + > PROVIDE (__init_end = .); > PROVIDE (reloc_dst_end = .); > PROVIDE (_end = .); > diff --git a/board/ti/am335x/u-boot.lds b/board/ti/am335x/u-boot.lds > index 087dee8bb2..deb9098a90 100644 > --- a/board/ti/am335x/u-boot.lds > +++ b/board/ti/am335x/u-boot.lds > @@ -118,6 +118,7 @@ SECTIONS > > .end : > { > + . = ALIGN(8); > *(.__end) > } > > diff --git a/tools/binman/test/u_boot_binman_embed.lds > b/tools/binman/test/u_boot_binman_embed.lds > index e213fa8a84..93c0ae6aed 100644 > --- a/tools/binman/test/u_boot_binman_embed.lds > +++ b/tools/binman/test/u_boot_binman_embed.lds > @@ -18,7 +18,7 @@ SECTIONS > *(.text*) > } > > - . = ALIGN(4); > + . = ALIGN(8); > .data : { > dtb_embed_begin = .; > KEEP(*(.mydtb)); > -- > 2.25.1 > >