[PATCH] efi_loader: get_memory_map: return parameters whenever possible

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Mar 11 08:16:55 CET 2020


On 3/11/20 7:18 AM, AKASHI Takahiro wrote:
> Currently, if GetMemoryMap API returns EFI_BUFFER_TOO_SMALL, it doesn't
> set valid values to other parameters, descriptor_size and
> descriptor_version, except memory_map_size.
> Some efi applications, however, may use those value; in particular,
> xen uses descriptor_size to calculate a size of buffer to be allocated.
>
> While UEFI specification is ambiguous in this point, it would be better
> to address this issue proactively to maximize the compatibility with
> existing efi applications.
>
> With this patch, for example, xen.efi (and hence linux kernel) can be
> started via bootefi without modification.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>

Your change matches the logic in EDK2.

There is still a difference. This is a snippet from
MdeModulePkg/Core/Dxe/Mem/Page.c:

   Size = sizeof (EFI_MEMORY_DESCRIPTOR);

   //
   // Make sure Size != sizeof(EFI_MEMORY_DESCRIPTOR). This will
   // prevent people from having pointer math bugs in their code.
   // now you have to use *DescriptorSize to make things work.
   //
   Size += sizeof(UINT64) - (Size % sizeof (UINT64));

   if (DescriptorSize != NULL) {
     *DescriptorSize = Size;
   }

If Size is not a multiple of 8 it rounds up to a multiple of 8. But if
Size is a multiple of 8 is 8 is added. The size of EFI_MEMORY_DESCRIPTOR
is a multiple of 8. - I have no clue why EDK2 is doing this and would
not advice to copy this.

Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>

> ---
>   lib/efi_loader/efi_memory.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 89adf2031024..97d90f069a63 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -627,18 +627,18 @@ efi_status_t efi_get_memory_map(efi_uintn_t *memory_map_size,
>
>   	*memory_map_size = map_size;
>
> -	if (provided_map_size < map_size)
> -		return EFI_BUFFER_TOO_SMALL;
> -
> -	if (!memory_map)
> -		return EFI_INVALID_PARAMETER;
> -
>   	if (descriptor_size)
>   		*descriptor_size = sizeof(struct efi_mem_desc);
>
>   	if (descriptor_version)
>   		*descriptor_version = EFI_MEMORY_DESCRIPTOR_VERSION;
>
> +	if (provided_map_size < map_size)
> +		return EFI_BUFFER_TOO_SMALL;
> +
> +	if (!memory_map)
> +		return EFI_INVALID_PARAMETER;
> +
>   	/* Copy list into array */
>   	/* Return the list in ascending order */
>   	memory_map = &memory_map[map_entries - 1];
>



More information about the U-Boot mailing list