[PATCH 2/2] efi_runtime: reuse the in-kernel guid structure

Ivan Hu ivan.hu at canonical.com
Mon Jul 4 09:25:35 UTC 2016


reuse the in-kernel guid structure efi_guid_t instead of making our own one.

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 efi_runtime/efi_runtime.c | 49 ++++++++---------------------------------------
 efi_runtime/efi_runtime.h | 17 ++++++----------
 2 files changed, 14 insertions(+), 52 deletions(-)

diff --git a/efi_runtime/efi_runtime.c b/efi_runtime/efi_runtime.c
index 9e1fb87..115b1b5 100644
--- a/efi_runtime/efi_runtime.c
+++ b/efi_runtime/efi_runtime.c
@@ -74,32 +74,6 @@ static void convert_to_efi_time(efi_time_t *eft, EFI_TIME *time)
 	eft->pad2 = time->Pad2;
 }
 
-static void convert_from_guid(efi_guid_t *vendor, EFI_GUID *vendor_guid)
-{
-	int i;
-	for (i = 0; i < 16; i++) {
-		if (i < 4)
-			vendor->b[i] = (vendor_guid->Data1 >> (8*i)) & 0xff;
-		else if (i < 6)
-			vendor->b[i] = (vendor_guid->Data2 >> (8*(i-4))) & 0xff;
-		else if (i < 8)
-			vendor->b[i] = (vendor_guid->Data3 >> (8*(i-6))) & 0xff;
-		else
-			vendor->b[i] = (vendor_guid->Data4[i-8]);
-	}
-}
-
-static void convert_to_guid(efi_guid_t *vendor, EFI_GUID *vendor_guid)
-{
-	int i;
-	vendor_guid->Data1 = vendor->b[0] + (vendor->b[1] << 8) +
-				(vendor->b[2] << 16) + (vendor->b[3] << 24);
-	vendor_guid->Data2 = vendor->b[4] + (vendor->b[5] << 8);
-	vendor_guid->Data3 = vendor->b[6] + (vendor->b[7] << 8);
-	for (i = 0; i < 8; i++)
-		vendor_guid->Data4[i] = vendor->b[i+8];
-}
-
 /*
  * Count the bytes in 'str', including the terminating NULL.
  *
@@ -238,7 +212,7 @@ static long efi_runtime_get_variable(unsigned long arg)
 	struct efi_getvariable __user *getvariable;
 	struct efi_getvariable getvariable_local;
 	unsigned long datasize, prev_datasize, *dz;
-	efi_guid_t vendor, *vd = NULL;
+	efi_guid_t vendor_guid, *vd = NULL;
 	efi_status_t status;
 	uint16_t *name = NULL;
 	uint32_t attr, *at;
@@ -254,13 +228,11 @@ static long efi_runtime_get_variable(unsigned long arg)
 	    get_user(datasize, getvariable_local.DataSize))
 		return -EFAULT;
 	if (getvariable_local.VendorGuid) {
-		EFI_GUID vendor_guid;
 
 		if (copy_from_user(&vendor_guid, getvariable_local.VendorGuid,
 			   sizeof(vendor_guid)))
 			return -EFAULT;
-		convert_from_guid(&vendor, &vendor_guid);
-		vd = &vendor;
+		vd = &vendor_guid;
 	}
 
 	if (getvariable_local.VariableName) {
@@ -312,8 +284,7 @@ static long efi_runtime_set_variable(unsigned long arg)
 {
 	struct efi_setvariable __user *setvariable;
 	struct efi_setvariable setvariable_local;
-	EFI_GUID vendor_guid;
-	efi_guid_t vendor;
+	efi_guid_t vendor_guid;
 	efi_status_t status;
 	uint16_t *name;
 	void *data;
@@ -328,8 +299,6 @@ static long efi_runtime_set_variable(unsigned long arg)
 			   sizeof(vendor_guid)))
 		return -EFAULT;
 
-	convert_from_guid(&vendor, &vendor_guid);
-
 	rv = copy_ucs2_from_user(&name, setvariable_local.VariableName);
 	if (rv)
 		return rv;
@@ -346,7 +315,7 @@ static long efi_runtime_set_variable(unsigned long arg)
 		return -EFAULT;
 	}
 
-	status = efi.set_variable(name, &vendor, setvariable_local.Attributes,
+	status = efi.set_variable(name, &vendor_guid, setvariable_local.Attributes,
 				  setvariable_local.DataSize, data);
 
 	kfree(data);
@@ -486,8 +455,8 @@ static long efi_runtime_get_nextvariablename(unsigned long arg)
 	struct efi_getnextvariablename getnextvariablename_local;
 	unsigned long name_size, prev_name_size = 0, *ns = NULL;
 	efi_status_t status;
-	efi_guid_t vendor, *vd = NULL;
-	EFI_GUID vendor_guid;
+	efi_guid_t *vd = NULL;
+	efi_guid_t vendor_guid;
 	uint16_t *name = NULL;
 	int rv;
 
@@ -509,8 +478,7 @@ static long efi_runtime_get_nextvariablename(unsigned long arg)
 		if (copy_from_user(&vendor_guid, getnextvariablename_local.VendorGuid,
 			   sizeof(vendor_guid)))
 			return -EFAULT;
-		convert_from_guid(&vendor, &vendor_guid);
-		vd = &vendor;
+		vd = &vendor_guid;
 	}
 
 	if (getnextvariablename_local.VariableName) {
@@ -552,9 +520,8 @@ static long efi_runtime_get_nextvariablename(unsigned long arg)
 	}
 
 	if (vd) {
-		convert_to_guid(vd, &vendor_guid);
 		if (copy_to_user(getnextvariablename_local.VendorGuid,
-				 &vendor_guid, sizeof(EFI_GUID)))
+				 vd, sizeof(efi_guid_t)))
 			return -EFAULT;
 	}
 
diff --git a/efi_runtime/efi_runtime.h b/efi_runtime/efi_runtime.h
index 149a179..092e842 100644
--- a/efi_runtime/efi_runtime.h
+++ b/efi_runtime/efi_runtime.h
@@ -21,6 +21,8 @@
 #ifndef _EFI_RUNTIME_H_
 #define _EFI_RUNTIME_H_
 
+#include <linux/efi.h>
+
 typedef enum {
 	EfiResetCold,
 	EfiResetWarm,
@@ -28,13 +30,6 @@ typedef enum {
 } EFI_RESET_TYPE;
 
 typedef struct {
-	uint32_t	Data1;
-	uint16_t	Data2;
-	uint16_t	Data3;
-	uint8_t		Data4[8];
-} __attribute__ ((packed)) EFI_GUID;
-
-typedef struct {
 	uint16_t	Year;		/* 1900 – 9999 */
 	uint8_t		Month;		/* 1 – 12 */
 	uint8_t		Day;		/* 1 – 31 */
@@ -55,7 +50,7 @@ typedef struct {
 } __attribute__ ((packed)) EFI_TIME_CAPABILITIES;
 
 typedef struct {
-	EFI_GUID CapsuleGuid;
+	efi_guid_t CapsuleGuid;
 	uint32_t HeaderSize;
 	uint32_t Flags;
 	uint32_t CapsuleImageSize;
@@ -63,7 +58,7 @@ typedef struct {
 
 struct efi_getvariable {
 	uint16_t	*VariableName;
-	EFI_GUID	*VendorGuid;
+	efi_guid_t	*VendorGuid;
 	uint32_t	*Attributes;
 	uint64_t	*DataSize;
 	void		*Data;
@@ -72,7 +67,7 @@ struct efi_getvariable {
 
 struct efi_setvariable {
 	uint16_t	*VariableName;
-	EFI_GUID	*VendorGuid;
+	efi_guid_t	*VendorGuid;
 	uint32_t	Attributes;
 	uint64_t	DataSize;
 	void		*Data;
@@ -82,7 +77,7 @@ struct efi_setvariable {
 struct efi_getnextvariablename {
 	uint64_t	*VariableNameSize;
 	uint16_t	*VariableName;
-	EFI_GUID	*VendorGuid;
+	efi_guid_t	*VendorGuid;
 	uint64_t	*status;
 } __attribute__ ((packed));
 
-- 
1.9.1




More information about the fwts-devel mailing list