[PATCH 2/2] efi_runtime: add UEFI runtime service QueryVariableInfo interface

Keng-Yu Lin kengyu at canonical.com
Tue Oct 16 09:31:14 UTC 2012


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
>

Acked-by: Keng-Yu Lin <kengyu at canonical.com>



More information about the fwts-devel mailing list