On Tue, Mar 05, 2019 at 08:56:12PM +0100, Heinrich Schuchardt wrote: > efi_load_pe() copies and rebases the UEFI image. > We do not need the buffer with the file contents afterwards. > > Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de> > --- > lib/efi_loader/efi_boottime.c | 50 +++++++++++++---------------------- > 1 file changed, 18 insertions(+), 32 deletions(-) > > diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c > index bd8b8a17ae..391681260c 100644 > --- a/lib/efi_loader/efi_boottime.c > +++ b/lib/efi_loader/efi_boottime.c > @@ -1693,6 +1693,7 @@ static efi_status_t EFIAPI efi_load_image(bool > boot_policy, > struct efi_loaded_image_obj **image_obj = > (struct efi_loaded_image_obj **)image_handle; > efi_status_t ret; > + void *dest_buffer; > > EFI_ENTRY("%d, %p, %pD, %p, %zd, %p", boot_policy, parent_image, > file_path, source_buffer, source_size, image_handle); > @@ -1708,7 +1709,7 @@ static efi_status_t EFIAPI efi_load_image(bool > boot_policy, > } > > if (!source_buffer) { > - ret = efi_load_image_from_path(file_path, &source_buffer, > + ret = efi_load_image_from_path(file_path, &dest_buffer, > &source_size); > if (ret != EFI_SUCCESS) > goto error; > @@ -1721,41 +1722,26 @@ static efi_status_t EFIAPI efi_load_image(bool > boot_policy, > /* In this case, file_path is the "device" path, i.e. > * something like a HARDWARE_DEVICE:MEMORY_MAPPED > */ > - u64 addr; > - void *dest_buffer; > - > - ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, > - EFI_RUNTIME_SERVICES_CODE, > - efi_size_in_pages(source_size), &addr); > - if (ret != EFI_SUCCESS) > - goto error; > - dest_buffer = (void *)(uintptr_t)addr; > - memcpy(dest_buffer, source_buffer, source_size); > - source_buffer = dest_buffer; > -
Are you sure? This code is what you added in your recent commit 0e18f584de59 ("efi_loader: LoadImage: always allocate new pages") at v2019.04-rc2. IMO, the comment: > /* In this case, file_path is the "device" path, i.e. > * something like a HARDWARE_DEVICE:MEMORY_MAPPED is also not accurate because "file_path" is normally non-NULL, indicating where the content of "source_buffer" comes from. In other words, "HARDWARE_DEVICE:MEMORY_MAPPED" is a quite irregular case. -Takahiro Akashi > + dest_buffer = source_buffer; > dp = file_path; > fp = NULL; > } > ret = efi_setup_loaded_image(dp, fp, image_obj, &info); > - if (ret != EFI_SUCCESS) > - goto error_invalid_image; > - ret = efi_load_pe(*image_obj, source_buffer, info); > - if (ret != EFI_SUCCESS) > - goto error_invalid_image; > - /* Update the type of the allocated memory */ > - efi_add_memory_map((uintptr_t)source_buffer, > - efi_size_in_pages(source_size), > - info->image_code_type, false); > - info->system_table = &systab; > - info->parent_handle = parent_image; > - return EFI_EXIT(EFI_SUCCESS); > -error_invalid_image: > - /* The image is invalid. Release all associated resources. */ > - efi_free_pages((uintptr_t)source_buffer, > - efi_size_in_pages(source_size)); > - efi_delete_handle(*image_handle); > - *image_handle = NULL; > - free(info); > + if (ret == EFI_SUCCESS) > + ret = efi_load_pe(*image_obj, dest_buffer, info); > + if (!source_buffer) > + /* Release buffer to which file was loaded */ > + efi_free_pages((uintptr_t)dest_buffer, > + efi_size_in_pages(source_size)); > + if (ret == EFI_SUCCESS) { > + info->system_table = &systab; > + info->parent_handle = parent_image; > + } else { > + /* The image is invalid. Release all associated resources. */ > + efi_delete_handle(*image_handle); > + *image_handle = NULL; > + free(info); > + } > error: > return EFI_EXIT(ret); > } > -- > 2.20.1 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot