[PATCH v3 05/35] efi: Create a 64-bit app

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Oct 28 07:53:45 CEST 2021


On 10/26/21 5:30 AM, Simon Glass wrote:
> Most modern platforms use 64-bit EFI so it is useful to have a U-Boot app
> that runs under that. Add a (non-functional) build for this.
>
> Note that --whole-archive causes the gcc 9.2 linker to crash, so disable
> this for now. Once this is resolved, things should work.
>
> For now, avoid mentioning the documentation for the 64-bit app, since it
> does not work.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v3:
> - Default to 256MB of RAM for U-Boot instead of 32MB
>
> Changes in v2:
> - Add MAINTAINERS entry
> - Add a work-around to avoid a toolchain crash
>
>   MAINTAINERS                                   |  3 ++
>   Makefile                                      |  8 +++-
>   arch/x86/cpu/u-boot-64.lds                    |  2 +
>   arch/x86/cpu/x86_64/Makefile                  |  4 ++
>   arch/x86/cpu/x86_64/cpu.c                     | 17 --------
>   arch/x86/cpu/x86_64/misc.c                    | 25 ++++++++++++
>   board/efi/Kconfig                             | 15 ++++++-
>   board/efi/efi-x86_app/Kconfig                 |  2 +-
>   board/efi/efi-x86_app/MAINTAINERS             | 11 +++++-
>   ..._app_defconfig => efi-x86_app32_defconfig} |  2 +-
>   configs/efi-x86_app64_defconfig               | 39 +++++++++++++++++++
>   doc/develop/uefi/u-boot_on_efi.rst            |  6 +--
>   12 files changed, 106 insertions(+), 28 deletions(-)
>   create mode 100644 arch/x86/cpu/x86_64/misc.c
>   rename configs/{efi-x86_app_defconfig => efi-x86_app32_defconfig} (97%)
>   create mode 100644 configs/efi-x86_app64_defconfig
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index a46ef70d3cd..ca015e3f3e3 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -698,6 +698,9 @@ M:	Simon Glass <sjg at chromium.org>
>   M:	Heinrich Schuchardt <xypron.glpk at gmx.de>
>   S:	Maintained
>   W:	https://u-boot.readthedocs.io/en/latest/develop/uefi/u-boot_on_efi.html
> +F:	board/efi/efi-x86_app
> +F:	configs/efi-x86_app*
> +F:	doc/develop/uefi/u-boot_on_efi.rst
>   F:	lib/efi/efi_app.c
>   F:	scripts/build-efi.sh
>
> diff --git a/Makefile b/Makefile
> index fd2b328e021..1f043c380a5 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1753,12 +1753,16 @@ quiet_cmd_u-boot__ ?= LTO     $@
>   		-Wl,-Map,u-boot.map;						\
>   		$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
>   else
> +# Note: Linking efi-x86_app64 causes a segfault in the linker at present
> +# when using x86_64-linux-gnu-ld.bfd
> +# For now, disable --whole-archive which makes things link, although not
> +# correctly
>   quiet_cmd_u-boot__ ?= LD      $@
>         cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@		\
>   		-T u-boot.lds $(u-boot-init)					\
> -		--whole-archive							\
> +		$(if $(CONFIG_EFI_APP_64BIT),,--whole-archive)			\
>   			$(u-boot-main)						\
> -		--no-whole-archive						\
> +		$(if $(CONFIG_EFI_APP_64BIT),,--no-whole-archive)		\
>   		$(PLATFORM_LIBS) -Map u-boot.map;				\
>   		$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
>   endif
> diff --git a/arch/x86/cpu/u-boot-64.lds b/arch/x86/cpu/u-boot-64.lds
> index ee0812aefbc..92a30c2a387 100644
> --- a/arch/x86/cpu/u-boot-64.lds
> +++ b/arch/x86/cpu/u-boot-64.lds
> @@ -15,7 +15,9 @@ SECTIONS
>   	/DISCARD/ : { *(.u_boot_list_2_cmd_*) }
>   #endif
>
> +#ifdef CONFIG_SYS_TEXT_BASE
>   	. = CONFIG_SYS_TEXT_BASE;	/* Location of bootcode in flash */
> +#endif
>   	__text_start = .;
>
>   	.text.start : { *(.text.start); }
> diff --git a/arch/x86/cpu/x86_64/Makefile b/arch/x86/cpu/x86_64/Makefile
> index 400f0ffe397..e929563b2c1 100644
> --- a/arch/x86/cpu/x86_64/Makefile
> +++ b/arch/x86/cpu/x86_64/Makefile
> @@ -4,3 +4,7 @@
>   #
>
>   obj-y += cpu.o interrupts.o setjmp.o
> +
> +ifndef CONFIG_EFI
> +obj-y += misc.o
> +endif
> diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
> index 90a766c3c57..8f72c9951a1 100644
> --- a/arch/x86/cpu/x86_64/cpu.c
> +++ b/arch/x86/cpu/x86_64/cpu.c
> @@ -49,23 +49,6 @@ int x86_mp_init(void)
>   	return 0;
>   }
>
> -int misc_init_r(void)
> -{
> -	return 0;
> -}
> -
> -#ifndef CONFIG_SYS_COREBOOT
> -int checkcpu(void)
> -{
> -	return 0;
> -}
> -
> -int print_cpuinfo(void)
> -{
> -	return 0;
> -}
> -#endif
> -
>   int x86_cpu_reinit_f(void)
>   {
>   	return 0;
> diff --git a/arch/x86/cpu/x86_64/misc.c b/arch/x86/cpu/x86_64/misc.c
> new file mode 100644
> index 00000000000..02587ff0c50
> --- /dev/null
> +++ b/arch/x86/cpu/x86_64/misc.c
> @@ -0,0 +1,25 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * (C) Copyright 2016 Google, Inc
> + * Written by Simon Glass <sjg at chromium.org>
> + */
> +
> +#include <common.h>
> +#include <init.h>
> +
> +int misc_init_r(void)
> +{
> +	return 0;
> +}
> +
> +#ifndef CONFIG_SYS_COREBOOT
> +int checkcpu(void)
> +{
> +	return 0;
> +}
> +
> +int print_cpuinfo(void)
> +{
> +	return 0;
> +}
> +#endif
> diff --git a/board/efi/Kconfig b/board/efi/Kconfig
> index 291bd2ca154..3df6e31c8ba 100644
> --- a/board/efi/Kconfig
> +++ b/board/efi/Kconfig
> @@ -4,14 +4,25 @@ choice
>   	prompt "Mainboard model"
>   	optional
>
> -config TARGET_EFI_APP
> -	bool "efi application"
> +config TARGET_EFI_APP32
> +	bool "32-bit efi application"
> +	select EFI_APP
>   	help
>   	  This target is used for running U-Boot on top of EFI. In
>   	  this case EFI does the early initialisation, and U-Boot
>   	  takes over once the RAM, video and CPU are fully running.
>   	  U-Boot is loaded as an application from EFI.
>
> +config TARGET_EFI_APP64
> +	bool "64-bit efi application"
> +	select EFI_APP
> +	select X86_64
> +	help
> +	  This target is used for running U-Boot on top of EFI in 64-bit mode.
> +	  In this case EFI does the early initialisation, and U-Boot
> +	  takes over once the RAM, video and CPU are fully running.
> +	  U-Boot is loaded as an application from EFI.
> +
>   config TARGET_EFI_PAYLOAD
>   	bool "efi payload"
>   	help
> diff --git a/board/efi/efi-x86_app/Kconfig b/board/efi/efi-x86_app/Kconfig
> index ae87bf34d37..e412702eed7 100644
> --- a/board/efi/efi-x86_app/Kconfig
> +++ b/board/efi/efi-x86_app/Kconfig
> @@ -1,4 +1,4 @@
> -if TARGET_EFI_APP
> +if EFI_APP
>
>   config SYS_BOARD
>   	default "efi-x86_app"
> diff --git a/board/efi/efi-x86_app/MAINTAINERS b/board/efi/efi-x86_app/MAINTAINERS
> index fb8a6b1c2fa..b292811a8f0 100644
> --- a/board/efi/efi-x86_app/MAINTAINERS
> +++ b/board/efi/efi-x86_app/MAINTAINERS
> @@ -1,6 +1,13 @@
> -EFI-X86_APP BOARD
> +EFI-X86_APP32 BOARD
>   M:	Simon Glass <sjg at chromium.org>
>   S:	Maintained
>   F:	board/efi/efi-x86_app/
>   F:	include/configs/efi-x86_app.h
> -F:	configs/efi-x86_app_defconfig
> +F:	configs/efi-x86_app32_defconfig
> +
> +EFI-X86_APP64 BOARD
> +M:	Simon Glass <sjg at chromium.org>
> +S:	Maintained
> +F:	board/efi/efi-x86_app/
> +F:	include/configs/efi-x86_app.h
> +F:	configs/efi-x86_app64_defconfig
> diff --git a/configs/efi-x86_app_defconfig b/configs/efi-x86_app32_defconfig
> similarity index 97%
> rename from configs/efi-x86_app_defconfig
> rename to configs/efi-x86_app32_defconfig
> index 3f7c9ba9008..b22a86090a1 100644
> --- a/configs/efi-x86_app_defconfig
> +++ b/configs/efi-x86_app32_defconfig
> @@ -5,7 +5,7 @@ CONFIG_DEFAULT_DEVICE_TREE="efi-x86_app"
>   CONFIG_DEBUG_UART_BASE=0
>   CONFIG_DEBUG_UART_CLOCK=0
>   CONFIG_VENDOR_EFI=y
> -CONFIG_TARGET_EFI_APP=y
> +CONFIG_TARGET_EFI_APP32=y
>   CONFIG_DEBUG_UART=y
>   CONFIG_FIT=y
>   CONFIG_SHOW_BOOT_PROGRESS=y
> diff --git a/configs/efi-x86_app64_defconfig b/configs/efi-x86_app64_defconfig
> new file mode 100644
> index 00000000000..99fa43387f2
> --- /dev/null
> +++ b/configs/efi-x86_app64_defconfig
> @@ -0,0 +1,39 @@
> +CONFIG_X86=y
> +CONFIG_NR_DRAM_BANKS=8
> +CONFIG_ENV_SIZE=0x1000
> +CONFIG_DEFAULT_DEVICE_TREE="efi-x86_app"
> +CONFIG_DEBUG_UART_BASE=0
> +CONFIG_DEBUG_UART_CLOCK=0
> +CONFIG_VENDOR_EFI=y
> +CONFIG_TARGET_EFI_APP64=y
> +CONFIG_DEBUG_UART=y
> +CONFIG_FIT=y
> +CONFIG_SHOW_BOOT_PROGRESS=y
> +CONFIG_USE_BOOTARGS=y
> +CONFIG_BOOTARGS="root=/dev/sdb3 init=/sbin/init rootwait ro"
> +CONFIG_SYS_CONSOLE_INFO_QUIET=y
> +CONFIG_DISPLAY_BOARDINFO_LATE=y
> +CONFIG_LAST_STAGE_INIT=y
> +CONFIG_HUSH_PARSER=y
> +# CONFIG_CMD_BOOTM is not set
> +CONFIG_CMD_PART=y
> +# CONFIG_CMD_NET is not set
> +CONFIG_CMD_TIME=y
> +CONFIG_CMD_EXT2=y
> +CONFIG_CMD_EXT4=y
> +CONFIG_CMD_EXT4_WRITE=y
> +CONFIG_CMD_FAT=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_MAC_PARTITION=y
> +CONFIG_ISO_PARTITION=y
> +CONFIG_EFI_PARTITION=y
> +CONFIG_OF_EMBED=y
> +CONFIG_ENV_OVERWRITE=y
> +CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_REGMAP=y
> +CONFIG_SYSCON=y
> +# CONFIG_REGEX is not set
> +# CONFIG_GZIP is not set
> +CONFIG_EFI=y
> +CONFIG_EFI_APP_64BIT=y
> +# CONFIG_EFI_LOADER is not set

If CONFIG_EFI_LOADER generally does not work with the app shouldn't we
put this into a Kconfig condition (in a separate patch)?

Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

> diff --git a/doc/develop/uefi/u-boot_on_efi.rst b/doc/develop/uefi/u-boot_on_efi.rst
> index 4b2a733076d..d049f429fdc 100644
> --- a/doc/develop/uefi/u-boot_on_efi.rst
> +++ b/doc/develop/uefi/u-boot_on_efi.rst
> @@ -48,10 +48,10 @@ for that board. It will be either 32-bit or 64-bit. Alternatively, you can
>   opt for using QEMU [1] and the OVMF [2], as detailed below.
>
>   To build U-Boot as an EFI application (32-bit EFI required), enable CONFIG_EFI
> -and CONFIG_EFI_APP. The efi-x86_app config (efi-x86_app_defconfig) is set up
> +and CONFIG_EFI_APP. The efi-x86_app config (efi-x86_app32_defconfig) is set up
>   for this. Just build U-Boot as normal, e.g.::
>
> -   make efi-x86_app_defconfig
> +   make efi-x86_app32_defconfig
>      make
>
>   To build U-Boot as an EFI payload (32-bit or 64-bit EFI can be used), enable
> @@ -259,7 +259,7 @@ This work could be extended in a number of ways:
>
>   - Add ARM support
>
> -- Add 64-bit application support
> +- Add 64-bit application support (in progress)
>
>   - Figure out how to solve the interrupt problem
>
>



More information about the U-Boot mailing list