From: Javier Tia Date: Thu, 9 Oct 2025 13:17:47 +0000 (-0600) Subject: efi_loader: Improve disk image detection in efi_bootmgr X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=038ca2c803cd0f51dad7ebd1d3da96118fb67056;p=pandora-u-boot.git efi_loader: Improve disk image detection in efi_bootmgr Enhances the process for identifying disk images within the EFI boot manager. Utilize part_driver_lookup_type() to verify the validity of a downloaded file as a disk image, rather than depending on file extensions. part_driver_lookup_type() is now used in the prepare_loaded_image() function in the EFI boot manager to detect partitions on a block device created from a downloaded image. This allows the boot manager to boot from any disk image that can be recognized by a partition driver, not just ISO and IMG images. Update prepare_loaded_image() to create the ramdisk block device internally, obtain the blk_desc and use part_driver_lookup_type() to detect a valid partition table. In try_load_from_uri_path(), try prepare_loaded_image() first to detect disk images, and fall back to PE-COFF detection only if that fails. Signed-off-by: Javier Tia Reviewed-by: Ilias Apalodimas Signed-off-by: Ilias Apalodimas --- diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 662993fb809..a687f4d8e85 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -347,6 +348,9 @@ static efi_status_t fill_default_file_path(struct udevice *blk, * @dp: pointer to default file device path * @blk: pointer to created blk udevice * Return: status code + * + * This function handles device creation internally and performs cleanup + * on error paths. */ static efi_status_t prepare_loaded_image(u16 *label, ulong addr, ulong size, struct efi_device_path **dp, @@ -355,10 +359,31 @@ static efi_status_t prepare_loaded_image(u16 *label, ulong addr, ulong size, u64 pages; efi_status_t ret; struct udevice *ramdisk_blk; + struct blk_desc *desc; + struct part_driver *part_drv; + /* Create the ramdisk block device internally */ ramdisk_blk = mount_image(label, addr, size); - if (!ramdisk_blk) - return EFI_LOAD_ERROR; + if (!ramdisk_blk) { + log_warning("Failed to create ramdisk block device\n"); + return EFI_DEVICE_ERROR; + } + + /* Get the block descriptor and detect partitions */ + desc = dev_get_uclass_plat(ramdisk_blk); + if (!desc) { + log_err("Failed to get block descriptor\n"); + ret = EFI_DEVICE_ERROR; + goto err; + } + + /* Use part_driver_lookup_type for comprehensive partition detection */ + part_drv = part_driver_lookup_type(desc); + if (!part_drv) { + log_err("Image is not a valid disk image\n"); + ret = EFI_INVALID_PARAMETER; + goto err; + } ret = fill_default_file_path(ramdisk_blk, dp); if (ret != EFI_SUCCESS) { @@ -407,7 +432,7 @@ static efi_status_t efi_bootmgr_release_uridp(struct uridp_context *ctx) if (!ctx) return ret; - /* cleanup for iso or img image */ + /* cleanup for disk image */ if (ctx->ramdisk_blk_dev) { ret = efi_add_memory_map(ctx->image_addr, ctx->image_size, EFI_CONVENTIONAL_MEMORY); @@ -466,7 +491,6 @@ static efi_status_t try_load_from_uri_path(struct efi_device_path_uri *uridp, { char *s; int err; - int uri_len; efi_status_t ret; void *source_buffer; efi_uintn_t source_size; @@ -516,18 +540,15 @@ static efi_status_t try_load_from_uri_path(struct efi_device_path_uri *uridp, image_size = ALIGN(image_size, SZ_2M); /* - * If the file extension is ".iso" or ".img", mount it and try to load - * the default file. - * If the file is PE-COFF image, load the downloaded file. + * Check if the downloaded file is a disk image or PE-COFF image. + * Try disk image detection first using prepare_loaded_image(). */ - uri_len = strlen(uridp->uri); - if (!strncmp(&uridp->uri[uri_len - 4], ".iso", 4) || - !strncmp(&uridp->uri[uri_len - 4], ".img", 4)) { - ret = prepare_loaded_image(lo_label, image_addr, image_size, - &loaded_dp, &blk); - if (ret != EFI_SUCCESS) - goto err; + /* First, try to treat the image as a disk image */ + ret = prepare_loaded_image(lo_label, image_addr, image_size, + &loaded_dp, &blk); + if (ret == EFI_SUCCESS) { + /* Image is a disk image, set up for disk boot */ source_buffer = NULL; source_size = 0; } else if (efi_check_pe((void *)image_addr, image_size, NULL) == EFI_SUCCESS) {