efi: Create a 64-bit app
authorSimon Glass <sjg@chromium.org>
Thu, 4 Nov 2021 03:09:07 +0000 (21:09 -0600)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 7 Nov 2021 17:36:55 +0000 (18:36 +0100)
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@chromium.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
14 files changed:
MAINTAINERS
Makefile
arch/x86/cpu/u-boot-64.lds
arch/x86/cpu/x86_64/Makefile
arch/x86/cpu/x86_64/cpu.c
arch/x86/cpu/x86_64/misc.c [new file with mode: 0644]
board/efi/Kconfig
board/efi/efi-x86_app/Kconfig
board/efi/efi-x86_app/MAINTAINERS
configs/efi-x86_app32_defconfig [new file with mode: 0644]
configs/efi-x86_app64_defconfig [new file with mode: 0644]
configs/efi-x86_app_defconfig [deleted file]
doc/develop/uefi/u-boot_on_efi.rst
lib/efi_loader/Kconfig

index fa7fe90070515a05edfe476c806be1ba072149d5..00ff572d4d23e99e2542c49728b6d520368349ca 100644 (file)
@@ -709,6 +709,9 @@ M:  Simon Glass <sjg@chromium.org>
 M:     Heinrich Schuchardt <xypron.glpk@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
 
index bf78009e3703ff94a82e34afe41a12811d250918..ea884fec26f95966fd99491d7441f08731f59086 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1756,12 +1756,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
index ee0812aefbc2f2c6a6f132db5f2f540d844f050c..92a30c2a387d25d0361aa53efe814b6cd12bd0ac 100644 (file)
@@ -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); }
index 400f0ffe397d11c43b9b6a469e2b3f7d565c8518..e929563b2c11a81424a67bcef24c55bf8f7419e1 100644 (file)
@@ -4,3 +4,7 @@
 #
 
 obj-y += cpu.o interrupts.o setjmp.o
+
+ifndef CONFIG_EFI
+obj-y += misc.o
+endif
index 90a766c3c5733a7e42ff9e5f4b4155d095ab7d88..8f72c9951a1f88223d4d85971bbf66559e84bc02 100644 (file)
@@ -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 (file)
index 0000000..02587ff
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2016 Google, Inc
+ * Written by Simon Glass <sjg@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
index 291bd2ca154ac08906a5cc9db9332384dca5e1c6..3df6e31c8ba06c6befcf0294c7f8a61a0b67f672 100644 (file)
@@ -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
index ae87bf34d37929c06785fd9e2528d909a094431a..e412702eed7377576a346243b1378dc96e7cac5e 100644 (file)
@@ -1,4 +1,4 @@
-if TARGET_EFI_APP
+if EFI_APP
 
 config SYS_BOARD
        default "efi-x86_app"
index fb8a6b1c2fab5e90aff64a9189a637f6922d02d8..b292811a8f081db62509ba18074a2d9deadb0b5e 100644 (file)
@@ -1,6 +1,13 @@
-EFI-X86_APP BOARD
+EFI-X86_APP32 BOARD
 M:     Simon Glass <sjg@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@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_app32_defconfig b/configs/efi-x86_app32_defconfig
new file mode 100644 (file)
index 0000000..480ef64
--- /dev/null
@@ -0,0 +1,37 @@
+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_APP32=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
diff --git a/configs/efi-x86_app64_defconfig b/configs/efi-x86_app64_defconfig
new file mode 100644 (file)
index 0000000..bffbf69
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/configs/efi-x86_app_defconfig b/configs/efi-x86_app_defconfig
deleted file mode 100644 (file)
index f0bc877..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-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_APP=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
index 8856af3db56bcc4e8abf628cace0a8873aff7653..f275a524ce7972e85a5ce8177b40dd8f51b4f3af 100644 (file)
@@ -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
@@ -261,7 +261,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
 
index 52f71c07c9919db5ae178eb0701e205022e8fe06..700dc838ddb9d2a4f1cb106bc9d5eef375600792 100644 (file)
@@ -12,6 +12,7 @@ config EFI_LOADER
        depends on !EFI_STUB || !X86 || X86_64 || EFI_STUB_32BIT
        depends on BLK
        depends on DM_ETH || !NET
+       depends on !EFI_APP
        default y if !ARM || SYS_CPU = armv7 || SYS_CPU = armv8
        select LIB_UUID
        select PARTITION_UUIDS