[U-Boot] [BUG] efi_loader: LUV test and SCT test fail on minnowboard

Hello Shubha,
On 05/17/2018 09:40 PM, Macheeri Ramaswamy, ShubhashreeX wrote:
I could successfully install build and flash the uboot with uefi over minnowboard (from Intel) and could use a serial console to see the prints.
On 05/18/2018 12:39 AM, Macheeri Ramaswamy, ShubhashreeX wrote:
We tried running LUV test and SCT test, but both failed.
In qemu-system-x86 I am able to load 32 bit GRUB via EFI but never succeeded to boot Linux. Linux used the video memory. And of cause video memory is overwritten by console output.
Part of a solution might be unmerged patch https://patchwork.ozlabs.org/patch/860400/ efi_loader: memory reservations according to e820 table but this patch needs rework as indicated by Alex.
On x86_64 an implementation of setjmp() and longjmp() is missing. These are necessary to use the Exit() boot service or to directly return from an EFI binary.
On Debian building for x86_64 fails without this rejected patch: https://patchwork.ozlabs.org/patch/812655/ spl: u-boot-spl-nodtb.bin: remove .got and .got.plt sections
Best regards
Heinrich

Thanks Heinrich for the valuable inputs!
Regards shubha
-----Original Message----- From: Heinrich Schuchardt [mailto:xypron.glpk@gmx.de] Sent: Friday, May 18, 2018 11:38 PM To: Macheeri Ramaswamy, ShubhashreeX shubhashreex.macheeri.ramaswamy@intel.com Cc: Alexander Graf agraf@suse.de; U-Boot Mailing List u-boot@lists.denx.de; AKASHI, Takahiro takahiro.akashi@linaro.org; Simon Glass sjg@chromium.org Subject: [BUG] efi_loader: LUV test and SCT test fail on minnowboard
Hello Shubha,
On 05/17/2018 09:40 PM, Macheeri Ramaswamy, ShubhashreeX wrote:
I could successfully install build and flash the uboot with uefi over minnowboard (from Intel) and could use a serial console to see the prints.
On 05/18/2018 12:39 AM, Macheeri Ramaswamy, ShubhashreeX wrote:
We tried running LUV test and SCT test, but both failed.
In qemu-system-x86 I am able to load 32 bit GRUB via EFI but never succeeded to boot Linux. Linux used the video memory. And of cause video memory is overwritten by console output.
Part of a solution might be unmerged patch https://patchwork.ozlabs.org/patch/860400/ efi_loader: memory reservations according to e820 table but this patch needs rework as indicated by Alex.
On x86_64 an implementation of setjmp() and longjmp() is missing. These are necessary to use the Exit() boot service or to directly return from an EFI binary.
On Debian building for x86_64 fails without this rejected patch: https://patchwork.ozlabs.org/patch/812655/ spl: u-boot-spl-nodtb.bin: remove .got and .got.plt sections
Best regards
Heinrich

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

Hi Heinrich,
On 22 May 2018 at 13:29, Heinrich Schuchardt xypron.glpk@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
participants (3)
-
Heinrich Schuchardt
-
Macheeri Ramaswamy, ShubhashreeX
-
Simon Glass