[U-Boot] [RFC PATCH] efi: Another way to create u-boot payload for EFI

This approach is different from Simon's approach. It uses objcopy to convert u-boot-dtb.bin into an ELF object with all the binary content included in the .data section. This elinimates the need to include a special section in the payload's linker script. Also there is no need to add any ASFLAGS_REMOVE for u-boot-dtb.o.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
--- This patch needs to be applied on top of Simon's efi series.
Makefile | 21 +++++---------------- arch/x86/config.mk | 6 +++++- arch/x86/cpu/efi/elf_ia32_efi.lds | 3 --- arch/x86/cpu/efi/elf_x86_64_efi.lds | 3 --- include/efi.h | 2 +- lib/efi/efi_stub.c | 5 +++-- scripts/Makefile.build | 8 -------- 7 files changed, 14 insertions(+), 34 deletions(-)
diff --git a/Makefile b/Makefile index 6e3edb4..02aaa9e 100644 --- a/Makefile +++ b/Makefile @@ -789,6 +789,9 @@ cmd_objcopy = $(OBJCOPY) --gap-fill=0xff $(OBJCOPYFLAGS) \ quiet_cmd_zobjcopy = OBJCOPY $@ cmd_zobjcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
+quiet_cmd_efipayload = OBJCOPY $@ +cmd_efipayload = $(OBJCOPY) -I binary -O $(EFIPAYLOAD_BFDTARGET) -B $(EFIPAYLOAD_BFDARCH) $< $@ + quiet_cmd_mkimage = MKIMAGE $@ cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \ $(if $(KBUILD_VERBOSE:1=), >/dev/null) @@ -1086,22 +1089,8 @@ OBJCOPYFLAGS_u-boot.efi := $(OBJCOPYFLAGS_EFI) u-boot.efi: u-boot FORCE $(call if_changed,zobjcopy)
-# Generate an assembly file to wrap a binary file -quiet_cmd_bin_S = BIN $@ -cmd_bin_S = \ -( \ - echo '.section .u_boot_bin.init.rodata,"a"'; \ - echo '.balign 16'; \ - echo '.global __u_boot_bin_begin'; \ - echo '__u_boot_bin_begin:'; \ - echo '.incbin "$<" '; \ - echo '__u_boot_bin_end:'; \ - echo '.global __u_boot_bin_end'; \ - echo '.balign 16'; \ -) > $@ - -u-boot-dtb.bin.S: u-boot-dtb.bin FORCE - $(call if_changed,bin_S) +u-boot-dtb.bin.o: u-boot-dtb.bin FORCE + $(call if_changed,efipayload)
u-boot-payload.lds: $(LDSCRIPT_EFI) FORCE $(call if_changed_dep,cpp_lds) diff --git a/arch/x86/config.mk b/arch/x86/config.mk index 5107b43..7cebceb 100644 --- a/arch/x86/config.mk +++ b/arch/x86/config.mk @@ -36,12 +36,16 @@ OBJCOPYFLAGS_EFI := -j .text -j .sdata -j .data -j .dynamic -j .dynsym \ CFLAGS_NON_EFI := -mregparm=3 CFLAGS_EFI := -fpic -fshort-wchar $(call cc-option, -mno-red-zone)
-ifeq ($(CONFIG_X86_64)$(CONFIG_EFI_STUB_64BIT),) +ifeq ($(CONFIG_EFI_STUB_64BIT),) EFIARCH=ia32 +EFIPAYLOAD_BFDTARGET = elf32-i386 else EFIARCH=x86_64 +EFIPAYLOAD_BFDTARGET = elf64-x86-64 endif
+EFIPAYLOAD_BFDARCH = i386 + LDSCRIPT_EFI := $(srctree)/$(CPUDIR)/efi/elf_$(EFIARCH)_efi.lds EFISTUB := crt0-efi-$(EFIARCH).o reloc_$(EFIARCH).o OBJCOPYFLAGS_EFI += --target=efi-app-$(EFIARCH) diff --git a/arch/x86/cpu/efi/elf_ia32_efi.lds b/arch/x86/cpu/efi/elf_ia32_efi.lds index 87ddb4d..fca008b 100644 --- a/arch/x86/cpu/efi/elf_ia32_efi.lds +++ b/arch/x86/cpu/efi/elf_ia32_efi.lds @@ -57,9 +57,6 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); . = ALIGN(8); KEEP(*(.dtb*)); - /* Keep U-Boot payload */ - . = ALIGN(8); - KEEP(*(.u_boot_bin.*)); } .dynamic : { *(.dynamic) } . = ALIGN(4096); diff --git a/arch/x86/cpu/efi/elf_x86_64_efi.lds b/arch/x86/cpu/efi/elf_x86_64_efi.lds index 369f146..dcb2fee 100644 --- a/arch/x86/cpu/efi/elf_x86_64_efi.lds +++ b/arch/x86/cpu/efi/elf_x86_64_efi.lds @@ -57,9 +57,6 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); . = ALIGN(8); KEEP(*(.dtb*)); - /* Keep U-Boot payload */ - . = ALIGN(8); - KEEP(*(.u_boot_bin.*)); }
. = ALIGN(4096); diff --git a/include/efi.h b/include/efi.h index edc8cd9..36d6d17 100644 --- a/include/efi.h +++ b/include/efi.h @@ -269,7 +269,7 @@ struct efi_priv { extern char ImageBase[];
/* Start and end of U-Boot image (for payload) */ -extern char __u_boot_bin_begin[], __u_boot_bin_end[]; +extern char _binary_u_boot_dtb_bin_start[], _binary_u_boot_dtb_bin_end[];
/** * efi_get_sys_table() - Get access to the main EFI system table diff --git a/lib/efi/efi_stub.c b/lib/efi/efi_stub.c index 36f14ff..279ff4a 100644 --- a/lib/efi/efi_stub.c +++ b/lib/efi/efi_stub.c @@ -325,8 +325,9 @@ efi_status_t efi_main(efi_handle_t image, struct efi_system_table *sys_table) /* The EFI UART won't work now, switch to a debug one */ use_uart = true;
- memcpy((void *)CONFIG_SYS_TEXT_BASE, __u_boot_bin_begin, - (ulong)__u_boot_bin_end - (ulong)__u_boot_bin_begin); + memcpy((void *)CONFIG_SYS_TEXT_BASE, _binary_u_boot_dtb_bin_start, + (ulong)_binary_u_boot_dtb_bin_end - + (ulong)_binary_u_boot_dtb_bin_start);
#ifdef DEBUG puts("EFI table at "); diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 9a7d28d..ac0554e 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -294,14 +294,6 @@ $(obj)/%.lst: $(src)/%.c FORCE # Compile assembler sources (.S) # ---------------------------------------------------------------------------
-# TODO(sjg@chromium.org): Move this to a sensible place. It does not seem to -# work if placed in arch/x86/config.mk, etc. It is placed here so that -# we use the correct flags when assembling u-boot-dtb.bin.S. -ifdef CONFIG_X86 -AFLAGS_REMOVE_u-boot-dtb.bin.o += -mregparm=3 -march=i386 -m32 -AFLAGS_u-boot-dtb.bin.o += -fpic -fshort-wchar -endif - modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)

Hi Bin,
On 23 July 2015 at 09:45, Bin Meng bmeng.cn@gmail.com wrote:
This approach is different from Simon's approach. It uses objcopy to convert u-boot-dtb.bin into an ELF object with all the binary content included in the .data section. This elinimates the need to include a special section in the payload's linker script. Also there is no need to add any ASFLAGS_REMOVE for u-boot-dtb.o.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
This patch needs to be applied on top of Simon's efi series.
Makefile | 21 +++++---------------- arch/x86/config.mk | 6 +++++- arch/x86/cpu/efi/elf_ia32_efi.lds | 3 --- arch/x86/cpu/efi/elf_x86_64_efi.lds | 3 --- include/efi.h | 2 +- lib/efi/efi_stub.c | 5 +++-- scripts/Makefile.build | 8 -------- 7 files changed, 14 insertions(+), 34 deletions(-)
This is the way that device tree used to work. It was painful to have to specify the architecture for all the boards. In fact we had code to work it out. My only concern with this approach is that we add the required for each arch to do this. However only x86 is currently support and I don't think it is much of a burden. Also it is good to get rid of the Makefile hack and this solution is overall tidier.
Do you think we should apply it over the top of my existing patches? For now I have merged it into the two patches that need it.
diff --git a/Makefile b/Makefile index 6e3edb4..02aaa9e 100644 --- a/Makefile +++ b/Makefile @@ -789,6 +789,9 @@ cmd_objcopy = $(OBJCOPY) --gap-fill=0xff $(OBJCOPYFLAGS) \ quiet_cmd_zobjcopy = OBJCOPY $@ cmd_zobjcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
+quiet_cmd_efipayload = OBJCOPY $@ +cmd_efipayload = $(OBJCOPY) -I binary -O $(EFIPAYLOAD_BFDTARGET) -B $(EFIPAYLOAD_BFDARCH) $< $@
quiet_cmd_mkimage = MKIMAGE $@ cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \ $(if $(KBUILD_VERBOSE:1=), >/dev/null) @@ -1086,22 +1089,8 @@ OBJCOPYFLAGS_u-boot.efi := $(OBJCOPYFLAGS_EFI) u-boot.efi: u-boot FORCE $(call if_changed,zobjcopy)
-# Generate an assembly file to wrap a binary file -quiet_cmd_bin_S = BIN $@ -cmd_bin_S = \ -( \
echo '.section .u_boot_bin.init.rodata,"a"'; \
echo '.balign 16'; \
echo '.global __u_boot_bin_begin'; \
echo '__u_boot_bin_begin:'; \
echo '.incbin "$<" '; \
echo '__u_boot_bin_end:'; \
echo '.global __u_boot_bin_end'; \
echo '.balign 16'; \
-) > $@
-u-boot-dtb.bin.S: u-boot-dtb.bin FORCE
$(call if_changed,bin_S)
+u-boot-dtb.bin.o: u-boot-dtb.bin FORCE
$(call if_changed,efipayload)
u-boot-payload.lds: $(LDSCRIPT_EFI) FORCE $(call if_changed_dep,cpp_lds) diff --git a/arch/x86/config.mk b/arch/x86/config.mk index 5107b43..7cebceb 100644 --- a/arch/x86/config.mk +++ b/arch/x86/config.mk @@ -36,12 +36,16 @@ OBJCOPYFLAGS_EFI := -j .text -j .sdata -j .data -j .dynamic -j .dynsym \ CFLAGS_NON_EFI := -mregparm=3 CFLAGS_EFI := -fpic -fshort-wchar $(call cc-option, -mno-red-zone)
-ifeq ($(CONFIG_X86_64)$(CONFIG_EFI_STUB_64BIT),) +ifeq ($(CONFIG_EFI_STUB_64BIT),) EFIARCH=ia32 +EFIPAYLOAD_BFDTARGET = elf32-i386 else EFIARCH=x86_64 +EFIPAYLOAD_BFDTARGET = elf64-x86-64 endif
+EFIPAYLOAD_BFDARCH = i386
LDSCRIPT_EFI := $(srctree)/$(CPUDIR)/efi/elf_$(EFIARCH)_efi.lds EFISTUB := crt0-efi-$(EFIARCH).o reloc_$(EFIARCH).o OBJCOPYFLAGS_EFI += --target=efi-app-$(EFIARCH) diff --git a/arch/x86/cpu/efi/elf_ia32_efi.lds b/arch/x86/cpu/efi/elf_ia32_efi.lds index 87ddb4d..fca008b 100644 --- a/arch/x86/cpu/efi/elf_ia32_efi.lds +++ b/arch/x86/cpu/efi/elf_ia32_efi.lds @@ -57,9 +57,6 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); . = ALIGN(8); KEEP(*(.dtb*));
/* Keep U-Boot payload */
. = ALIGN(8);
KEEP(*(.u_boot_bin.*)); } .dynamic : { *(.dynamic) } . = ALIGN(4096);
diff --git a/arch/x86/cpu/efi/elf_x86_64_efi.lds b/arch/x86/cpu/efi/elf_x86_64_efi.lds index 369f146..dcb2fee 100644 --- a/arch/x86/cpu/efi/elf_x86_64_efi.lds +++ b/arch/x86/cpu/efi/elf_x86_64_efi.lds @@ -57,9 +57,6 @@ SECTIONS KEEP(*(SORT(.u_boot_list*))); . = ALIGN(8); KEEP(*(.dtb*));
/* Keep U-Boot payload */
. = ALIGN(8);
KEEP(*(.u_boot_bin.*)); } . = ALIGN(4096);
diff --git a/include/efi.h b/include/efi.h index edc8cd9..36d6d17 100644 --- a/include/efi.h +++ b/include/efi.h @@ -269,7 +269,7 @@ struct efi_priv { extern char ImageBase[];
/* Start and end of U-Boot image (for payload) */ -extern char __u_boot_bin_begin[], __u_boot_bin_end[]; +extern char _binary_u_boot_dtb_bin_start[], _binary_u_boot_dtb_bin_end[];
/**
- efi_get_sys_table() - Get access to the main EFI system table
diff --git a/lib/efi/efi_stub.c b/lib/efi/efi_stub.c index 36f14ff..279ff4a 100644 --- a/lib/efi/efi_stub.c +++ b/lib/efi/efi_stub.c @@ -325,8 +325,9 @@ efi_status_t efi_main(efi_handle_t image, struct efi_system_table *sys_table) /* The EFI UART won't work now, switch to a debug one */ use_uart = true;
memcpy((void *)CONFIG_SYS_TEXT_BASE, __u_boot_bin_begin,
(ulong)__u_boot_bin_end - (ulong)__u_boot_bin_begin);
memcpy((void *)CONFIG_SYS_TEXT_BASE, _binary_u_boot_dtb_bin_start,
(ulong)_binary_u_boot_dtb_bin_end -
(ulong)_binary_u_boot_dtb_bin_start);
#ifdef DEBUG puts("EFI table at "); diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 9a7d28d..ac0554e 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -294,14 +294,6 @@ $(obj)/%.lst: $(src)/%.c FORCE # Compile assembler sources (.S) # ---------------------------------------------------------------------------
-# TODO(sjg@chromium.org): Move this to a sensible place. It does not seem to -# work if placed in arch/x86/config.mk, etc. It is placed here so that -# we use the correct flags when assembling u-boot-dtb.bin.S. -ifdef CONFIG_X86 -AFLAGS_REMOVE_u-boot-dtb.bin.o += -mregparm=3 -march=i386 -m32 -AFLAGS_u-boot-dtb.bin.o += -fpic -fshort-wchar -endif
modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
1.8.2.1
Regards, Simon

Hi Simon,
On Fri, Jul 31, 2015 at 11:45 PM, Simon Glass sjg@chromium.org wrote:
Hi Bin,
On 23 July 2015 at 09:45, Bin Meng bmeng.cn@gmail.com wrote:
This approach is different from Simon's approach. It uses objcopy to convert u-boot-dtb.bin into an ELF object with all the binary content included in the .data section. This elinimates the need to include a special section in the payload's linker script. Also there is no need to add any ASFLAGS_REMOVE for u-boot-dtb.o.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
This patch needs to be applied on top of Simon's efi series.
Makefile | 21 +++++---------------- arch/x86/config.mk | 6 +++++- arch/x86/cpu/efi/elf_ia32_efi.lds | 3 --- arch/x86/cpu/efi/elf_x86_64_efi.lds | 3 --- include/efi.h | 2 +- lib/efi/efi_stub.c | 5 +++-- scripts/Makefile.build | 8 -------- 7 files changed, 14 insertions(+), 34 deletions(-)
This is the way that device tree used to work. It was painful to have to specify the architecture for all the boards. In fact we had code to work it out. My only concern with this approach is that we add the required for each arch to do this. However only x86 is currently support and I don't think it is much of a burden. Also it is good to get rid of the Makefile hack and this solution is overall tidier.
Do you think we should apply it over the top of my existing patches? For now I have merged it into the two patches that need it.
I am good for current v2 series. Thanks for merging it in.
[snip]
Regards, Bin
participants (2)
-
Bin Meng
-
Simon Glass