[PATCH 2/3] cmd: add maximum boot option index Kconfig option

Masahisa Kojima masahisa.kojima at linaro.org
Thu Nov 24 02:44:35 CET 2022


Hi Heinrich,

On Wed, 23 Nov 2022 at 16:26, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 11/23/22 08:17, Masahisa Kojima wrote:
> > eficonfig command reads the all possible UEFI boot options
> > from 0x0000 to 0xFFFF to construct the menu. This takes too much
> > time in some environment, especially for the platform using
> > OP-TEE and RPMB based secure storage.
> > For example, on Socionext Developerbox, it takes more than 30 seconds
> > to draw the boot option menu.
> >
> > To reduce the time to draw the menu, this patch introduces the
> > maximum UEFI boot option index that eficonfig can manage.
>
> We should avoid deviations from the UEFI specification.
>
> There cannot be more boot options than UEFI variables. Instead of
> iterating over Boot0000 to BootFFFF just iterate over all UEFI variables
> to collect Boot#### entries using GetNextVariableName(). Afterwards
> decide which ones are mentioned in BootOrder.

Using GetNextVariableName() will address the current issue.
Thank you for your comment.

Regards,
Masahisa Kojima

>
> Best regards
>
> Heinrich
>
> >
> > Signed-off-by: Masahisa Kojima <masahisa.kojima at linaro.org>
> > ---
> >   cmd/Kconfig     | 12 ++++++++++++
> >   cmd/eficonfig.c | 10 +++++-----
> >   2 files changed, 17 insertions(+), 5 deletions(-)
> >
> > diff --git a/cmd/Kconfig b/cmd/Kconfig
> > index 1092fb9c91..3978a5ef30 100644
> > --- a/cmd/Kconfig
> > +++ b/cmd/Kconfig
> > @@ -1981,6 +1981,18 @@ config CMD_EFICONFIG
> >         Enable the 'eficonfig' command which provides the menu-driven UEFI
> >         variable maintenance interface.
> >
> > +config EFICONFIG_BOOT_OPTION_MAX_INDEX
> > +     int "Maximum index of UEFI Boot Option"
> > +     depends on CMD_EFICONFIG
> > +     default 99
> > +     help
> > +             Define the number of boot option entry that 'eficonfig' command
> > +             can manage.
> > +             In UEFI specification, the boot option is indexed from 0x0000
> > +             to 0xFFFF. 'eficonfig' command read the boot option from uefi
> > +             variable storage, reading all possible boot option may
> > +             significantly affect the performance of boot option enumeration.
> > +
> >   config CMD_EXCEPTION
> >       bool "exception - raise exception"
> >       depends on ARM || RISCV || SANDBOX || X86
> > diff --git a/cmd/eficonfig.c b/cmd/eficonfig.c
> > index 5529edc85e..20b9a29d3a 100644
> > --- a/cmd/eficonfig.c
> > +++ b/cmd/eficonfig.c
> > @@ -1079,7 +1079,7 @@ efi_status_t eficonfig_get_unused_bootoption(u16 *buf, efi_uintn_t buf_size,
> >       if (buf_size < u16_strsize(u"Boot####"))
> >               return EFI_BUFFER_TOO_SMALL;
> >
> > -     for (i = 0; i <= 0xFFFF; i++) {
> > +     for (i = 0; i <= CONFIG_EFICONFIG_BOOT_OPTION_MAX_INDEX; i++) {
> >               size = 0;
> >               efi_create_indexed_name(buf, buf_size, "Boot", i);
> >               ret = efi_get_variable_int(buf, &efi_global_variable_guid,
> > @@ -1090,7 +1090,7 @@ efi_status_t eficonfig_get_unused_bootoption(u16 *buf, efi_uintn_t buf_size,
> >                       break;
> >       }
> >
> > -     if (i > 0xFFFF)
> > +     if (i > CONFIG_EFICONFIG_BOOT_OPTION_MAX_INDEX)
> >               return EFI_OUT_OF_RESOURCES;
> >
> >       *index = i;
> > @@ -1708,7 +1708,7 @@ static efi_status_t eficonfig_show_boot_selection(unsigned int *selected)
> >       }
> >
> >       /* list the remaining load option not included in the BootOrder */
> > -     for (i = 0; i <= 0xFFFF; i++) {
> > +     for (i = 0; i <= CONFIG_EFICONFIG_BOOT_OPTION_MAX_INDEX; i++) {
> >               /* If the index is included in the BootOrder, skip it */
> >               if (search_bootorder(bootorder, num, i, NULL))
> >                       continue;
> > @@ -2007,7 +2007,7 @@ static efi_status_t eficonfig_create_change_boot_order_entry(struct efimenu *efi
> >       }
> >
> >       /* list the remaining load option not included in the BootOrder */
> > -     for (i = 0; i < 0xFFFF; i++) {
> > +     for (i = 0; i < CONFIG_EFICONFIG_BOOT_OPTION_MAX_INDEX; i++) {
> >               if (efi_menu->count >= EFICONFIG_ENTRY_NUM_MAX - 2)
> >                       break;
> >
> > @@ -2278,7 +2278,7 @@ efi_status_t eficonfig_delete_invalid_boot_option(struct eficonfig_media_boot_op
> >       u16 varname[] = u"Boot####";
> >       efi_status_t ret = EFI_SUCCESS;
> >
> > -     for (i = 0; i <= 0xFFFF; i++) {
> > +     for (i = 0; i <= CONFIG_EFICONFIG_BOOT_OPTION_MAX_INDEX; i++) {
> >               efi_uintn_t tmp;
> >
> >               efi_create_indexed_name(varname, sizeof(varname), "Boot", i);
>


More information about the U-Boot mailing list