[PATCH v5 06/17] efi_loader: bootmgr: add booting from removable media
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu May 5 14:35:36 CEST 2022
On 5/5/22 14:20, Heinrich Schuchardt wrote:
> On 5/5/22 14:05, Mark Kettenis wrote:
>>> Date: Fri, 29 Apr 2022 19:03:22 +0200
>>> From: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>>
>>> On 4/28/22 10:09, Masahisa Kojima wrote:
>>>> From: AKASHI Takahiro <takahiro.akashi at linaro.org>
>>>>
>>>> Under the current implementation, booting from removable media using
>>>> a architecture-specific default image name, say BOOTAA64.EFI, is
>>>> supported only in distro_bootcmd script. See the commit 74522c898b35
>>>> ("efi_loader: Add distro boot script for removable media").
>>>>
>>>> This is, however, half-baked implementation because
>>>> 1) UEFI specification requires this feature to be implemented as part
>>>> of Boot Manager's responsibility:
>>>>
>>>> 3 - Boot Manager
>>>> 3.5.1 Boot via the Simple File Protocol
>>>> When booting via the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, the
>>>> FilePath will
>>>> start with a device path that points to the device that
>>>> implements the
>>>> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or the EFI_BLOCK_IO_PROTOCOL.
>>>> The next
>>>> part of the FilePath may point to the file name, including
>>>> subdirectories, which contain the bootable image. If the file
>>>> name is
>>>> a null device path, the file name must be generated from the rules
>>>> defined below.
>>>> ...
>>>> 3.5.1.1 Removable Media Boot Behavior
>>>> To generate a file name when none is present in the FilePath, the
>>>> firmware must append a default file name in the form
>>>> \EFI\BOOT\BOOT{machine type short-name}.EFI ...
>>>>
>>>> 2) So (1) entails the hehavior that the user's preference of boot media
>>>> order should be determined by Boot#### and BootOrder variables.
>>>>
>>>> With this patch, the semantics mentioned above is fully implemented.
>>>> For example, if you want to boot the system from USB and SCSI in this
>>>> order,
>>>> * define Boot0001 which contains only a device path to the USB device
>>>> (without any file path/name)
>>>> * define Boot0002 which contains only a device path to the SCSI device,
>>>> and
>>>> * set BootOrder to Boot0001:Boot0002
>>>>
>>>> To avoid build error for sandbox, default file name "BOOTSANDBOX.efi"
>>>> is defined even if it is out of scope of UEFI specification.
>>>>
>>>> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
>>>> Signed-off-by: Masahisa Kojima <masahisa.kojima at linaro.org>
>>>> ---
>>>> Changes in v5:
>>>> - add default file name definition for SANDBOX to avoid build error
>>>>
>>>> Changes from original version:
>>>> - create new include file "efi_default_filename.h" to
>>>> avoid conflict with config_distro_bootcmd.h
>>>> - modify the target pointer of efi_free_pool(), expand_media_path()
>>>> should
>>>> only free the pointer allocated by efi_dp_from_file() function.
>>>> include/config_distro_bootcmd.h | 14 +--------
>>>> include/efi_default_filename.h | 33 ++++++++++++++++++++++
>>>> lib/efi_loader/efi_bootmgr.c | 50
>>>> ++++++++++++++++++++++++++++++++-
>>>> 3 files changed, 83 insertions(+), 14 deletions(-)
>>>> create mode 100644 include/efi_default_filename.h
>>>>
>>>> diff --git a/include/config_distro_bootcmd.h
>>>> b/include/config_distro_bootcmd.h
>>>> index c55023889c..6a3110f27b 100644
>>>> --- a/include/config_distro_bootcmd.h
>>>> +++ b/include/config_distro_bootcmd.h
>>>> @@ -91,19 +91,7 @@
>>>> #endif
>>>>
>>>> #ifdef CONFIG_EFI_LOADER
>>>> -#if defined(CONFIG_ARM64)
>>>> -#define BOOTEFI_NAME "bootaa64.efi"
>>>> -#elif defined(CONFIG_ARM)
>>>> -#define BOOTEFI_NAME "bootarm.efi"
>>>> -#elif defined(CONFIG_X86_RUN_32BIT)
>>>> -#define BOOTEFI_NAME "bootia32.efi"
>>>> -#elif defined(CONFIG_X86_RUN_64BIT)
>>>> -#define BOOTEFI_NAME "bootx64.efi"
>>>> -#elif defined(CONFIG_ARCH_RV32I)
>>>> -#define BOOTEFI_NAME "bootriscv32.efi"
>>>> -#elif defined(CONFIG_ARCH_RV64I)
>>>> -#define BOOTEFI_NAME "bootriscv64.efi"
>>>> -#endif
>>>> +#include <efi_default_filename.h>
>>>> #endif
>>>>
>>>> #ifdef BOOTEFI_NAME
>>>> diff --git a/include/efi_default_filename.h
>>>> b/include/efi_default_filename.h
>>>> new file mode 100644
>>>> index 0000000000..cb2ef9e131
>>>> --- /dev/null
>>>> +++ b/include/efi_default_filename.h
>>>> @@ -0,0 +1,33 @@
>>>> +/* SPDX-License-Identifier: GPL-2.0+ */
>>>> +/*
>>>> + * Default boot file name when none is present in the FilePath.
>>>> + * This is defined in the UEFI specification.
>>>> + *
>>>> + * Copyright (c) 2022, Linaro Limited
>>>> + */
>>>> +#ifndef _EFI_DEFAULT_FILENAME_H
>>>> +#define _EFI_DEFAULT_FILENAME_H
>>>> +
>>>> +#if defined(CONFIG_ARM64)
>>>> +#define BOOTEFI_NAME "BOOTAA64.EFI"
>>>> +#elif defined(CONFIG_ARM)
>>>> +#define BOOTEFI_NAME "BOOTARM.EFI"
>>>> +#elif defined(CONFIG_X86_64)
>>>> +#define BOOTEFI_NAME "BOOTX64.EFI"
>>>> +#elif defined(CONFIG_X86)
>>>> +#define BOOTEFI_NAME "BOOTIA32.EFI"
>>>> +#elif defined(CONFIG_ARCH_RV32I)
>>>> +#define BOOTEFI_NAME "BOOTRISCV32.EFI"
>>>> +#elif defined(CONFIG_ARCH_RV64I)
>>>> +#define BOOTEFI_NAME "BOOTRISCV64.EFI"
>>>> +#elif defined(CONFIG_SANDBOX)
>>>> +/*
>>>> + * SANDBOX is not defined in UEFI specification, but
>>>> + * this definition avoids build failure for SANDBOX.
>>>> + */
>>>> +#define BOOTEFI_NAME "BOOTSANDBOX.EFI"
>>>
>>> The sandbox should boot the default binary for the host architecture:
>>>
>>> #ifndef _EFI_DEFAULT_FILENAME_H
>>> #define _EFI_DEFAULT_FILENAME_H
>>>
>>> #include <host_arch.h>
>>>
>>> #undef BOOTEFI_NAME
>>>
>>> #if HOST_ARCH == HOST_ARCH_X86_64
>>> #define BOOTEFI_NAME "BOOTX64.EFI"
>>> #endif
>>>
>>> #if HOST_ARCH == HOST_ARCH_X86
>>> #define BOOTEFI_NAME "BOOTIA32.EFI"
>>> #endif
>>>
>>> #if HOST_ARCH == HOST_ARCH_AARCH64
>>> #define BOOTEFI_NAME "BOOTAA64.EFI"
>>> #endif
>>>
>>> #if HOST_ARCH == HOST_ARCH_ARM
>>> #define BOOTEFI_NAME "BOOTARM.EFI"
>>> #endif
>>>
>>> #if HOST_ARCH == HOST_ARCH_RISCV32
>>> #define BOOTEFI_NAME "BOOTRISCV32.EFI"
>>> #endif
>>>
>>> #if HOST_ARCH == HOST_ARCH_RISCV64
>>> #define BOOTEFI_NAME "BOOTRISCV64.EFI"
>>> #endif
>>>
>>> #ifndef BOOTEFI_NAME
>>> #error Unsupported UEFI architecture
>>> #endif
>>>
>>> #endif
>>
>> Maybe sanbox is special, but using the host architecture for actual
>> boards makes no sense. I see this has made its way into master
>> already, but when I cross-build for apple_m1_defconfig on an amd64
>> machine I end up with:
>>
>> $ strings ./lib/efi_loader/efi_bootmgr.o | grep BOOT
>> /EFI/BOOT/BOOTX64.EFI
>
> Thanks for reporting the issue.
>
> On Sandbox it should be the host architecture. on other defconfigs the
> target architecture.
On Ubuntu 22.04:
git reset --hard 1739a6db5403d187902dcebca548de0644c8078f
make apple_m1_defconfig
CROSS_COMPILE=aarch64-linux-gnu- make -j16
$ strings ./lib/efi_loader/efi_bootmgr.o | grep BOOT
/EFI/BOOT/BOOTAA64.EFI
UCLASS_REBOOT_MODE
UCLASS_BOOTSTD
EFI_OBJECT_TYPE_U_BOOT_FIRMWARE
UCLASS_BOOTDEV
UCLASS_BOOTMETH
UCLASS_BOOTCOUN
$ strings u-boot | grep 'BOOT\S*\.EFI'
/EFI/BOOT/BOOTAA64.EFI
How can I reproduce your problem?
Is this BSD specific? Which distro are you running?
Best regards
Heinrich
>
> Best regards
>
> Heinrich
>
>>
>> The original diff that used CONFIG_ARM64, CONFIG_ARM, etc, did this
>> right.
>
More information about the U-Boot
mailing list