On 22 August 2018 at 11:15, Ivan Hu <ivan.hu@xxxxxxxxxxxxx> wrote: > Add exporting the UEFI runtime service ResetSystem for upper application or test > tools to use. > > Signed-off-by: Ivan Hu <ivan.hu@xxxxxxxxxxxxx> Queued in efi/next - thanks. > --- > drivers/firmware/efi/test/efi_test.c | 27 +++++++++++++++++++++++++++ > drivers/firmware/efi/test/efi_test.h | 10 ++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/drivers/firmware/efi/test/efi_test.c b/drivers/firmware/efi/test/efi_test.c > index 08129b7..a00cb67 100644 > --- a/drivers/firmware/efi/test/efi_test.c > +++ b/drivers/firmware/efi/test/efi_test.c > @@ -542,6 +542,30 @@ 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; > +} > + > static long efi_runtime_query_variableinfo(unsigned long arg) > { > struct efi_queryvariableinfo __user *queryvariableinfo_user; > @@ -679,6 +703,9 @@ static long efi_test_ioctl(struct file *file, unsigned int cmd, > > case EFI_RUNTIME_QUERY_CAPSULECAPABILITIES: > return efi_runtime_query_capsulecaps(arg); > + > + case EFI_RUNTIME_RESET_SYSTEM: > + return efi_runtime_reset_system(arg); > } > > return -ENOTTY; > diff --git a/drivers/firmware/efi/test/efi_test.h b/drivers/firmware/efi/test/efi_test.h > index a33a6c6..1cc421a 100644 > --- a/drivers/firmware/efi/test/efi_test.h > +++ b/drivers/firmware/efi/test/efi_test.h > @@ -80,6 +80,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; > + > #define EFI_RUNTIME_GET_VARIABLE \ > _IOWR('p', 0x01, struct efi_getvariable) > #define EFI_RUNTIME_SET_VARIABLE \ > @@ -107,4 +114,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 /* _DRIVERS_FIRMWARE_EFI_TEST_H_ */ > -- > 2.7.4 >