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

Bin Meng bmeng.cn at gmail.com
Thu Jul 23 17:45:27 CEST 2015


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 at 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 at 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



More information about the U-Boot mailing list