diff mbox series

efi_runtime: add resetsystem runtime service

Message ID 1506068808-3574-1-git-send-email-ivan.hu@canonical.com
State Accepted
Headers show
Series efi_runtime: add resetsystem runtime service | expand

Commit Message

Ivan Hu Sept. 22, 2017, 8:26 a.m. UTC
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(+)

Comments

Colin Ian King Sept. 22, 2017, 8:31 a.m. UTC | #1
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>
Ivan Hu Sept. 22, 2017, 8:32 a.m. UTC | #2
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>
>
Alex Hung Sept. 22, 2017, 6:42 p.m. UTC | #3
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 mbox series

Patch

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_ */