[PATCH 12/16] efi_loader: optional pointer for ConvertPointer

Heinrich Schuchardt
2020-03-31T06:52:23Z

On March 31, 2020, 5:23 a.m. UTC Takahiro Akashi wrote
>On Fri, Mar 27, 2020 at 06:27:56AM +0100, Heinrich Schuchardt wrote:
>> If the EFI_OPTIONAL_PTR is set in DebugDisposition, a NULL pointer
does not
>> constitute an invalid parameter.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> ---
>> include/efi_api.h | 2 ++
>> lib/efi_loader/efi_runtime.c | 6 ++++++
>> 2 files changed, 8 insertions(+)
>>
>> diff --git a/include/efi_api.h b/include/efi_api.h
>> index 1c40ffc4f5..c56703fc5e 100644
>> --- a/include/efi_api.h
>> +++ b/include/efi_api.h
>> @@ -250,6 +250,8 @@ struct efi_rt_properties_table {
>> u32 runtime_services_supported;
>> };
>>
>> +#define EFI_OPTIONAL_PTR 0x00000001
>> +
>> struct efi_runtime_services {
>> struct efi_table_hdr hdr;
>> efi_status_t (EFIAPI *get_time)(struct efi_time *time,
>> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
>> index 67fa693e41..664a0422e2 100644
>> --- a/lib/efi_loader/efi_runtime.c
>> +++ b/lib/efi_loader/efi_runtime.c
>> @@ -511,6 +511,12 @@ efi_convert_pointer(efi_uintn_t
debug_disposition, void **address)
>> ret = EFI_INVALID_PARAMETER;
>> goto out;
>> }
>> + if (!*address) {
>> + if (debug_disposition & EFI_OPTIONAL_PTR)
>> + return EFI_SUCCESS;
>> + else
>> + return EFI_INVALID_PARAMETER;
>> + }
>
>In either case, NULL won't be converted.
>Is this a behavior UEFI specification expects?
>(I haven't found any description there.)
>
>-Takahiro Akashi

The spec has:

EFI_INVALID_PARAMETER - *Address is NULL and DebugDisposition does not
have the EFI_OPTIONAL_PTR bit set.

EFI_OPTIONAL_PTR is handled in the same way in EDK2. An optional pointer
is one that should not be converted if is NULL. It should stay NULL, so
that the firmware can detect that it is not set.

Best regards

Heinrich

>
>
>> for (i = 0; i < efi_descriptor_count; i++) {
>> struct efi_mem_desc *map = (void *)efi_virtmap +
>> --
>> 2.25.1
>>