[U-Boot] [PATCH v3 1/1] efi_loader: refactor efi_setup_loaded_image()
Alexander Graf
agraf at suse.de
Sun Sep 23 13:26:31 UTC 2018
On 23.09.18 15:19, Heinrich Schuchardt wrote:
> 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().
No answer here?
>>
>>>
>>> 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
The arguments to entry(...) have to be the same across all 3 calling
mechanisms: drop-to-el2, drop-to-hyp, call-native. Currently 2 out of 3
pass "image_handle", one passes "&image_handle".
Alex
More information about the U-Boot
mailing list