[PATCH v8 5/8] sandbox: Report host default-filename in native mode
Heinrich Schuchardt
xypron.glpk at gmx.de
Mon Oct 28 20:04:07 CET 2024
On 10/25/24 11:56, Ilias Apalodimas wrote:
> Hi Simon,
>
>
> On Tue, 22 Oct 2024 at 15:00, Simon Glass <sjg at chromium.org> wrote:
>>
>> When the --native flag is given, pretend to be running the host
>> architecture rather than sandbox.
>>
>> Add an 'efidebug filename' command to report it.
>
> Heinrich does this allow you to continue your testing in native archs?
>
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>> 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))
Please, add a warning here:
log_warn("You are using the sandbox in non-compliant mode\n");
The riscv64 sandbox can only run riscv64 binaries
The arm64 sandbox can only run arm64 binary.
We cannot expect a DHCP server to do the expected with the value 0.
So why should we introduce this?
>> + return 0; /* not used */
The following comment would fit better:
/* This breaks PXE booting on the sandbox.*/
Best regards
Heinrich
>> +
>> + 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
>
> #if IS_ENABLED(CONFIG_SANDBOX) is preferred no ?
>
>> + 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
>>
>
> Thanks
> /Ilias
More information about the U-Boot
mailing list