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

Keng-Yu Lin kengyu at canonical.com
Wed Oct 3 08:10:35 UTC 2012


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