From f68c6d946cc21169ee74dbb10e89e1495ba31aae Mon Sep 17 00:00:00 2001
From: Vladimir Serbinenko <phcoder@gmail.com>
Date: Wed, 11 Dec 2013 15:57:08 +0100
Subject: [PATCH 2/9] 	Introduce grub_efi_packed_guid and use it where
 alignment is not 	guaranteed.

---
 grub-core/commands/efi/acpi.c  |  12 ++---
 grub-core/commands/efi/lssal.c |   4 +-
 grub-core/kern/efi/efi.c       | 106 ++++++++++++++++++++---------------------
 include/grub/efi/api.h         |  23 ++++++---
 4 files changed, 76 insertions(+), 69 deletions(-)

Index: grub-2.00/grub-core/commands/efi/lssal.c
===================================================================
--- grub-2.00.orig/grub-core/commands/efi/lssal.c
+++ grub-2.00/grub-core/commands/efi/lssal.c
@@ -135,12 +135,12 @@ grub_cmd_lssal (struct grub_command *cmd
   const grub_efi_system_table_t *st = grub_efi_system_table;
   grub_efi_configuration_table_t *t = st->configuration_table;
   unsigned int i;
-  grub_efi_guid_t guid = GRUB_EFI_SAL_TABLE_GUID;
+  grub_efi_packed_guid_t guid = GRUB_EFI_SAL_TABLE_GUID;
 
   for (i = 0; i < st->num_table_entries; i++)
     {
       if (grub_memcmp (&guid, &t->vendor_guid,
-		       sizeof (grub_efi_guid_t)) == 0)
+		       sizeof (grub_efi_packed_guid_t)) == 0)
 	{
 	  disp_sal (t->vendor_table);
 	  return GRUB_ERR_NONE;
Index: grub-2.00/grub-core/kern/efi/efi.c
===================================================================
--- grub-2.00.orig/grub-core/kern/efi/efi.c
+++ grub-2.00/grub-core/kern/efi/efi.c
@@ -431,20 +431,19 @@ grub_efi_print_device_path (grub_efi_dev
 	      break;
 	    case GRUB_EFI_VENDOR_DEVICE_PATH_SUBTYPE:
 	      {
-		grub_efi_vendor_device_path_t vendor;
-		grub_memcpy (&vendor, dp, sizeof (vendor));
+		grub_efi_vendor_device_path_t *vendor = (grub_efi_vendor_device_path_t *) dp;
 		grub_printf ("/Vendor(%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x)",
-			     (unsigned) vendor.vendor_guid.data1,
-			     (unsigned) vendor.vendor_guid.data2,
-			     (unsigned) vendor.vendor_guid.data3,
-			     (unsigned) vendor.vendor_guid.data4[0],
-			     (unsigned) vendor.vendor_guid.data4[1],
-			     (unsigned) vendor.vendor_guid.data4[2],
-			     (unsigned) vendor.vendor_guid.data4[3],
-			     (unsigned) vendor.vendor_guid.data4[4],
-			     (unsigned) vendor.vendor_guid.data4[5],
-			     (unsigned) vendor.vendor_guid.data4[6],
-			     (unsigned) vendor.vendor_guid.data4[7]);
+			     (unsigned) vendor->vendor_guid.data1,
+			     (unsigned) vendor->vendor_guid.data2,
+			     (unsigned) vendor->vendor_guid.data3,
+			     (unsigned) vendor->vendor_guid.data4[0],
+			     (unsigned) vendor->vendor_guid.data4[1],
+			     (unsigned) vendor->vendor_guid.data4[2],
+			     (unsigned) vendor->vendor_guid.data4[3],
+			     (unsigned) vendor->vendor_guid.data4[4],
+			     (unsigned) vendor->vendor_guid.data4[5],
+			     (unsigned) vendor->vendor_guid.data4[6],
+			     (unsigned) vendor->vendor_guid.data4[7]);
 	      }
 	      break;
 	    case GRUB_EFI_CONTROLLER_DEVICE_PATH_SUBTYPE:
@@ -651,20 +650,20 @@ grub_efi_print_device_path (grub_efi_dev
 	      break;
 	    case GRUB_EFI_VENDOR_MESSAGING_DEVICE_PATH_SUBTYPE:
 	      {
-		grub_efi_vendor_messaging_device_path_t vendor;
-		grub_memcpy (&vendor, dp, sizeof (vendor));
+		grub_efi_vendor_messaging_device_path_t *vendor
+		  = (grub_efi_vendor_messaging_device_path_t *) dp;
 		grub_printf ("/Vendor(%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x)",
-			     (unsigned) vendor.vendor_guid.data1,
-			     (unsigned) vendor.vendor_guid.data2,
-			     (unsigned) vendor.vendor_guid.data3,
-			     (unsigned) vendor.vendor_guid.data4[0],
-			     (unsigned) vendor.vendor_guid.data4[1],
-			     (unsigned) vendor.vendor_guid.data4[2],
-			     (unsigned) vendor.vendor_guid.data4[3],
-			     (unsigned) vendor.vendor_guid.data4[4],
-			     (unsigned) vendor.vendor_guid.data4[5],
-			     (unsigned) vendor.vendor_guid.data4[6],
-			     (unsigned) vendor.vendor_guid.data4[7]);
+			     (unsigned) vendor->vendor_guid.data1,
+			     (unsigned) vendor->vendor_guid.data2,
+			     (unsigned) vendor->vendor_guid.data3,
+			     (unsigned) vendor->vendor_guid.data4[0],
+			     (unsigned) vendor->vendor_guid.data4[1],
+			     (unsigned) vendor->vendor_guid.data4[2],
+			     (unsigned) vendor->vendor_guid.data4[3],
+			     (unsigned) vendor->vendor_guid.data4[4],
+			     (unsigned) vendor->vendor_guid.data4[5],
+			     (unsigned) vendor->vendor_guid.data4[6],
+			     (unsigned) vendor->vendor_guid.data4[7]);
 	      }
 	      break;
 	    default:
@@ -678,22 +677,21 @@ grub_efi_print_device_path (grub_efi_dev
 	    {
 	    case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE:
 	      {
-		grub_efi_hard_drive_device_path_t hd;
-		grub_memcpy (&hd, dp, len);
+		grub_efi_hard_drive_device_path_t *hd = (grub_efi_hard_drive_device_path_t *) dp;
 		grub_printf ("/HD(%u,%llx,%llx,%02x%02x%02x%02x%02x%02x%02x%02x,%x,%x)",
-			     hd.partition_number,
-			     (unsigned long long) hd.partition_start,
-			     (unsigned long long) hd.partition_size,
-			     (unsigned) hd.partition_signature[0],
-			     (unsigned) hd.partition_signature[1],
-			     (unsigned) hd.partition_signature[2],
-			     (unsigned) hd.partition_signature[3],
-			     (unsigned) hd.partition_signature[4],
-			     (unsigned) hd.partition_signature[5],
-			     (unsigned) hd.partition_signature[6],
-			     (unsigned) hd.partition_signature[7],
-			     (unsigned) hd.mbr_type,
-			     (unsigned) hd.signature_type);
+			     hd->partition_number,
+			     (unsigned long long) hd->partition_start,
+			     (unsigned long long) hd->partition_size,
+			     (unsigned) hd->partition_signature[0],
+			     (unsigned) hd->partition_signature[1],
+			     (unsigned) hd->partition_signature[2],
+			     (unsigned) hd->partition_signature[3],
+			     (unsigned) hd->partition_signature[4],
+			     (unsigned) hd->partition_signature[5],
+			     (unsigned) hd->partition_signature[6],
+			     (unsigned) hd->partition_signature[7],
+			     (unsigned) hd->mbr_type,
+			     (unsigned) hd->signature_type);
 	      }
 	      break;
 	    case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE:
@@ -708,20 +706,20 @@ grub_efi_print_device_path (grub_efi_dev
 	      break;
 	    case GRUB_EFI_VENDOR_MEDIA_DEVICE_PATH_SUBTYPE:
 	      {
-		grub_efi_vendor_media_device_path_t vendor;
-		grub_memcpy (&vendor, dp, sizeof (vendor));
+		grub_efi_vendor_device_path_t *vendor = (grub_efi_vendor_device_path_t *) dp;
+
 		grub_printf ("/Vendor(%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x)",
-			     (unsigned) vendor.vendor_guid.data1,
-			     (unsigned) vendor.vendor_guid.data2,
-			     (unsigned) vendor.vendor_guid.data3,
-			     (unsigned) vendor.vendor_guid.data4[0],
-			     (unsigned) vendor.vendor_guid.data4[1],
-			     (unsigned) vendor.vendor_guid.data4[2],
-			     (unsigned) vendor.vendor_guid.data4[3],
-			     (unsigned) vendor.vendor_guid.data4[4],
-			     (unsigned) vendor.vendor_guid.data4[5],
-			     (unsigned) vendor.vendor_guid.data4[6],
-			     (unsigned) vendor.vendor_guid.data4[7]);
+			     (unsigned) vendor->vendor_guid.data1,
+			     (unsigned) vendor->vendor_guid.data2,
+			     (unsigned) vendor->vendor_guid.data3,
+			     (unsigned) vendor->vendor_guid.data4[0],
+			     (unsigned) vendor->vendor_guid.data4[1],
+			     (unsigned) vendor->vendor_guid.data4[2],
+			     (unsigned) vendor->vendor_guid.data4[3],
+			     (unsigned) vendor->vendor_guid.data4[4],
+			     (unsigned) vendor->vendor_guid.data4[5],
+			     (unsigned) vendor->vendor_guid.data4[6],
+			     (unsigned) vendor->vendor_guid.data4[7]);
 	      }
 	      break;
 	    case GRUB_EFI_FILE_PATH_DEVICE_PATH_SUBTYPE:
Index: grub-2.00/include/grub/efi/api.h
===================================================================
--- grub-2.00.orig/include/grub/efi/api.h
+++ grub-2.00/include/grub/efi/api.h
@@ -384,6 +384,15 @@ struct grub_efi_guid
 } __attribute__ ((aligned(8)));
 typedef struct grub_efi_guid grub_efi_guid_t;
 
+struct grub_efi_packed_guid
+{
+  grub_uint32_t data1;
+  grub_uint16_t data2;
+  grub_uint16_t data3;
+  grub_uint8_t data4[8];
+} __attribute__ ((packed));
+typedef struct grub_efi_packed_guid grub_efi_packed_guid_t;
+
 /* XXX although the spec does not specify the padding, this actually
    must have the padding!  */
 struct grub_efi_memory_descriptor
@@ -466,7 +475,7 @@ typedef struct grub_efi_memory_mapped_de
 struct grub_efi_vendor_device_path
 {
   grub_efi_device_path_t header;
-  grub_efi_guid_t vendor_guid;
+  grub_efi_packed_guid_t vendor_guid;
   grub_efi_uint8_t vendor_defined_data[0];
 } __attribute__ ((packed));
 typedef struct grub_efi_vendor_device_path grub_efi_vendor_device_path_t;
@@ -660,7 +669,7 @@ typedef struct grub_efi_uart_device_path
 struct grub_efi_vendor_messaging_device_path
 {
   grub_efi_device_path_t header;
-  grub_efi_guid_t vendor_guid;
+  grub_efi_packed_guid_t vendor_guid;
   grub_efi_uint8_t vendor_defined_data[0];
 } __attribute__ ((packed));
 typedef struct grub_efi_vendor_messaging_device_path grub_efi_vendor_messaging_device_path_t;
@@ -698,7 +707,7 @@ typedef struct grub_efi_cdrom_device_pat
 struct grub_efi_vendor_media_device_path
 {
   grub_efi_device_path_t header;
-  grub_efi_guid_t vendor_guid;
+  grub_efi_packed_guid_t vendor_guid;
   grub_efi_uint8_t vendor_defined_data[0];
 } __attribute__ ((packed));
 typedef struct grub_efi_vendor_media_device_path grub_efi_vendor_media_device_path_t;
@@ -717,7 +726,7 @@ typedef struct grub_efi_file_path_device
 struct grub_efi_protocol_device_path
 {
   grub_efi_device_path_t header;
-  grub_efi_guid_t guid;
+  grub_efi_packed_guid_t guid;
 } __attribute__ ((packed));
 typedef struct grub_efi_protocol_device_path grub_efi_protocol_device_path_t;
 
@@ -726,7 +735,7 @@ typedef struct grub_efi_protocol_device_
 struct grub_efi_piwg_device_path
 {
   grub_efi_device_path_t header;
-  grub_efi_guid_t guid __attribute__ ((packed));
+  grub_efi_packed_guid_t guid;
 } __attribute__ ((packed));
 typedef struct grub_efi_piwg_device_path grub_efi_piwg_device_path_t;
 
@@ -984,7 +993,7 @@ struct grub_efi_boot_services
 
   grub_efi_status_t
   (*protocols_per_handle) (grub_efi_handle_t handle,
-			   grub_efi_guid_t ***protocol_buffer,
+			   grub_efi_packed_guid_t ***protocol_buffer,
 			   grub_efi_uintn_t *protocol_buffer_count);
 
   grub_efi_status_t
@@ -1083,7 +1092,7 @@ typedef struct grub_efi_runtime_services
 
 struct grub_efi_configuration_table
 {
-  grub_efi_guid_t vendor_guid;
+  grub_efi_packed_guid_t vendor_guid;
   void *vendor_table;
 } __attribute__ ((packed));
 typedef struct grub_efi_configuration_table grub_efi_configuration_table_t;
Index: grub-2.00/grub-core/commands/efi/acpi.c
===================================================================
--- grub-2.00.orig/grub-core/commands/efi/acpi.c
+++ grub-2.00/grub-core/commands/efi/acpi.c
@@ -26,14 +26,14 @@ struct grub_acpi_rsdp_v10 *
 grub_machine_acpi_get_rsdpv1 (void)
 {
   unsigned i;
-  static grub_efi_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
+  static grub_efi_packed_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
 
   for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
     {
-      grub_efi_guid_t *guid =
+      grub_efi_packed_guid_t *guid =
 	&grub_efi_system_table->configuration_table[i].vendor_guid;
 
-      if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_guid_t)))
+      if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_packed_guid_t)))
 	return (struct grub_acpi_rsdp_v10 *)
 	  grub_efi_system_table->configuration_table[i].vendor_table;
     }
@@ -44,14 +44,14 @@ struct grub_acpi_rsdp_v20 *
 grub_machine_acpi_get_rsdpv2 (void)
 {
   unsigned i;
-  static grub_efi_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
+  static grub_efi_packed_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
 
   for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
     {
-      grub_efi_guid_t *guid =
+      grub_efi_packed_guid_t *guid =
 	&grub_efi_system_table->configuration_table[i].vendor_guid;
 
-      if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_efi_guid_t)))
+      if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_efi_packed_guid_t)))
 	return (struct grub_acpi_rsdp_v20 *)
 	  grub_efi_system_table->configuration_table[i].vendor_table;
     }
