[U-Boot] [PATCH v3 1/1] efi_loader: refactor efi_setup_loaded_image()
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Sep 23 13:19:39 UTC 2018
On 09/23/2018 02:34 PM, Alexander Graf wrote:
>
>
> On 23.09.18 13:56, Heinrich Schuchardt wrote:
>> Create the handle of loaded images and the EFI_LOADED_IMAGE_PROTOCOL
>> inside efi_setup_loaded_image(). Do not use local variables.
>>
>> Currently we expect the loaded image handle to point to the loaded image
>> protocol. Additionally we have appended private fields to the protocol.
>>
>> With the patch the handle points to a loaded image object and the private
>> fields are added here. This matches how we handle the net and the gop
>> object.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> ---
>> v3
>> squashed two patches
>> https://lists.denx.de/pipermail/u-boot/2018-September/341130.html
>> https://lists.denx.de/pipermail/u-boot/2018-September/341589.html
>> v2
>> avoid unused variables if configured without CONFIG_EFI_SELFTEST
>> ---
>> cmd/bootefi.c | 61 +++++++++++---------
>> include/efi_api.h | 8 ---
>> include/efi_loader.h | 27 ++++++---
>> lib/efi_loader/efi_boottime.c | 92 +++++++++++++++----------------
>> lib/efi_loader/efi_image_loader.c | 23 ++++----
>> 5 files changed, 111 insertions(+), 100 deletions(-)
>>
>> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
>> index 8bc6fa49f5..f76f29a7b1 100644
>> --- a/cmd/bootefi.c
>> +++ b/cmd/bootefi.c
>> @@ -325,19 +325,26 @@ static efi_status_t efi_install_fdt(ulong fdt_addr)
>> return ret;
>> }
>>
>> -/*
>> - * Load an EFI payload into a newly allocated piece of memory, register all
>> - * EFI objects it would want to access and jump to it.
>> +/**
>> + * do_bootefi_exec() - execute EFI binary
>> + *
>> + * @efi: address of the binary
>> + * @device_path: path of the device from which the binary was loaded
>> + * @image_path: device path of the binary
>> + * Return: status code
>> + *
>> + * Load the EFI binary into a newly assigned memory unwinding the relocation
>> + * information, install the loaded image protocol, and call the binary.
>> */
>> static efi_status_t do_bootefi_exec(void *efi,
>> struct efi_device_path *device_path,
>> struct efi_device_path *image_path)
>> {
>> - struct efi_loaded_image loaded_image_info = {};
>> - struct efi_object loaded_image_info_obj = {};
>> efi_handle_t mem_handle = NULL;
>> struct efi_device_path *memdp = NULL;
>> efi_status_t ret;
>> + struct efi_loaded_image_obj *image_handle;
>> + struct efi_loaded_image *loaded_image_info;
>
> Better initialize those to NULL so we don't have to remember to do that
> in efi_setup_loaded_image().
>
>>
>> EFIAPI efi_status_t (*entry)(efi_handle_t image_handle,
>> struct efi_system_table *st);
>> @@ -367,8 +374,8 @@ static efi_status_t do_bootefi_exec(void *efi,
>> assert(device_path && image_path);
>> }
>>
>> - efi_setup_loaded_image(&loaded_image_info, &loaded_image_info_obj,
>> - device_path, image_path);
>> + efi_setup_loaded_image(device_path, image_path, &image_handle,
>> + &loaded_image_info);
>>
>> /*
>> * gd lives in a fixed register which may get clobbered while we execute
>> @@ -377,9 +384,9 @@ static efi_status_t do_bootefi_exec(void *efi,
>> efi_save_gd();
>>
>> /* Transfer environment variable bootargs as load options */
>> - set_load_options(&loaded_image_info, "bootargs");
>> + set_load_options(loaded_image_info, "bootargs");
>> /* Load the EFI payload */
>> - entry = efi_load_pe(efi, &loaded_image_info);
>> + entry = efi_load_pe(image_handle, efi, loaded_image_info);
>> if (!entry) {
>> ret = EFI_LOAD_ERROR;
>> goto exit;
>> @@ -387,10 +394,10 @@ static efi_status_t do_bootefi_exec(void *efi,
>>
>> if (memdp) {
>> struct efi_device_path_memory *mdp = (void *)memdp;
>> - mdp->memory_type = loaded_image_info.image_code_type;
>> - mdp->start_address = (uintptr_t)loaded_image_info.image_base;
>> + mdp->memory_type = loaded_image_info->image_code_type;
>> + mdp->start_address = (uintptr_t)loaded_image_info->image_base;
>> mdp->end_address = mdp->start_address +
>> - loaded_image_info.image_size;
>> + loaded_image_info->image_size;
>> }
>>
>> /* we don't support much: */
>> @@ -400,8 +407,8 @@ static efi_status_t do_bootefi_exec(void *efi,
>> /* Call our payload! */
>> debug("%s:%d Jumping to 0x%lx\n", __func__, __LINE__, (long)entry);
>>
>> - if (setjmp(&loaded_image_info.exit_jmp)) {
>> - ret = loaded_image_info.exit_status;
>> + if (setjmp(&image_handle->exit_jmp)) {
>> + ret = image_handle->exit_status;
>> goto exit;
>> }
>>
>> @@ -413,7 +420,7 @@ static efi_status_t do_bootefi_exec(void *efi,
>>
>> /* Move into EL2 and keep running there */
>> armv8_switch_to_el2((ulong)entry,
>> - (ulong)&loaded_image_info_obj.handle,
>> + (ulong)&image_handle,
>
> This needs to become only "image_handle" now, no?
&loaded_image_info_obj.handle wass of type (void **), i.e. a pointer to
a pointer to a anonymous structure.
&image_handle is of type (struct efi_loaded_image_obj **), i.e also a
pointer to a pointer to a structure
Regards
Heinrich
More information about the U-Boot
mailing list