public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/1] efi_loader: release file buffer after loading image
Date: Wed, 6 Mar 2019 09:41:43 +0900	[thread overview]
Message-ID: <20190306004142.GE20286@linaro.org> (raw)
In-Reply-To: <20190305195612.29187-1-xypron.glpk@gmx.de>

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.glpk@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
> 

  reply	other threads:[~2019-03-06  0:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-05 19:56 [U-Boot] [PATCH 1/1] efi_loader: release file buffer after loading image Heinrich Schuchardt
2019-03-06  0:41 ` AKASHI Takahiro [this message]
2019-03-06  4:38   ` Heinrich Schuchardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190306004142.GE20286@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox