Kojima-san On Wed, 8 Nov 2023 at 13:08, Masahisa Kojima <masahisa.koj...@linaro.org> wrote: > > This supports to boot from the URI device path. > When user selects the URI device path, bootmgr downloads > the file using wget into the address specified by loadaddr > env variable. > If the file is .iso or .img file, mount the image with blkmap > then try to boot with the default file(e.g. EFI/BOOT/BOOTAA64.EFI). > Since boot option indicating the default file is automatically > created when new disk is detected, system can boot by selecting > the automatically created blkmap boot option. > If the file is PE-COFF file, load and start the downloaded file. > > The buffer used to download the ISO image file must be > reserved to avoid the unintended access to the image and > expose the ramdisk to the OS. > For PE-COFF file case, this memory reservation is done > in LoadImage Boot Service. > > Signed-off-by: Masahisa Kojima <masahisa.koj...@linaro.org> > --- > lib/efi_loader/Kconfig | 9 + > lib/efi_loader/efi_bootmgr.c | 376 +++++++++++++++++++++++++++++++++++ > 2 files changed, 385 insertions(+) > > diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig > index d20aaab6db..5d99206dc3 100644 > --- a/lib/efi_loader/Kconfig > +++ b/lib/efi_loader/Kconfig > @@ -479,4 +479,13 @@ config EFI_RISCV_BOOT_PROTOCOL > replace the transfer via the device-tree. The latter is not > possible on systems using ACPI. > > +config EFI_HTTP_BOOT > + bool "EFI HTTP Boot support" > + depends on CMD_DNS > + depends on CMD_WGET > + depends on BLKMAP > + help > + Enabling this option adds EFI HTTP Boot support. It allows to > + directly boot from network. > + > endif
Since we depend on all these, I think it would be easier to 'select' instead of 'depends on', otherwise enabling EFI_HTTP_BOOT will be very tricky. > + */ > +static efi_status_t search_default_file(struct udevice *dev, > + struct efi_device_path **loaded_dp) > +{ > + efi_status_t ret; > + efi_handle_t handle; > + u16 *default_file_name = NULL; > + struct efi_file_handle *root, *f; > + struct efi_device_path *dp = NULL, *fp = NULL; > + struct efi_simple_file_system_protocol *file_system; > + struct efi_device_path *device_path, *full_path = NULL; > + > + if (dev_tag_get_ptr(dev, DM_TAG_EFI, (void **)&handle)) { > + log_warning("DM_TAG_EFI not found\n"); > + return EFI_INVALID_PARAMETER; > + } > + > + ret = EFI_CALL(bs->open_protocol(handle, > &efi_simple_file_system_protocol_guid, > + (void **)&file_system, efi_root, > NULL, > + EFI_OPEN_PROTOCOL_GET_PROTOCOL)); > + if (ret != EFI_SUCCESS) > + return ret; > + > + ret = EFI_CALL(file_system->open_volume(file_system, &root)); > + if (ret != EFI_SUCCESS) > + return ret; > + > + ret = EFI_CALL(bs->open_protocol(handle, &efi_guid_device_path, > + (void **)&device_path, efi_root, > NULL, > + EFI_OPEN_PROTOCOL_GET_PROTOCOL)); > + if (ret != EFI_SUCCESS) > + return ret; > + > + full_path = expand_media_path(device_path); > + ret = efi_dp_split_file_path(full_path, &dp, &fp); > + if (ret != EFI_SUCCESS) > + goto err; > + > + default_file_name = efi_dp_str(fp); > + efi_free_pool(dp); > + efi_free_pool(fp); > + if (!default_file_name) { > + ret = EFI_OUT_OF_RESOURCES; > + goto err; > + } > + > + ret = EFI_CALL(root->open(root, &f, default_file_name, > + EFI_FILE_MODE_READ, 0)); > + efi_free_pool(default_file_name); > + if (ret != EFI_SUCCESS) > + goto err; > + > + EFI_CALL(f->close(f));\ This closes the file correctly, but the volume is still open. Don't we need EFI_CALL(root->close(root) as well? [...] With the above fixed Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>