
Hello Simon,
when I compile qemu-x86_64_defconfig on Debian the spl is close to 4GB large.
These files shed some light:
spl/u-boot-spl.lds ------------------ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(_start) SECTIONS { . = 0xfffd0000; __text_start = .; .text : { *(.text*); } . = ALIGN(4); . = ALIGN(4); .u_boot_list : { KEEP(*(SORT(.u_boot_list*))); } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data*) } . = ALIGN(4); __data_end = .; __init_end = .; _image_binary_end = .; . = 0x120000; .bss (OVERLAY) : { __bss_start = .; *(.bss*) *(COM*) . = ALIGN(4); __bss_end = .; }
spl/u-boot-spl.map -------------------------- Linker script and memory map
0x00000000fffd0000 . = 0xfffd0000 0x00000000fffd0000 __text_start = .
.text 0x00000000fffd0000 0xa0a8 .... 0x00000000fffdc8b0 _image_binary_end = . 0x0000000000120000 . = 0x120000
.got 0x0000000000120000 0x4 .got 0x0000000000120000 0x4 arch/x86/cpu/start.o
Two things are strange here:
Why is SPL using 64bit addresses while the linker script is meant for 32bit?
Why is CONFIG_SPL_TEXT_BASE defined in .config if it is ignored?
These are some of the commands executed:
gcc -Wp,-MD,spl/net/.tftp.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/7/include -Iinclude -I./arch/x86/include -include ./include/linux/kconfig.h -D__KERNEL__ -D__UBOOT__ -DCONFIG_SPL_BUILD -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time -ffunction-sections -fdata-sections -fno-strict-aliasing -fomit-frame-pointer -fno-toplevel-reorder -fno-dwarf2-cfi-asm -march=i386 -m32 -mregparm=3 -D__I386__ -ffunction-sections -fvisibility=hidden -pipe -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(tftp)" -D"KBUILD_MODNAME=KBUILD_STR(tftp)" -c -o spl/net/tftp.o net/tftp.c ld.bfd -Bsymbolic -Bsymbolic-functions -m elf_i386 --emit-relocs -r -o spl/net/built-in.o spl/net/checksum.o spl/net/arp.o spl/net/bootp.o spl/net/eth-uclass.o spl/net/eth_common.o spl/net/net.o spl/net/ping.o spl/net/tftp.o gcc -E -Wp,-MD,spl/.u-boot-spl.lds.d -D__KERNEL__ -D__UBOOT__ -DCONFIG_SPL_BUILD -fno-strict-aliasing -fomit-frame-pointer -fno-toplevel-reorder -fno-dwarf2-cfi-asm -march=i386 -m32 -mregparm=3 -D__I386__ -ffunction-sections -fvisibility=hidden -pipe -Iinclude -I./arch/x86/include -include ./include/linux/kconfig.h -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/7/include -DRESET_SEG_START=0xffff0000 -DRESET_SEG_SIZE=0x10000 -DRESET_VEC_LOC=0xfffffff0 -DSTART_16=0xfffff800 -DRESET_BASE="CONFIG_SYS_TEXT_BASE + (CONFIG_SYS_MONITOR_LEN - RESET_SEG_SIZE)" -include ./include/u-boot/u-boot.lds.h -include ./include/config.h -DCPUDIR=arch/x86/cpu -ansi -D__ASSEMBLY__ -x assembler-with-cpp -P -o spl/u-boot-spl.lds arch/x86/cpu/u-boot-spl.lds (cd spl && ld.bfd -Bsymbolic -Bsymbolic-functions -m elf_i386 --emit-relocs -T u-boot-spl.lds --gc-sections -Bstatic --gc-sections --no-dynamic-linker -Ttext 0xfffd0000 arch/x86/cpu/start.o arch/x86/cpu/start16.o arch/x86/cpu/resetvec.o --start-group arch/x86/cpu/built-in.o arch/x86/lib/built-in.o board/emulation/qemu-x86/built-in.o common/spl/built-in.o common/init/built-in.o common/built-in.o cmd/built-in.o env/built-in.o lib/built-in.o drivers/built-in.o dts/built-in.o fs/built-in.o net/built-in.o --end-group arch/x86/lib/lib.a -Map u-boot-spl.map -o u-boot-spl) objcopy -O binary -R .start16 -R .resetvec spl/u-boot-spl spl/u-boot-spl-nodtb.bin cp dts/dt-spl.dtb spl/u-boot-spl.dtb
Observe: ld.bfd -Ttext 0xfffd0000 This value is from include/configs/qemu-x86.h
On the other side we have spl/u-boot-spl.lds with . = 0x120000;
This results in the size close to 4GB of the generated SPL image.
The change below relsolves the problem on qemu-x86_64_defconfig but I am not sure why the value 0x1200000 was introduced first hand in your patch 3c2dd537c772 ("x86: Add a link script for SPL")
diff --git a/arch/x86/cpu/u-boot-spl.lds b/arch/x86/cpu/u-boot-spl.lds index 8a38d58f123..75be5cf5db8 100644 --- a/arch/x86/cpu/u-boot-spl.lds +++ b/arch/x86/cpu/u-boot-spl.lds @@ -39,7 +39,7 @@ SECTIONS
_image_binary_end = .;
- . = 0x120000; + . = 0xffff0000; .bss (OVERLAY) : { __bss_start = .; *(.bss*)
Could you, please, help to resolve the issue.
Best regards
Heinrich