[PATCH v11 7/9] efi_loader: support boot from URI device path
Ilias Apalodimas
ilias.apalodimas at linaro.org
Thu Nov 9 09:03:34 CET 2023
Kojima-san
On Wed, 8 Nov 2023 at 13:08, Masahisa Kojima <masahisa.kojima at 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 at 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 at linaro.org>
More information about the U-Boot
mailing list