Message ID | 1506068808-3574-1-git-send-email-ivan.hu@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | efi_runtime: add resetsystem runtime service | expand |
On 22/09/17 09:26, Ivan Hu wrote: > Reset system by UEFI runtime service will not be tested on fwts. Still add this > patch to efi_runtime driver to make it more complete on UEFI runtime interfaces. > > Signed-off-by: Ivan Hu <ivan.hu@canonical.com> > --- > efi_runtime/efi_runtime.c | 23 +++++++++++++++++++++++ > efi_runtime/efi_runtime.h | 10 ++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c > index 6570a54..e29430c 100644 > --- a/efi_runtime/efi_runtime.c > +++ b/efi_runtime/efi_runtime.c > @@ -561,6 +561,29 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg) > return 0; > } > > +static long efi_runtime_reset_system(unsigned long arg) > +{ > + struct efi_resetsystem __user *resetsystem_user; > + struct efi_resetsystem resetsystem; > + void *data = NULL; > + > + resetsystem_user = (struct efi_resetsystem __user *)arg; > + if (copy_from_user(&resetsystem, resetsystem_user, > + sizeof(resetsystem))) > + return -EFAULT; > + if (resetsystem.data_size != 0) { > + data = memdup_user((void *)resetsystem.data, > + resetsystem.data_size); > + if (IS_ERR(data)) > + return PTR_ERR(data); > + } > + > + efi.reset_system(resetsystem.reset_type, resetsystem.status, > + resetsystem.data_size, (efi_char16_t *)data); > + > + kfree(data); > + return 0; > +} > > #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) > static long efi_runtime_query_variableinfo(unsigned long arg) > diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h > index fa67a80..4cf8e51 100644 > --- a/efi_runtime/efi_runtime.h > +++ b/efi_runtime/efi_runtime.h > @@ -94,6 +94,13 @@ struct efi_querycapsulecapabilities { > efi_status_t *status; > } __packed; > > +struct efi_resetsystem { > + int reset_type; > + efi_status_t status; > + unsigned long data_size; > + efi_char16_t *data; > +} __packed; > + > /* ioctl calls that are permitted to the /dev/efi_runtime interface. */ > #define EFI_RUNTIME_GET_VARIABLE \ > _IOWR('p', 0x01, struct efi_getvariable) > @@ -122,4 +129,7 @@ struct efi_querycapsulecapabilities { > #define EFI_RUNTIME_QUERY_CAPSULECAPABILITIES \ > _IOR('p', 0x0A, struct efi_querycapsulecapabilities) > > +#define EFI_RUNTIME_RESET_SYSTEM \ > + _IOW('p', 0x0B, struct efi_resetsystem) > + > #endif /* _EFI_RUNTIME_H_ */ > Will this be sent upstream to land in the linux driver? Acked-by: Colin Ian King <colin.king@canonical.com>
On 09/22/2017 04:31 PM, Colin Ian King wrote: > On 22/09/17 09:26, Ivan Hu wrote: >> Reset system by UEFI runtime service will not be tested on fwts. Still add this >> patch to efi_runtime driver to make it more complete on UEFI runtime interfaces. >> >> Signed-off-by: Ivan Hu <ivan.hu@canonical.com> >> --- >> efi_runtime/efi_runtime.c | 23 +++++++++++++++++++++++ >> efi_runtime/efi_runtime.h | 10 ++++++++++ >> 2 files changed, 33 insertions(+) >> >> diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c >> index 6570a54..e29430c 100644 >> --- a/efi_runtime/efi_runtime.c >> +++ b/efi_runtime/efi_runtime.c >> @@ -561,6 +561,29 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg) >> return 0; >> } >> >> +static long efi_runtime_reset_system(unsigned long arg) >> +{ >> + struct efi_resetsystem __user *resetsystem_user; >> + struct efi_resetsystem resetsystem; >> + void *data = NULL; >> + >> + resetsystem_user = (struct efi_resetsystem __user *)arg; >> + if (copy_from_user(&resetsystem, resetsystem_user, >> + sizeof(resetsystem))) >> + return -EFAULT; >> + if (resetsystem.data_size != 0) { >> + data = memdup_user((void *)resetsystem.data, >> + resetsystem.data_size); >> + if (IS_ERR(data)) >> + return PTR_ERR(data); >> + } >> + >> + efi.reset_system(resetsystem.reset_type, resetsystem.status, >> + resetsystem.data_size, (efi_char16_t *)data); >> + >> + kfree(data); >> + return 0; >> +} >> >> #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) >> static long efi_runtime_query_variableinfo(unsigned long arg) >> diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h >> index fa67a80..4cf8e51 100644 >> --- a/efi_runtime/efi_runtime.h >> +++ b/efi_runtime/efi_runtime.h >> @@ -94,6 +94,13 @@ struct efi_querycapsulecapabilities { >> efi_status_t *status; >> } __packed; >> >> +struct efi_resetsystem { >> + int reset_type; >> + efi_status_t status; >> + unsigned long data_size; >> + efi_char16_t *data; >> +} __packed; >> + >> /* ioctl calls that are permitted to the /dev/efi_runtime interface. */ >> #define EFI_RUNTIME_GET_VARIABLE \ >> _IOWR('p', 0x01, struct efi_getvariable) >> @@ -122,4 +129,7 @@ struct efi_querycapsulecapabilities { >> #define EFI_RUNTIME_QUERY_CAPSULECAPABILITIES \ >> _IOR('p', 0x0A, struct efi_querycapsulecapabilities) >> >> +#define EFI_RUNTIME_RESET_SYSTEM \ >> + _IOW('p', 0x0B, struct efi_resetsystem) >> + >> #endif /* _EFI_RUNTIME_H_ */ >> > > Will this be sent upstream to land in the linux driver? Of course, will upstream it. > > Acked-by: Colin Ian King <colin.king@canonical.com> >
On 2017-09-22 01:26 AM, Ivan Hu wrote: > Reset system by UEFI runtime service will not be tested on fwts. Still add this > patch to efi_runtime driver to make it more complete on UEFI runtime interfaces. > > Signed-off-by: Ivan Hu <ivan.hu@canonical.com> > --- > efi_runtime/efi_runtime.c | 23 +++++++++++++++++++++++ > efi_runtime/efi_runtime.h | 10 ++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c > index 6570a54..e29430c 100644 > --- a/efi_runtime/efi_runtime.c > +++ b/efi_runtime/efi_runtime.c > @@ -561,6 +561,29 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg) > return 0; > } > > +static long efi_runtime_reset_system(unsigned long arg) > +{ > + struct efi_resetsystem __user *resetsystem_user; > + struct efi_resetsystem resetsystem; > + void *data = NULL; > + > + resetsystem_user = (struct efi_resetsystem __user *)arg; > + if (copy_from_user(&resetsystem, resetsystem_user, > + sizeof(resetsystem))) > + return -EFAULT; > + if (resetsystem.data_size != 0) { > + data = memdup_user((void *)resetsystem.data, > + resetsystem.data_size); > + if (IS_ERR(data)) > + return PTR_ERR(data); > + } > + > + efi.reset_system(resetsystem.reset_type, resetsystem.status, > + resetsystem.data_size, (efi_char16_t *)data); > + > + kfree(data); > + return 0; > +} > > #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) > static long efi_runtime_query_variableinfo(unsigned long arg) > diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h > index fa67a80..4cf8e51 100644 > --- a/efi_runtime/efi_runtime.h > +++ b/efi_runtime/efi_runtime.h > @@ -94,6 +94,13 @@ struct efi_querycapsulecapabilities { > efi_status_t *status; > } __packed; > > +struct efi_resetsystem { > + int reset_type; > + efi_status_t status; > + unsigned long data_size; > + efi_char16_t *data; > +} __packed; > + > /* ioctl calls that are permitted to the /dev/efi_runtime interface. */ > #define EFI_RUNTIME_GET_VARIABLE \ > _IOWR('p', 0x01, struct efi_getvariable) > @@ -122,4 +129,7 @@ struct efi_querycapsulecapabilities { > #define EFI_RUNTIME_QUERY_CAPSULECAPABILITIES \ > _IOR('p', 0x0A, struct efi_querycapsulecapabilities) > > +#define EFI_RUNTIME_RESET_SYSTEM \ > + _IOW('p', 0x0B, struct efi_resetsystem) > + > #endif /* _EFI_RUNTIME_H_ */ > Acked-by: Alex Hung <alex.hung@canonical.com>
diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c index 6570a54..e29430c 100644 --- a/efi_runtime/efi_runtime.c +++ b/efi_runtime/efi_runtime.c @@ -561,6 +561,29 @@ static long efi_runtime_get_nexthighmonocount(unsigned long arg) return 0; } +static long efi_runtime_reset_system(unsigned long arg) +{ + struct efi_resetsystem __user *resetsystem_user; + struct efi_resetsystem resetsystem; + void *data = NULL; + + resetsystem_user = (struct efi_resetsystem __user *)arg; + if (copy_from_user(&resetsystem, resetsystem_user, + sizeof(resetsystem))) + return -EFAULT; + if (resetsystem.data_size != 0) { + data = memdup_user((void *)resetsystem.data, + resetsystem.data_size); + if (IS_ERR(data)) + return PTR_ERR(data); + } + + efi.reset_system(resetsystem.reset_type, resetsystem.status, + resetsystem.data_size, (efi_char16_t *)data); + + kfree(data); + return 0; +} #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) static long efi_runtime_query_variableinfo(unsigned long arg) diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h index fa67a80..4cf8e51 100644 --- a/efi_runtime/efi_runtime.h +++ b/efi_runtime/efi_runtime.h @@ -94,6 +94,13 @@ struct efi_querycapsulecapabilities { efi_status_t *status; } __packed; +struct efi_resetsystem { + int reset_type; + efi_status_t status; + unsigned long data_size; + efi_char16_t *data; +} __packed; + /* ioctl calls that are permitted to the /dev/efi_runtime interface. */ #define EFI_RUNTIME_GET_VARIABLE \ _IOWR('p', 0x01, struct efi_getvariable) @@ -122,4 +129,7 @@ struct efi_querycapsulecapabilities { #define EFI_RUNTIME_QUERY_CAPSULECAPABILITIES \ _IOR('p', 0x0A, struct efi_querycapsulecapabilities) +#define EFI_RUNTIME_RESET_SYSTEM \ + _IOW('p', 0x0B, struct efi_resetsystem) + #endif /* _EFI_RUNTIME_H_ */
Reset system by UEFI runtime service will not be tested on fwts. Still add this patch to efi_runtime driver to make it more complete on UEFI runtime interfaces. Signed-off-by: Ivan Hu <ivan.hu@canonical.com> --- efi_runtime/efi_runtime.c | 23 +++++++++++++++++++++++ efi_runtime/efi_runtime.h | 10 ++++++++++ 2 files changed, 33 insertions(+)