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

Simon Glass sjg at chromium.org
Fri Jul 31 17:45:53 CEST 2015


Hi Bin,

On 23 July 2015 at 09:45, Bin Meng <bmeng.cn at 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 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(-)

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

Regards,
Simon


More information about the U-Boot mailing list