Hi Heinrich, On 22 May 2018 at 13:29, Heinrich Schuchardt <xypron.g...@gmx.de> wrote: > 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")
Looks wrong to me. It is the offset from the start of the SPI flash, but it should in fact be a memory address. So I think you need to change it so that the address is 0x1200000 from the beginning of SPI flash. which starts at 2^32 - <size of spi flash> > > 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. Your patch looks better, but do make sure that things end up in the right place. SPL needs its own place in the image. Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot