[PATCH v2 04/12] x86: Make sure the SPL image ends on a suitable boundary
Bin Meng
bmeng.cn at gmail.com
Mon Feb 1 07:37:22 CET 2021
On Mon, Jan 25, 2021 at 1:06 AM Simon Glass <sjg at chromium.org> wrote:
>
> The part of U-Boot that actually ends up in u-boot-nodtb.bin is not built
> with any particular alignment. It ends at the start of the BSS section.
> The BSS section selects its own alignment, which may larger.
may be
> This means that there can be a gap of a few bytes between the image
> ending and BSS starting.
>
> Since u-boot.bin is build by joining u-boot-nodtb.bin and u-boot.dtb (with
> perhaps some padding for BSS), the expected result is not obtained. U-Boot
> uses the end of BSS to find the devicetree, so this means that it cannot
> be found.
>
> Add 32-byte alignment of BSS so that the image size is correct and
> appending the devicetree will place it at the end of BSS.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Example SPL output without this patch:
>
> Sections:
> Idx Name Size VMA LMA File off Algn
> 0 .text 000142a1 fef40000 fef40000 00001000 2**4
> CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
> 1 .u_boot_list 000014a4 fef542a8 fef542a8 000152a8 2**3
> CONTENTS, ALLOC, LOAD, RELOC, DATA
> 2 .rodata 0000599c fef55760 fef55760 00016760 2**5
> CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
> 3 .data 00000970 fef5b100 fef5b100 0001c100 2**5
> CONTENTS, ALLOC, LOAD, RELOC, DATA
> 4 .binman_sym_table 00000020 fef5ba70 fef5ba70 0001ca70 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 5 .bss 00000060 fef5baa0 fef5baa0 00000000 2**5
> ALLOC
>
> You can see that .bss is aligned to 2**5 (32 bytes). This is because of
> the mallinfo struct in dlmalloc.c:
>
> 17 .bss.current_mallinfo 00000028 00000000 00000000 000004c0 2**5
> ALLOC
>
> In this case the size of u-boot-spl-nodtb.bin is 0x1ba90. This matches up
> with the _image_binary_end symbol:
>
> fef5ba90 g .binman_sym_table 00000000 _image_binary_end
>
> But BSS starts 16 bytes later, at 0xfef5baa0, due to the 32-byte
> alignment. So we must align _image_binary_end to a 32-byte boundary. This
> forces the binary size to be 0x1baa0, i.e. ending at the start of bss, as
> expected.
>
> Note that gcc reports __BIGGEST_ALIGNMENT__ of 16 on this build, even
> though it generates an object file with a member that requests 32-byte
> alignment.
>
> The current_mallinfo struct is 40 bytes in size. Increasing the struct to
> 68 bytes (i.e. just above a 64-byte boundary) does not cause the alignment
> to go above 32 bytes. So it seems that 32 bytes is the maximum alignment
> at present.
>
The above information is very useful for people to understand such
tricky changes.
I can put such in the commit message when applying.
> Changes in v2:
> - Add comment to .lds file
> - Add more notes to the commit
>
> arch/x86/cpu/u-boot-spl.lds | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list