The UEFI variable BootOptionSupport is required by the UEFI specification
[1]. It reports if specific types of boot options are honored.

We don't support any of these extras. So we should set the value 0.

[1] 3.1.4 Boot Manager Capabilities, UEFI Specification 2.10 Errata A,

Cc: Vincent Stehlé <vincent.ste...@arm.com>
Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
---
 lib/efi_loader/efi_setup.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c
index a610e032d2f..05d035f4eb5 100644
--- a/lib/efi_loader/efi_setup.c
+++ b/lib/efi_loader/efi_setup.c
@@ -179,6 +179,22 @@ static efi_status_t efi_init_os_indications(void)
                                    &os_indications_supported, false);
 }
 
+/**
+ * efi_init_boot_options_support() - indicate supported boot option types
+ */
+static efi_status_t efi_init_boot_options_support(void)
+{
+       u32 boot_options_support = 0;
+
+       return efi_set_variable_int(u"BootOptionSupport",
+                                   &efi_global_variable_guid,
+                                   EFI_VARIABLE_BOOTSERVICE_ACCESS |
+                                   EFI_VARIABLE_RUNTIME_ACCESS |
+                                   EFI_VARIABLE_READ_ONLY,
+                                   sizeof(boot_options_support),
+                                   &boot_options_support, false);
+}
+
 /**
  * efi_init_early() - handle initialization at early stage
  *
@@ -261,6 +277,13 @@ efi_status_t efi_init_obj_list(void)
        if (ret != EFI_SUCCESS)
                goto out;
 
+       /* Indicate supported boot option types */
+       if (IS_ENABLED(CONFIG_EFI_BOOTMGR)) {
+               ret = efi_init_boot_options_support();
+               if (ret != EFI_SUCCESS)
+                       goto out;
+       }
+
        /* Initialize system table */
        ret = efi_initialize_system_table();
        if (ret != EFI_SUCCESS)
-- 
2.45.2

Reply via email to