The boot variables automatically generated for removable medias
should be with short form of device path without device nodes.
This is a requirement for the case that a removable media is
plugged into a different port but is still able to work with the
existing boot variables.

Signed-off-by: Raymond Mao <raymond....@linaro.org>
---
Changes in v2
- Ignore EFI_NOT_FOUND returned from
  efi_bootmgr_update_media_device_boot_option which means no boot
  options scanned.

 cmd/bootmenu.c                    |  2 +-
 cmd/eficonfig.c                   |  2 +-
 include/efi_loader.h              |  2 +-
 lib/efi_loader/efi_bootmgr.c      | 16 +++++++++++++---
 lib/efi_loader/efi_disk.c         |  4 ++--
 lib/efi_loader/efi_variable.c     |  6 +++++-
 lib/efi_loader/efi_variable_tee.c |  6 +++++-
 7 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
index 01daddca7b..058b47c69a 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -351,7 +351,7 @@ static struct bootmenu_data *bootmenu_create(int delay)
                 * UEFI specification requires booting from removal media using
                 * a architecture-specific default image name such as 
BOOTAA64.EFI.
                 */
-               efi_ret = efi_bootmgr_update_media_device_boot_option();
+               efi_ret = efi_bootmgr_update_media_device_boot_option(true);
                if (efi_ret != EFI_SUCCESS && efi_ret != EFI_NOT_FOUND)
                        goto cleanup;
 
diff --git a/cmd/eficonfig.c b/cmd/eficonfig.c
index 82a80306f4..38371bfea6 100644
--- a/cmd/eficonfig.c
+++ b/cmd/eficonfig.c
@@ -2313,7 +2313,7 @@ static int do_eficonfig(struct cmd_tbl *cmdtp, int flag, 
int argc, char *const a
        if (ret != EFI_SUCCESS)
                return CMD_RET_FAILURE;
 
-       ret = efi_bootmgr_update_media_device_boot_option();
+       ret = efi_bootmgr_update_media_device_boot_option(true);
        if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
                return ret;
 
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 31ca1f5d1d..0a69f08d6c 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -522,7 +522,7 @@ efi_status_t efi_bootmgr_append_bootorder(u16 index);
 efi_status_t efi_bootmgr_get_unused_bootoption(u16 *buf,
                                               efi_uintn_t buf_size, u32 
*index);
 /* Generate the media device boot option */
-efi_status_t efi_bootmgr_update_media_device_boot_option(void);
+efi_status_t efi_bootmgr_update_media_device_boot_option(bool short_path);
 /* Delete selected boot option */
 efi_status_t efi_bootmgr_delete_boot_option(u16 boot_index);
 /* search the boot option index in BootOrder */
diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c
index c329428973..c4bc8b354f 100644
--- a/lib/efi_loader/efi_bootmgr.c
+++ b/lib/efi_loader/efi_bootmgr.c
@@ -354,11 +354,13 @@ error:
  * @opt:               pointer to the media boot option structure
  * @volume_handles:    pointer to the efi handles
  * @count:             number of efi handle
+ * @short_path:                use short form device path for matching
  * Return:             status code
  */
 static efi_status_t efi_bootmgr_enumerate_boot_option(struct 
eficonfig_media_boot_option *opt,
                                                      efi_handle_t 
*volume_handles,
-                                                     efi_status_t count)
+                                                     efi_status_t count,
+                                                     bool short_path)
 {
        u32 i;
        struct efi_handler *handler;
@@ -387,6 +389,13 @@ static efi_status_t 
efi_bootmgr_enumerate_boot_option(struct eficonfig_media_boo
                p = dev_name;
                utf8_utf16_strncpy(&p, buf, strlen(buf));
 
+               /* use short form device path */
+               if (short_path) {
+                       device_path = efi_dp_shorten(device_path);
+                       if (!device_path)
+                               continue;
+               }
+
                lo.label = dev_name;
                lo.attributes = LOAD_OPTION_ACTIVE;
                lo.file_path = device_path;
@@ -651,9 +660,10 @@ efi_status_t efi_bootmgr_delete_boot_option(u16 boot_index)
  *   - If the device is not attached to the system, the associated BOOT#### 
variable
  *     is automatically deleted.
  *
+ * @short_path:        use short form device path for matching
  * Return:     status code
  */
-efi_status_t efi_bootmgr_update_media_device_boot_option(void)
+efi_status_t efi_bootmgr_update_media_device_boot_option(bool short_path)
 {
        u32 i;
        efi_status_t ret;
@@ -673,7 +683,7 @@ efi_status_t 
efi_bootmgr_update_media_device_boot_option(void)
                goto out;
 
        /* enumerate all devices supporting EFI_SIMPLE_FILE_SYSTEM_PROTOCOL */
-       ret = efi_bootmgr_enumerate_boot_option(opt, volume_handles, count);
+       ret = efi_bootmgr_enumerate_boot_option(opt, volume_handles, count, 
short_path);
        if (ret != EFI_SUCCESS)
                goto out;
 
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index 1309e28134..7effffa8d5 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -689,8 +689,8 @@ int efi_disk_probe(void *ctx, struct event *event)
 
        /* only do the boot option management when UEFI sub-system is 
initialized */
        if (efi_obj_list_initialized == EFI_SUCCESS) {
-               ret = efi_bootmgr_update_media_device_boot_option();
-               if (ret)
+               ret = efi_bootmgr_update_media_device_boot_option(true);
+               if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
                        return -1;
        }
 
diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
index 2f251553e1..be3f40333d 100644
--- a/lib/efi_loader/efi_variable.c
+++ b/lib/efi_loader/efi_variable.c
@@ -481,5 +481,9 @@ efi_status_t efi_init_variables(void)
                return ret;
 
        /* update boot option management after variable service initialized */
-       return efi_bootmgr_update_media_device_boot_option();
+       ret = efi_bootmgr_update_media_device_boot_option(true);
+       if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
+               return ret;
+
+       return EFI_SUCCESS;
 }
diff --git a/lib/efi_loader/efi_variable_tee.c 
b/lib/efi_loader/efi_variable_tee.c
index a48d313ef0..481c4985ab 100644
--- a/lib/efi_loader/efi_variable_tee.c
+++ b/lib/efi_loader/efi_variable_tee.c
@@ -749,5 +749,9 @@ efi_status_t efi_init_variables(void)
                return ret;
 
        /* update boot option management after variable service initialized */
-       return efi_bootmgr_update_media_device_boot_option();
+       ret = efi_bootmgr_update_media_device_boot_option(true);
+       if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
+               return ret;
+
+       return EFI_SUCCESS;
 }
-- 
2.25.1

Reply via email to