
Kojima-san
On Wed, 8 Nov 2023 at 13:08, Masahisa Kojima masahisa.kojima@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.kojima@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.apalodimas@linaro.org