]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Use current boot option as a fallback for obtaining the boot URI
authorMichael Brown <mcb30@ipxe.org>
Thu, 28 Aug 2025 14:35:00 +0000 (15:35 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 29 Aug 2025 11:34:17 +0000 (12:34 +0100)
Some systems (observed with a Lenovo X1) fail to populate the loaded
image device path with a Uri() component when performing a UEFI HTTP
boot, instead creating a broken loaded image device path that
represents a DHCP+TFTP boot that has not actually taken place.

If no URI is found within the loaded image device path, then fall back
to looking for a URI within the current boot option.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efiprefix.c

index ddce6aa60c8a97f813c77ccea6963eddf3327f3e..64122185aa9a562d1a267c764ddfe609eb087032 100644 (file)
@@ -81,13 +81,22 @@ EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
 static void efi_init_application ( void ) {
        EFI_HANDLE device = efi_loaded_image->DeviceHandle;
        EFI_DEVICE_PATH_PROTOCOL *devpath = efi_loaded_image_path;
+       EFI_DEVICE_PATH_PROTOCOL *bootpath;
        struct uri *uri;
 
        /* Set current working URI from device path, if present */
+       bootpath = efi_current_boot_path();
+       DBGC ( device, "EFI has loaded image device path %s\n",
+              efi_devpath_text ( devpath ) );
+       DBGC ( device, "EFI has boot option device path %s\n",
+              efi_devpath_text ( bootpath ) );
        uri = efi_path_uri ( devpath );
+       if ( bootpath && ( ! uri ) )
+               uri = efi_path_uri ( bootpath );
        if ( uri )
                churi ( uri );
        uri_put ( uri );
+       free ( bootpath );
 
        /* Identify autoboot device, if any */
        efi_set_autoboot_ll_addr ( device, devpath );