[PATCH v2 4/4] boot: correct finding the default EFI binary

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Thu Apr 4 18:14:36 CEST 2024


On 04.04.24 16:46, Ilias Apalodimas wrote:
> Hi Heinrich,
> 
> FWIW reading at this, I don't see a point of having it overall. It has
> a nice feature of trying to load external DTBs from a path though.
> I think in the future we can move the dtb selection in
> bootmeth_efi_mgr.c and delete this one

efi_mgr method should only scan removable drives for 
EFI/BOOT/BOOT<ARCH>.EFI to be UEFI compliant.

The efi method also scans non-removable drives for these files.

I agree that this behavior could be integrated into the EFI boot manager 
itself (with a corresponding configuration switch) to replace the efi 
boot method.

Best regards

Heinrich

> 
> On Thu, 4 Apr 2024 at 14:49, Heinrich Schuchardt
> <heinrich.schuchardt at canonical.com> wrote:
>>
>> * The sandbox must not use an arbitrary file name bootsbox.efi but the
>>    file name matching the host architecture to properly boot the respective
>>    file. We already have an include which provides a macro with the name of
>>    the EFI binary. Use it.
>>
>> * The path to the EFI binary should be absolute.
>>
>> * The path and the file name must be capitalized to conform to the UEFI
>>    specification. This is important when reading from case sensitive
>>    file systems.
>>
>> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>> ---
>> v2:
>>          new patch
>> ---
>>   boot/bootmeth_efi.c  | 44 +++-----------------------------------------
>>   test/boot/bootflow.c |  4 +++-
>>   2 files changed, 6 insertions(+), 42 deletions(-)
>>
>> diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
>> index a46b6c9c805..aebc5207fc0 100644
>> --- a/boot/bootmeth_efi.c
>> +++ b/boot/bootmeth_efi.c
>> @@ -14,6 +14,7 @@
>>   #include <bootmeth.h>
>>   #include <command.h>
>>   #include <dm.h>
>> +#include <efi_default_filename.h>
>>   #include <efi_loader.h>
>>   #include <fs.h>
>>   #include <malloc.h>
>> @@ -23,43 +24,7 @@
>>   #include <pxe_utils.h>
>>   #include <linux/sizes.h>
>>
>> -#define EFI_DIRNAME    "efi/boot/"
>> -
>> -/**
>> - * get_efi_leafname() - Get the leaf name for the EFI file we expect
>> - *
>> - * @str: Place to put leaf name for this architecture, e.g. "bootaa64.efi".
>> - *     Must have at least 16 bytes of space
>> - * @max_len: Length of @str, must be >=16
>> - */
>> -static int get_efi_leafname(char *str, int max_len)
>> -{
>> -       const char *base;
>> -
>> -       if (max_len < 16)
>> -               return log_msg_ret("spc", -ENOSPC);
>> -       if (IS_ENABLED(CONFIG_ARM64))
>> -               base = "bootaa64";
>> -       else if (IS_ENABLED(CONFIG_ARM))
>> -               base = "bootarm";
>> -       else if (IS_ENABLED(CONFIG_X86_RUN_32BIT))
>> -               base = "bootia32";
>> -       else if (IS_ENABLED(CONFIG_X86_RUN_64BIT))
>> -               base = "bootx64";
>> -       else if (IS_ENABLED(CONFIG_ARCH_RV32I))
>> -               base = "bootriscv32";
>> -       else if (IS_ENABLED(CONFIG_ARCH_RV64I))
>> -               base = "bootriscv64";
>> -       else if (IS_ENABLED(CONFIG_SANDBOX))
>> -               base = "bootsbox";
>> -       else
>> -               return -EINVAL;
>> -
>> -       strcpy(str, base);
>> -       strcat(str, ".efi");
>> -
>> -       return 0;
>> -}
>> +#define EFI_DIRNAME    "/EFI/BOOT/"
>>
>>   static int get_efi_pxe_arch(void)
>>   {
>> @@ -259,10 +224,7 @@ static int distro_efi_try_bootflow_files(struct udevice *dev,
>>                  return -ENOENT;
>>
>>          strcpy(fname, EFI_DIRNAME);
>> -       ret = get_efi_leafname(fname + strlen(fname),
>> -                              sizeof(fname) - strlen(fname));
>> -       if (ret)
>> -               return log_msg_ret("leaf", ret);
>> +       strcat(fname, BOOTEFI_NAME);
>>
>>          if (bflow->blk)
>>                   desc = dev_get_uclass_plat(bflow->blk);
>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
>> index e60e9309fa9..674d4c05f83 100644
>> --- a/test/boot/bootflow.c
>> +++ b/test/boot/bootflow.c
>> @@ -13,6 +13,7 @@
>>   #include <bootstd.h>
>>   #include <cli.h>
>>   #include <dm.h>
>> +#include <efi_default_filename.h>
>>   #include <expo.h>
>>   #ifdef CONFIG_SANDBOX
>>   #include <asm/test.h>
>> @@ -179,7 +180,8 @@ static int bootflow_cmd_scan_e(struct unit_test_state *uts)
>>          ut_assert_nextline("  3  efi          media   mmc          0  mmc1.bootdev.whole        ");
>>          ut_assert_nextline("     ** No partition found, err=-2: No such file or directory");
>>          ut_assert_nextline("  4  extlinux     ready   mmc          1  mmc1.bootdev.part_1       /extlinux/extlinux.conf");
>> -       ut_assert_nextline("  5  efi          fs      mmc          1  mmc1.bootdev.part_1       efi/boot/bootsbox.efi");
>> +       ut_assert_nextline("  5  efi          fs      mmc          1  mmc1.bootdev.part_1       /EFI/BOOT/"
>> +                          BOOTEFI_NAME);
>>
>>          ut_assert_skip_to_line("Scanning bootdev 'mmc0.bootdev':");
>>          ut_assert_skip_to_line(
>> --
>> 2.43.0
>>
> 
> Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Tested-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>



More information about the U-Boot mailing list