[U-Boot] [PATCH v2 6/9] efi_loader: macro efi_size_in_pages()

Alexander Graf agraf at suse.de
Tue Nov 13 21:12:50 UTC 2018



On 12.11.18 18:55, Heinrich Schuchardt wrote:
> When allocating EFI memory pages the size in bytes has to be converted to
> pages.
> 
> Provide a macro efi_size_in_pages() for this conversion.
> Use it in the EFI subsystem and correct related comments.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> v2:
> 	no change
> ---
>  cmd/bootefi.c               | 15 ++++++---------
>  include/efi_loader.h        | 11 ++++++++++-
>  lib/efi_loader/efi_memory.c |  6 +++---
>  3 files changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index c73e6228d3e..2c9b2eb8b6f 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -154,7 +154,7 @@ static void set_load_options(struct efi_loaded_image *loaded_image_info,
>   * copy_fdt() - Copy the device tree to a new location available to EFI
>   *
>   * The FDT is relocated into a suitable location within the EFI memory map.
> - * An additional 12KB is added to the space in case the device tree needs to be
> + * Additional 12 KiB are added to the space in case the device tree needs to be
>   * expanded later with fdt_open_into().
>   *
>   * @fdt_addr:	On entry, address of start of FDT. On exit, address of relocated
> @@ -182,14 +182,12 @@ static efi_status_t copy_fdt(ulong *fdt_addrp)
>  	}
>  
>  	/*
> -	 * Give us at least 4KB of breathing room in case the device tree needs
> -	 * to be expanded later. Round up to the nearest EFI page boundary.
> +	 * Give us at least 12 KiB of breathing room in case the device tree
> +	 * needs to be expanded later.
>  	 */
>  	fdt = map_sysmem(*fdt_addrp, 0);
> -	fdt_size = fdt_totalsize(fdt);
> -	fdt_size += 4096 * 3;
> -	fdt_size = ALIGN(fdt_size + EFI_PAGE_SIZE - 1, EFI_PAGE_SIZE);
> -	fdt_pages = fdt_size >> EFI_PAGE_SHIFT;
> +	fdt_pages = efi_size_in_pages(fdt_totalsize(fdt) + 0x3000);
> +	fdt_size = fdt_pages << EFI_PAGE_SHIFT;
>  
>  	/* Safe fdt location is at 127MB */
>  	new_fdt_addr = fdt_ram_start + (127 * 1024 * 1024) + fdt_size;
> @@ -287,8 +285,7 @@ static void efi_carve_out_dt_rsv(void *fdt)
>  		if (addr == (uintptr_t)fdt)
>  			continue;
>  
> -		pages = ALIGN(size + (addr & EFI_PAGE_MASK), EFI_PAGE_SIZE) >>
> -			EFI_PAGE_SHIFT;
> +		pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
>  		addr &= ~EFI_PAGE_MASK;
>  		if (!efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
>  					false))
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index bdb806cfce4..244e754e8fd 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -350,7 +350,16 @@ struct efi_simple_file_system_protocol *efi_simple_file_system(
>  /* open file from device-path: */
>  struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp);
>  
> -
> +/**
> + * efi_size_in_pages() - convert size in bytes to size in pages
> + *
> + * This macro returns the number of EFI memory pages required to hold 'size'
> + * bytes.
> + *
> + * @size:	size in bytes
> + * Return:	size in pages
> + */
> +#define efi_size_in_pages(size) ((size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT)

Please make this a static inline function instead so we preserve type
checks.


Alex

>  /* Generic EFI memory allocator, call this to get memory */
>  void *efi_alloc(uint64_t len, int memory_type);
>  /* More specific EFI memory allocator, called by EFI payloads */
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 490e4921cce..5c387fa8024 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -400,7 +400,7 @@ efi_status_t efi_allocate_pages(int type, int memory_type,
>  void *efi_alloc(uint64_t len, int memory_type)
>  {
>  	uint64_t ret = 0;
> -	uint64_t pages = (len + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
> +	uint64_t pages = efi_size_in_pages(len);
>  	efi_status_t r;
>  
>  	r = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, memory_type, pages,
> @@ -444,8 +444,8 @@ efi_status_t efi_allocate_pool(int pool_type, efi_uintn_t size, void **buffer)
>  {
>  	efi_status_t r;
>  	struct efi_pool_allocation *alloc;
> -	u64 num_pages = (size + sizeof(struct efi_pool_allocation) +
> -			 EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
> +	u64 num_pages = efi_size_in_pages(size +
> +					  sizeof(struct efi_pool_allocation));
>  
>  	if (!buffer)
>  		return EFI_INVALID_PARAMETER;
> 


More information about the U-Boot mailing list