[PATCH 2/2] efi_runtime: add UEFI runtime service QueryVariableInfo interface
IvanHu
ivan.hu at canonical.com
Wed Oct 3 09:33:04 UTC 2012
Hi Kengyu,
This interface will call the RT service via virt_efi_query_variable_info
function in efi.c below:
static efi_status_t virt_efi_query_variable_info(u32 attr,
u64 *storage_space,
u64 *remaining_space,
u64 *max_variable_size)
{
if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
return EFI_UNSUPPORTED;
return efi_call_virt4(query_variable_info, attr, storage_space,
remaining_space, max_variable_size);
}
I dumped the value runtime_version equal 0 and it seems that the value
of runtime_version doesn't be set. I think the kernel may not implement
to check the version. I did a simple test as well, just removed the
checking runtime version, directly call the efi_call_virt4, the function
worked fine.
On 10/03/2012 04:10 PM, Keng-Yu Lin wrote:
> Hi Ivan,
> The commit log looks like a bug in the kernel you found while you
> were implementing this patch.
> Do you have further analysis or idea on the cause or how it can be
> potentially fixed we can probably help out here?
>
> On Fri, Sep 28, 2012 at 4:26 PM, Ivan Hu <ivan.hu at canonical.com> wrote:
>> This interface is always returned EFI_UNSUPPORTED from
>> virt_fei_query_variable_info on kernel driver efi.c because of checking
>> the runtime_version. It seems that runtime_version value always 0,
>> it alway returns EFI_UNSUPPORTED. Need a patch of efi.c for this interface.
>>
>> Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
>> ---
>> efi_runtime/efi_runtime.c | 20 ++++++++++++++++++++
>> efi_runtime/efi_runtime.h | 11 +++++++++++
>> 2 files changed, 31 insertions(+)
>>
>> diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
>> index 227a910..0e66e94 100644
>> --- a/efi_runtime/efi_runtime.c
>> +++ b/efi_runtime/efi_runtime.c
>> @@ -117,6 +117,8 @@ static long efi_runtime_ioctl(struct file *file, unsigned int cmd,
>> struct efi_getnextvariablename __user *pgetnextvariablename;
>> unsigned long name_size;
>>
>> + struct efi_queryvariableinfo __user *pqueryvariableinfo;
>> +
>> switch (cmd) {
>> case EFI_RUNTIME_GET_VARIABLE:
>> pgetvariable = (struct efi_getvariable __user *)arg;
>> @@ -261,6 +263,24 @@ static long efi_runtime_ioctl(struct file *file, unsigned int cmd,
>> &vendor_guid, sizeof(EFI_GUID)))
>> return -EFAULT;
>> return 0;
>> +
>> + case EFI_RUNTIME_QUERY_VARIABLEINFO:
>> +
>> + pqueryvariableinfo = (struct efi_queryvariableinfo __user *)arg;
>> +
>> + if (get_user(attr, &pqueryvariableinfo->Attributes))
>> + return -EFAULT;
>> +
>> + status = efi.query_variable_info(attr,
>> + pqueryvariableinfo->MaximumVariableStorageSize,
>> + pqueryvariableinfo->RemainingVariableStorageSize
>> + , pqueryvariableinfo->MaximumVariableSize);
>> + if (put_user(status, pqueryvariableinfo->status))
>> + return -EFAULT;
>> + if (status != EFI_SUCCESS)
>> + return -EINVAL;
>> +
>> + return 0;
>> }
>>
>> return -ENOTTY;
>> diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h
>> index 7387406..cc33878 100644
>> --- a/efi_runtime/efi_runtime.h
>> +++ b/efi_runtime/efi_runtime.h
>> @@ -73,6 +73,14 @@ struct efi_getnextvariablename {
>> uint64_t *status;
>> } __attribute__ ((packed));
>>
>> +struct efi_queryvariableinfo {
>> + uint32_t Attributes;
>> + uint64_t *MaximumVariableStorageSize;
>> + uint64_t *RemainingVariableStorageSize;
>> + uint64_t *MaximumVariableSize;
>> + uint64_t *status;
>> +} __attribute__ ((packed));
>> +
>> struct efi_gettime {
>> EFI_TIME *Time;
>> EFI_TIME_CAPABILITIES *Capabilities;
>> @@ -116,4 +124,7 @@ struct efi_setwakeuptime {
>> #define EFI_RUNTIME_GET_NEXTVARIABLENAME \
>> _IOWR('p', 0x07, struct efi_getnextvariablename)
>>
>> +#define EFI_RUNTIME_QUERY_VARIABLEINFO \
>> + _IOR('p', 0x08, struct efi_queryvariableinfo)
>> +
>> #endif /* _EFI_RUNTIME_H_ */
>> --
>> 1.7.9.5
>>
>>
>> --
>> fwts-devel mailing list
>> fwts-devel at lists.ubuntu.com
>> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/fwts-devel
>
More information about the fwts-devel
mailing list