When the --native flag is given, pretend to be running the host
architecture rather than sandbox.

Add an 'efidebug filename' command to report it.

Signed-off-by: Simon Glass <[email protected]>
---

Changes in v8:
- Add new patch to report host default-filename in native mode

 boot/bootmeth_efi.c | 25 ++------------------
 boot/efi_fname.c    | 57 +++++++++++++++++++++++++++++++++------------
 cmd/efidebug.c      | 25 ++++++++++++++++++++
 include/efi.h       | 25 ++++++++++++++++++++
 4 files changed, 94 insertions(+), 38 deletions(-)

diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
index 371b36d550b..f836aa655f5 100644
--- a/boot/bootmeth_efi.c
+++ b/boot/bootmeth_efi.c
@@ -25,32 +25,11 @@
 
 #define EFI_DIRNAME    "/EFI/BOOT/"
 
-static int get_efi_pxe_arch(void)
-{
-       /* 
http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */
-       if (IS_ENABLED(CONFIG_ARM64))
-               return 0xb;
-       else if (IS_ENABLED(CONFIG_ARM))
-               return 0xa;
-       else if (IS_ENABLED(CONFIG_X86_64))
-               return 0x6;
-       else if (IS_ENABLED(CONFIG_X86))
-               return 0x7;
-       else if (IS_ENABLED(CONFIG_ARCH_RV32I))
-               return 0x19;
-       else if (IS_ENABLED(CONFIG_ARCH_RV64I))
-               return 0x1b;
-       else if (IS_ENABLED(CONFIG_SANDBOX))
-               return 0;       /* not used */
-
-       return -EINVAL;
-}
-
 static int get_efi_pxe_vci(char *str, int max_len)
 {
        int ret;
 
-       ret = get_efi_pxe_arch();
+       ret = efi_get_pxe_arch();
        if (ret < 0)
                return ret;
 
@@ -239,7 +218,7 @@ static int distro_efi_read_bootflow_net(struct bootflow 
*bflow)
        ret = get_efi_pxe_vci(str, sizeof(str));
        if (ret)
                return log_msg_ret("vci", ret);
-       ret = get_efi_pxe_arch();
+       ret = efi_get_pxe_arch();
        if (ret < 0)
                return log_msg_ret("arc", ret);
        arch = ret;
diff --git a/boot/efi_fname.c b/boot/efi_fname.c
index a6b11383bba..790f9e2fa36 100644
--- a/boot/efi_fname.c
+++ b/boot/efi_fname.c
@@ -9,29 +9,34 @@
  */
 
 #include <efi.h>
+#include <errno.h>
 #include <host_arch.h>
 
-#ifdef CONFIG_SANDBOX
-
 #if HOST_ARCH == HOST_ARCH_X86_64
-#define BOOTEFI_NAME "BOOTX64.EFI"
+#define HOST_BOOTEFI_NAME "BOOTX64.EFI"
+#define HOST_PXE_ARCH 0x6
 #elif HOST_ARCH == HOST_ARCH_X86
-#define BOOTEFI_NAME "BOOTIA32.EFI"
+#define HOST_BOOTEFI_NAME "BOOTIA32.EFI"
+#define HOST_PXE_ARCH 0x7
 #elif HOST_ARCH == HOST_ARCH_AARCH64
-#define BOOTEFI_NAME "BOOTAA64.EFI"
+#define HOST_BOOTEFI_NAME "BOOTAA64.EFI"
+#define HOST_PXE_ARCH 0xb
 #elif HOST_ARCH == HOST_ARCH_ARM
-#define BOOTEFI_NAME "BOOTARM.EFI"
+#define HOST_BOOTEFI_NAME "BOOTARM.EFI"
+#define HOST_PXE_ARCH 0xa
 #elif HOST_ARCH == HOST_ARCH_RISCV32
-#define BOOTEFI_NAME "BOOTRISCV32.EFI"
+#define HOST_BOOTEFI_NAME "BOOTRISCV32.EFI"
+#define HOST_PXE_ARCH 0x19
 #elif HOST_ARCH == HOST_ARCH_RISCV64
-#define BOOTEFI_NAME "BOOTRISCV64.EFI"
+#define HOST_BOOTEFI_NAME "BOOTRISCV64.EFI"
+#define HOST_PXE_ARCH 0x1b
 #else
-#error Unsupported UEFI architecture
+#error Unsupported Host architecture
 #endif
 
-#else
-
-#if defined(CONFIG_ARM64)
+#if defined(CONFIG_SANDBOX)
+#define BOOTEFI_NAME "BOOTSBOX.EFI"
+#elif defined(CONFIG_ARM64)
 #define BOOTEFI_NAME "BOOTAA64.EFI"
 #elif defined(CONFIG_ARM)
 #define BOOTEFI_NAME "BOOTARM.EFI"
@@ -47,9 +52,31 @@
 #error Unsupported UEFI architecture
 #endif
 
-#endif
-
 const char *efi_get_basename(void)
 {
-       return BOOTEFI_NAME;
+       return efi_use_host_arch() ? HOST_BOOTEFI_NAME : BOOTEFI_NAME;
+}
+
+int efi_get_pxe_arch(void)
+{
+       if (efi_use_host_arch())
+               return HOST_PXE_ARCH;
+
+       /* 
http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */
+       if (IS_ENABLED(CONFIG_ARM64))
+               return 0xb;
+       else if (IS_ENABLED(CONFIG_ARM))
+               return 0xa;
+       else if (IS_ENABLED(CONFIG_X86_64))
+               return 0x6;
+       else if (IS_ENABLED(CONFIG_X86))
+               return 0x7;
+       else if (IS_ENABLED(CONFIG_ARCH_RV32I))
+               return 0x19;
+       else if (IS_ENABLED(CONFIG_ARCH_RV64I))
+               return 0x1b;
+       else if (IS_ENABLED(CONFIG_SANDBOX))
+               return 0;       /* not used */
+
+       return -EINVAL;
 }
diff --git a/cmd/efidebug.c b/cmd/efidebug.c
index e040fe75fa1..02f1e080e88 100644
--- a/cmd/efidebug.c
+++ b/cmd/efidebug.c
@@ -511,6 +511,27 @@ static int do_efi_show_images(struct cmd_tbl *cmdtp, int 
flag,
        return CMD_RET_SUCCESS;
 }
 
+/**
+ * do_efi_show_defaults() - show UEFI default filename and PXE architecture
+ *
+ * @cmdtp:     Command table
+ * @flag:      Command flag
+ * @argc:      Number of arguments
+ * @argv:      Argument array
+ * Return:     CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
+ *
+ * Implement efidebug "defaults" sub-command.
+ * Shows the default EFI filename and PXE architecture
+ */
+static int do_efi_show_defaults(struct cmd_tbl *cmdtp, int flag,
+                               int argc, char *const argv[])
+{
+       printf("Default boot path: EFI\\BOOT\\%s\n", efi_get_basename());
+       printf("PXE arch: 0x%02x\n", efi_get_pxe_arch());
+
+       return CMD_RET_SUCCESS;
+}
+
 static const char * const efi_mem_type_string[] = {
        [EFI_RESERVED_MEMORY_TYPE] = "RESERVED",
        [EFI_LOADER_CODE] = "LOADER CODE",
@@ -1561,6 +1582,8 @@ static struct cmd_tbl cmd_efidebug_sub[] = {
                         "", ""),
        U_BOOT_CMD_MKENT(dh, CONFIG_SYS_MAXARGS, 1, do_efi_show_handles,
                         "", ""),
+       U_BOOT_CMD_MKENT(defaults, CONFIG_SYS_MAXARGS, 1, do_efi_show_defaults,
+                        "", ""),
        U_BOOT_CMD_MKENT(images, CONFIG_SYS_MAXARGS, 1, do_efi_show_images,
                         "", ""),
        U_BOOT_CMD_MKENT(memmap, CONFIG_SYS_MAXARGS, 1, do_efi_show_memmap,
@@ -1653,6 +1676,8 @@ U_BOOT_LONGHELP(efidebug,
        "  - show UEFI drivers\n"
        "efidebug dh\n"
        "  - show UEFI handles\n"
+       "efidebug defaults\n"
+       "  - show default EFI filename and PXE architecture\n"
        "efidebug images\n"
        "  - show loaded images\n"
        "efidebug memmap\n"
diff --git a/include/efi.h b/include/efi.h
index 1b8093bd4d3..70bb47e742f 100644
--- a/include/efi.h
+++ b/include/efi.h
@@ -678,4 +678,29 @@ void efi_show_tables(struct efi_system_table *systab);
  */
 const char *efi_get_basename(void);
 
+#ifdef CONFIG_SANDBOX
+#include <asm/state.h>
+#endif
+
+static inline bool efi_use_host_arch(void)
+{
+#ifdef CONFIG_SANDBOX
+       struct sandbox_state *state = state_get_current();
+
+       return state->native;
+#else
+       return false;
+#endif
+}
+
+/**
+ * efi_get_pxe_arch() - Get the architecture value for PXE
+ *
+ * See:
+ * http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml
+ *
+ * Return: Architecture value
+ */
+int efi_get_pxe_arch(void);
+
 #endif /* _LINUX_EFI_H */
-- 
2.43.0

Reply via email to