On 22 August 2018 at 11:15, Ivan Hu <[email protected]> wrote:
> Add exporting the UEFI runtime service ResetSystem for upper application or
> test
> tools to use.
>
> Signed-off-by: Ivan Hu <[email protected]>
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
>