]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c
OvmfPkg/AcpiPlatformDxe: Measure ACPI table from QEMU in TDVF
[mirror_edk2.git] / OvmfPkg / AcpiPlatformDxe / QemuFwCfgAcpi.c
index 1bc5fe297a96e5b6dd3a2855e2474cac09286a87..68abc34f2280ca5aaebc23dfa6f4223a45651c4c 100644 (file)
@@ -4,44 +4,40 @@
   Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
   Copyright (C) 2012-2014, Red Hat, Inc.\r
 \r
-  This program and the accompanying materials are licensed and made available\r
-  under the terms and conditions of the BSD License which accompanies this\r
-  distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
-  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-#include "AcpiPlatform.h"\r
-#include "QemuLoader.h"\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/QemuFwCfgLib.h>\r
-#include <Library/QemuFwCfgS3Lib.h>\r
-#include <Library/DxeServicesTableLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/OrderedCollectionLib.h>\r
-#include <IndustryStandard/Acpi.h>\r
+#include <IndustryStandard/Acpi.h>            // EFI_ACPI_DESCRIPTION_HEADER\r
+#include <IndustryStandard/QemuLoader.h>      // QEMU_LOADER_FNAME_SIZE\r
+#include <IndustryStandard/UefiTcgPlatform.h>\r
+#include <Library/BaseLib.h>                  // AsciiStrCmp()\r
+#include <Library/BaseMemoryLib.h>            // CopyMem()\r
+#include <Library/DebugLib.h>                 // DEBUG()\r
+#include <Library/MemoryAllocationLib.h>      // AllocatePool()\r
+#include <Library/OrderedCollectionLib.h>     // OrderedCollectionMin()\r
+#include <Library/QemuFwCfgLib.h>             // QemuFwCfgFindFile()\r
+#include <Library/QemuFwCfgS3Lib.h>           // QemuFwCfgS3Enabled()\r
+#include <Library/UefiBootServicesTableLib.h> // gBS\r
+#include <Library/TpmMeasurementLib.h>\r
 \r
+#include "AcpiPlatform.h"\r
 \r
 //\r
 // The user structure for the ordered collection that will track the fw_cfg\r
 // blobs under processing.\r
 //\r
 typedef struct {\r
-  UINT8   File[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated name of the fw_cfg\r
-                                        // blob. This is the ordering / search\r
-                                        // key.\r
-  UINTN   Size;                         // The number of bytes in this blob.\r
-  UINT8   *Base;                        // Pointer to the blob data.\r
-  BOOLEAN HostsOnlyTableData;           // TRUE iff the blob has been found to\r
-                                        // only contain data that is directly\r
-                                        // part of ACPI tables.\r
+  UINT8      File[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated name of the fw_cfg\r
+                                           // blob. This is the ordering / search\r
+                                           // key.\r
+  UINTN      Size;                         // The number of bytes in this blob.\r
+  UINT8      *Base;                        // Pointer to the blob data.\r
+  BOOLEAN    HostsOnlyTableData;           // TRUE iff the blob has been found to\r
+                                           // only contain data that is directly\r
+                                           // part of ACPI tables.\r
 } BLOB;\r
 \r
-\r
 /**\r
   Compare a standalone key against a user structure containing an embedded key.\r
 \r
@@ -60,17 +56,16 @@ STATIC
 INTN\r
 EFIAPI\r
 BlobKeyCompare (\r
-  IN CONST VOID *StandaloneKey,\r
-  IN CONST VOID *UserStruct\r
+  IN CONST VOID  *StandaloneKey,\r
+  IN CONST VOID  *UserStruct\r
   )\r
 {\r
-  CONST BLOB *Blob;\r
+  CONST BLOB  *Blob;\r
 \r
   Blob = UserStruct;\r
   return AsciiStrCmp (StandaloneKey, (CONST CHAR8 *)Blob->File);\r
 }\r
 \r
-\r
 /**\r
   Comparator function for two user structures.\r
 \r
@@ -88,17 +83,16 @@ STATIC
 INTN\r
 EFIAPI\r
 BlobCompare (\r
-  IN CONST VOID *UserStruct1,\r
-  IN CONST VOID *UserStruct2\r
+  IN CONST VOID  *UserStruct1,\r
+  IN CONST VOID  *UserStruct2\r
   )\r
 {\r
-  CONST BLOB *Blob1;\r
+  CONST BLOB  *Blob1;\r
 \r
   Blob1 = UserStruct1;\r
   return BlobKeyCompare (Blob1->File, UserStruct2);\r
 }\r
 \r
-\r
 /**\r
   Comparator function for two opaque pointers, ordering on (unsigned) pointer\r
   value itself.\r
@@ -118,27 +112,187 @@ STATIC
 INTN\r
 EFIAPI\r
 PointerCompare (\r
-  IN CONST VOID *Pointer1,\r
-  IN CONST VOID *Pointer2\r
+  IN CONST VOID  *Pointer1,\r
+  IN CONST VOID  *Pointer2\r
   )\r
 {\r
   if (Pointer1 == Pointer2) {\r
     return 0;\r
   }\r
+\r
   if ((UINTN)Pointer1 < (UINTN)Pointer2) {\r
     return -1;\r
   }\r
+\r
   return 1;\r
 }\r
 \r
+/**\r
+  Comparator function for two ASCII strings. Can be used as both Key and\r
+  UserStruct comparator.\r
+\r
+  This function exists solely so we can avoid casting &AsciiStrCmp to\r
+  ORDERED_COLLECTION_USER_COMPARE and ORDERED_COLLECTION_KEY_COMPARE.\r
+\r
+  @param[in] AsciiString1  Pointer to the first ASCII string.\r
+\r
+  @param[in] AsciiString2  Pointer to the second ASCII string.\r
+\r
+  @return  The return value of AsciiStrCmp (AsciiString1, AsciiString2).\r
+**/\r
+STATIC\r
+INTN\r
+EFIAPI\r
+AsciiStringCompare (\r
+  IN CONST VOID  *AsciiString1,\r
+  IN CONST VOID  *AsciiString2\r
+  )\r
+{\r
+  return AsciiStrCmp (AsciiString1, AsciiString2);\r
+}\r
+\r
+/**\r
+  Release the ORDERED_COLLECTION structure populated by\r
+  CollectAllocationsRestrictedTo32Bit() (below).\r
+\r
+  This function may be called by CollectAllocationsRestrictedTo32Bit() itself,\r
+  on the error path.\r
+\r
+  @param[in] AllocationsRestrictedTo32Bit  The ORDERED_COLLECTION structure to\r
+                                           release.\r
+**/\r
+STATIC\r
+VOID\r
+ReleaseAllocationsRestrictedTo32Bit (\r
+  IN ORDERED_COLLECTION  *AllocationsRestrictedTo32Bit\r
+  )\r
+{\r
+  ORDERED_COLLECTION_ENTRY  *Entry, *Entry2;\r
+\r
+  for (Entry = OrderedCollectionMin (AllocationsRestrictedTo32Bit);\r
+       Entry != NULL;\r
+       Entry = Entry2)\r
+  {\r
+    Entry2 = OrderedCollectionNext (Entry);\r
+    OrderedCollectionDelete (AllocationsRestrictedTo32Bit, Entry, NULL);\r
+  }\r
+\r
+  OrderedCollectionUninit (AllocationsRestrictedTo32Bit);\r
+}\r
+\r
+/**\r
+  Iterate over the linker/loader script, and collect the names of the fw_cfg\r
+  blobs that are referenced by QEMU_LOADER_ADD_POINTER.PointeeFile fields, such\r
+  that QEMU_LOADER_ADD_POINTER.PointerSize is less than 8. This means that the\r
+  pointee blob's address will have to be patched into a narrower-than-8 byte\r
+  pointer field, hence the pointee blob must not be allocated from 64-bit\r
+  address space.\r
+\r
+  @param[out] AllocationsRestrictedTo32Bit  The ORDERED_COLLECTION structure\r
+                                            linking (not copying / owning) such\r
+                                            QEMU_LOADER_ADD_POINTER.PointeeFile\r
+                                            fields that name the blobs\r
+                                            restricted from 64-bit allocation.\r
+\r
+  @param[in] LoaderStart                    Points to the first entry in the\r
+                                            linker/loader script.\r
+\r
+  @param[in] LoaderEnd                      Points one past the last entry in\r
+                                            the linker/loader script.\r
+\r
+  @retval EFI_SUCCESS           AllocationsRestrictedTo32Bit has been\r
+                                populated.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  Memory allocation failed.\r
+\r
+  @retval EFI_PROTOCOL_ERROR    Invalid linker/loader script contents.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+CollectAllocationsRestrictedTo32Bit (\r
+  OUT ORDERED_COLLECTION      **AllocationsRestrictedTo32Bit,\r
+  IN CONST QEMU_LOADER_ENTRY  *LoaderStart,\r
+  IN CONST QEMU_LOADER_ENTRY  *LoaderEnd\r
+  )\r
+{\r
+  ORDERED_COLLECTION       *Collection;\r
+  CONST QEMU_LOADER_ENTRY  *LoaderEntry;\r
+  EFI_STATUS               Status;\r
+\r
+  Collection = OrderedCollectionInit (AsciiStringCompare, AsciiStringCompare);\r
+  if (Collection == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  for (LoaderEntry = LoaderStart; LoaderEntry < LoaderEnd; ++LoaderEntry) {\r
+    CONST QEMU_LOADER_ADD_POINTER  *AddPointer;\r
+\r
+    if (LoaderEntry->Type != QemuLoaderCmdAddPointer) {\r
+      continue;\r
+    }\r
+\r
+    AddPointer = &LoaderEntry->Command.AddPointer;\r
+\r
+    if (AddPointer->PointerSize >= 8) {\r
+      continue;\r
+    }\r
+\r
+    if (AddPointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') {\r
+      DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
+      Status = EFI_PROTOCOL_ERROR;\r
+      goto RollBack;\r
+    }\r
+\r
+    Status = OrderedCollectionInsert (\r
+               Collection,\r
+               NULL,                           // Entry\r
+               (VOID *)AddPointer->PointeeFile\r
+               );\r
+    switch (Status) {\r
+      case EFI_SUCCESS:\r
+        DEBUG ((\r
+          DEBUG_VERBOSE,\r
+          "%a: restricting blob \"%a\" from 64-bit allocation\n",\r
+          __FUNCTION__,\r
+          AddPointer->PointeeFile\r
+          ));\r
+        break;\r
+      case EFI_ALREADY_STARTED:\r
+        //\r
+        // The restriction has been recorded already.\r
+        //\r
+        break;\r
+      case EFI_OUT_OF_RESOURCES:\r
+        goto RollBack;\r
+      default:\r
+        ASSERT (FALSE);\r
+    }\r
+  }\r
+\r
+  *AllocationsRestrictedTo32Bit = Collection;\r
+  return EFI_SUCCESS;\r
+\r
+RollBack:\r
+  ReleaseAllocationsRestrictedTo32Bit (Collection);\r
+  return Status;\r
+}\r
 \r
 /**\r
   Process a QEMU_LOADER_ALLOCATE command.\r
 \r
-  @param[in] Allocate     The QEMU_LOADER_ALLOCATE command to process.\r
+  @param[in] Allocate                      The QEMU_LOADER_ALLOCATE command to\r
+                                           process.\r
 \r
-  @param[in,out] Tracker  The ORDERED_COLLECTION tracking the BLOB user\r
-                          structures created thus far.\r
+  @param[in,out] Tracker                   The ORDERED_COLLECTION tracking the\r
+                                           BLOB user structures created thus\r
+                                           far.\r
+\r
+  @param[in] AllocationsRestrictedTo32Bit  The ORDERED_COLLECTION populated by\r
+                                           the function\r
+                                           CollectAllocationsRestrictedTo32Bit,\r
+                                           naming the fw_cfg blobs that must\r
+                                           not be allocated from 64-bit address\r
+                                           space.\r
 \r
   @retval EFI_SUCCESS           An area of whole AcpiNVS pages has been\r
                                 allocated for the blob contents, and the\r
@@ -163,39 +317,61 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 ProcessCmdAllocate (\r
-  IN CONST QEMU_LOADER_ALLOCATE *Allocate,\r
-  IN OUT ORDERED_COLLECTION     *Tracker\r
+  IN CONST QEMU_LOADER_ALLOCATE  *Allocate,\r
+  IN OUT ORDERED_COLLECTION      *Tracker,\r
+  IN ORDERED_COLLECTION          *AllocationsRestrictedTo32Bit\r
   )\r
 {\r
-  FIRMWARE_CONFIG_ITEM FwCfgItem;\r
-  UINTN                FwCfgSize;\r
-  EFI_STATUS           Status;\r
-  UINTN                NumPages;\r
-  EFI_PHYSICAL_ADDRESS Address;\r
-  BLOB                 *Blob;\r
+  FIRMWARE_CONFIG_ITEM  FwCfgItem;\r
+  UINTN                 FwCfgSize;\r
+  EFI_STATUS            Status;\r
+  UINTN                 NumPages;\r
+  EFI_PHYSICAL_ADDRESS  Address;\r
+  BLOB                  *Blob;\r
 \r
   if (Allocate->File[QEMU_LOADER_FNAME_SIZE - 1] != '\0') {\r
-    DEBUG ((EFI_D_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
+    DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
   if (Allocate->Alignment > EFI_PAGE_SIZE) {\r
-    DEBUG ((EFI_D_ERROR, "%a: unsupported alignment 0x%x\n", __FUNCTION__,\r
-      Allocate->Alignment));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: unsupported alignment 0x%x\n",\r
+      __FUNCTION__,\r
+      Allocate->Alignment\r
+      ));\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   Status = QemuFwCfgFindFile ((CHAR8 *)Allocate->File, &FwCfgItem, &FwCfgSize);\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%a: QemuFwCfgFindFile(\"%a\"): %r\n", __FUNCTION__,\r
-      Allocate->File, Status));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: QemuFwCfgFindFile(\"%a\"): %r\n",\r
+      __FUNCTION__,\r
+      Allocate->File,\r
+      Status\r
+      ));\r
     return Status;\r
   }\r
 \r
   NumPages = EFI_SIZE_TO_PAGES (FwCfgSize);\r
-  Address = 0xFFFFFFFF;\r
-  Status = gBS->AllocatePages (AllocateMaxAddress, EfiACPIMemoryNVS, NumPages,\r
-                  &Address);\r
+  Address  = MAX_UINT64;\r
+  if (OrderedCollectionFind (\r
+        AllocationsRestrictedTo32Bit,\r
+        Allocate->File\r
+        ) != NULL)\r
+  {\r
+    Address = MAX_UINT32;\r
+  }\r
+\r
+  Status = gBS->AllocatePages (\r
+                  AllocateMaxAddress,\r
+                  EfiACPIMemoryNVS,\r
+                  NumPages,\r
+                  &Address\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -205,17 +381,23 @@ ProcessCmdAllocate (
     Status = EFI_OUT_OF_RESOURCES;\r
     goto FreePages;\r
   }\r
+\r
   CopyMem (Blob->File, Allocate->File, QEMU_LOADER_FNAME_SIZE);\r
-  Blob->Size = FwCfgSize;\r
-  Blob->Base = (VOID *)(UINTN)Address;\r
+  Blob->Size               = FwCfgSize;\r
+  Blob->Base               = (VOID *)(UINTN)Address;\r
   Blob->HostsOnlyTableData = TRUE;\r
 \r
   Status = OrderedCollectionInsert (Tracker, NULL, Blob);\r
   if (Status == RETURN_ALREADY_STARTED) {\r
-    DEBUG ((EFI_D_ERROR, "%a: duplicated file \"%a\"\n", __FUNCTION__,\r
-      Allocate->File));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: duplicated file \"%a\"\n",\r
+      __FUNCTION__,\r
+      Allocate->File\r
+      ));\r
     Status = EFI_PROTOCOL_ERROR;\r
   }\r
+\r
   if (EFI_ERROR (Status)) {\r
     goto FreeBlob;\r
   }\r
@@ -224,9 +406,32 @@ ProcessCmdAllocate (
   QemuFwCfgReadBytes (FwCfgSize, Blob->Base);\r
   ZeroMem (Blob->Base + Blob->Size, EFI_PAGES_TO_SIZE (NumPages) - Blob->Size);\r
 \r
-  DEBUG ((EFI_D_VERBOSE, "%a: File=\"%a\" Alignment=0x%x Zone=%d Size=0x%Lx "\r
-    "Address=0x%Lx\n", __FUNCTION__, Allocate->File, Allocate->Alignment,\r
-    Allocate->Zone, (UINT64)Blob->Size, (UINT64)(UINTN)Blob->Base));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: File=\"%a\" Alignment=0x%x Zone=%d Size=0x%Lx "\r
+    "Address=0x%Lx\n",\r
+    __FUNCTION__,\r
+    Allocate->File,\r
+    Allocate->Alignment,\r
+    Allocate->Zone,\r
+    (UINT64)Blob->Size,\r
+    (UINT64)(UINTN)Blob->Base\r
+    ));\r
+\r
+  //\r
+  // Measure the data which is downloaded from QEMU.\r
+  // It has to be done before it is consumed. Because the data will\r
+  // be updated in the following operations.\r
+  //\r
+  TpmMeasureAndLogData (\r
+    1,\r
+    EV_PLATFORM_CONFIG_FLAGS,\r
+    EV_POSTCODE_INFO_ACPI_DATA,\r
+    ACPI_DATA_LEN,\r
+    (VOID *)(UINTN)Blob->Base,\r
+    Blob->Size\r
+    );\r
+\r
   return EFI_SUCCESS;\r
 \r
 FreeBlob:\r
@@ -238,7 +443,6 @@ FreePages:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Process a QEMU_LOADER_ADD_POINTER command.\r
 \r
@@ -261,37 +465,48 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 ProcessCmdAddPointer (\r
-  IN CONST QEMU_LOADER_ADD_POINTER *AddPointer,\r
-  IN CONST ORDERED_COLLECTION      *Tracker\r
+  IN CONST QEMU_LOADER_ADD_POINTER  *AddPointer,\r
+  IN CONST ORDERED_COLLECTION       *Tracker\r
   )\r
 {\r
-  ORDERED_COLLECTION_ENTRY *TrackerEntry, *TrackerEntry2;\r
-  BLOB                     *Blob, *Blob2;\r
-  UINT8                    *PointerField;\r
-  UINT64                   PointerValue;\r
-\r
-  if (AddPointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0' ||\r
-      AddPointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') {\r
-    DEBUG ((EFI_D_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
+  ORDERED_COLLECTION_ENTRY  *TrackerEntry, *TrackerEntry2;\r
+  BLOB                      *Blob, *Blob2;\r
+  UINT8                     *PointerField;\r
+  UINT64                    PointerValue;\r
+\r
+  if ((AddPointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') ||\r
+      (AddPointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0'))\r
+  {\r
+    DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
-  TrackerEntry = OrderedCollectionFind (Tracker, AddPointer->PointerFile);\r
+  TrackerEntry  = OrderedCollectionFind (Tracker, AddPointer->PointerFile);\r
   TrackerEntry2 = OrderedCollectionFind (Tracker, AddPointer->PointeeFile);\r
-  if (TrackerEntry == NULL || TrackerEntry2 == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "%a: invalid blob reference(s) \"%a\" / \"%a\"\n",\r
-      __FUNCTION__, AddPointer->PointerFile, AddPointer->PointeeFile));\r
+  if ((TrackerEntry == NULL) || (TrackerEntry2 == NULL)) {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid blob reference(s) \"%a\" / \"%a\"\n",\r
+      __FUNCTION__,\r
+      AddPointer->PointerFile,\r
+      AddPointer->PointeeFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
-  Blob = OrderedCollectionUserStruct (TrackerEntry);\r
+  Blob  = OrderedCollectionUserStruct (TrackerEntry);\r
   Blob2 = OrderedCollectionUserStruct (TrackerEntry2);\r
-  if ((AddPointer->PointerSize != 1 && AddPointer->PointerSize != 2 &&\r
-       AddPointer->PointerSize != 4 && AddPointer->PointerSize != 8) ||\r
-      Blob->Size < AddPointer->PointerSize ||\r
-      Blob->Size - AddPointer->PointerSize < AddPointer->PointerOffset) {\r
-    DEBUG ((EFI_D_ERROR, "%a: invalid pointer location or size in \"%a\"\n",\r
-      __FUNCTION__, AddPointer->PointerFile));\r
+  if (((AddPointer->PointerSize != 1) && (AddPointer->PointerSize != 2) &&\r
+       (AddPointer->PointerSize != 4) && (AddPointer->PointerSize != 8)) ||\r
+      (Blob->Size < AddPointer->PointerSize) ||\r
+      (Blob->Size - AddPointer->PointerSize < AddPointer->PointerOffset))\r
+  {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid pointer location or size in \"%a\"\n",\r
+      __FUNCTION__,\r
+      AddPointer->PointerFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
@@ -299,8 +514,12 @@ ProcessCmdAddPointer (
   PointerValue = 0;\r
   CopyMem (&PointerValue, PointerField, AddPointer->PointerSize);\r
   if (PointerValue >= Blob2->Size) {\r
-    DEBUG ((EFI_D_ERROR, "%a: invalid pointer value in \"%a\"\n", __FUNCTION__,\r
-      AddPointer->PointerFile));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid pointer value in \"%a\"\n",\r
+      __FUNCTION__,\r
+      AddPointer->PointerFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
@@ -311,23 +530,34 @@ ProcessCmdAddPointer (
   ASSERT ((UINTN)Blob2->Base <= MAX_ADDRESS - Blob2->Size);\r
 \r
   PointerValue += (UINT64)(UINTN)Blob2->Base;\r
-  if (AddPointer->PointerSize < 8 &&\r
-      RShiftU64 (PointerValue, AddPointer->PointerSize * 8) != 0) {\r
-    DEBUG ((EFI_D_ERROR, "%a: relocated pointer value unrepresentable in "\r
-      "\"%a\"\n", __FUNCTION__, AddPointer->PointerFile));\r
+  if ((AddPointer->PointerSize < 8) &&\r
+      (RShiftU64 (PointerValue, AddPointer->PointerSize * 8) != 0))\r
+  {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: relocated pointer value unrepresentable in "\r
+      "\"%a\"\n",\r
+      __FUNCTION__,\r
+      AddPointer->PointerFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
   CopyMem (PointerField, &PointerValue, AddPointer->PointerSize);\r
 \r
-  DEBUG ((EFI_D_VERBOSE, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "\r
-    "PointerOffset=0x%x PointerSize=%d\n", __FUNCTION__,\r
-    AddPointer->PointerFile, AddPointer->PointeeFile,\r
-    AddPointer->PointerOffset, AddPointer->PointerSize));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "\r
+    "PointerOffset=0x%x PointerSize=%d\n",\r
+    __FUNCTION__,\r
+    AddPointer->PointerFile,\r
+    AddPointer->PointeeFile,\r
+    AddPointer->PointerOffset,\r
+    AddPointer->PointerSize\r
+    ));\r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Process a QEMU_LOADER_ADD_CHECKSUM command.\r
 \r
@@ -347,45 +577,60 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 ProcessCmdAddChecksum (\r
-  IN CONST QEMU_LOADER_ADD_CHECKSUM *AddChecksum,\r
-  IN CONST ORDERED_COLLECTION       *Tracker\r
+  IN CONST QEMU_LOADER_ADD_CHECKSUM  *AddChecksum,\r
+  IN CONST ORDERED_COLLECTION        *Tracker\r
   )\r
 {\r
-  ORDERED_COLLECTION_ENTRY *TrackerEntry;\r
-  BLOB                     *Blob;\r
+  ORDERED_COLLECTION_ENTRY  *TrackerEntry;\r
+  BLOB                      *Blob;\r
 \r
   if (AddChecksum->File[QEMU_LOADER_FNAME_SIZE - 1] != '\0') {\r
-    DEBUG ((EFI_D_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
+    DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
   TrackerEntry = OrderedCollectionFind (Tracker, AddChecksum->File);\r
   if (TrackerEntry == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "%a: invalid blob reference \"%a\"\n", __FUNCTION__,\r
-      AddChecksum->File));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid blob reference \"%a\"\n",\r
+      __FUNCTION__,\r
+      AddChecksum->File\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
   Blob = OrderedCollectionUserStruct (TrackerEntry);\r
-  if (Blob->Size <= AddChecksum->ResultOffset ||\r
-      Blob->Size < AddChecksum->Length ||\r
-      Blob->Size - AddChecksum->Length < AddChecksum->Start) {\r
-    DEBUG ((EFI_D_ERROR, "%a: invalid checksum range in \"%a\"\n",\r
-      __FUNCTION__, AddChecksum->File));\r
+  if ((Blob->Size <= AddChecksum->ResultOffset) ||\r
+      (Blob->Size < AddChecksum->Length) ||\r
+      (Blob->Size - AddChecksum->Length < AddChecksum->Start))\r
+  {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid checksum range in \"%a\"\n",\r
+      __FUNCTION__,\r
+      AddChecksum->File\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
   Blob->Base[AddChecksum->ResultOffset] = CalculateCheckSum8 (\r
-                                           Blob->Base + AddChecksum->Start,\r
-                                           AddChecksum->Length\r
-                                           );\r
-  DEBUG ((EFI_D_VERBOSE, "%a: File=\"%a\" ResultOffset=0x%x Start=0x%x "\r
-    "Length=0x%x\n", __FUNCTION__, AddChecksum->File,\r
-    AddChecksum->ResultOffset, AddChecksum->Start, AddChecksum->Length));\r
+                                            Blob->Base + AddChecksum->Start,\r
+                                            AddChecksum->Length\r
+                                            );\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: File=\"%a\" ResultOffset=0x%x Start=0x%x "\r
+    "Length=0x%x\n",\r
+    __FUNCTION__,\r
+    AddChecksum->File,\r
+    AddChecksum->ResultOffset,\r
+    AddChecksum->Start,\r
+    AddChecksum->Length\r
+    ));\r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Process a QEMU_LOADER_WRITE_POINTER command.\r
 \r
@@ -420,45 +665,58 @@ ProcessCmdAddChecksum (
 STATIC\r
 EFI_STATUS\r
 ProcessCmdWritePointer (\r
-  IN     CONST QEMU_LOADER_WRITE_POINTER *WritePointer,\r
-  IN     CONST ORDERED_COLLECTION        *Tracker,\r
-  IN OUT       S3_CONTEXT                *S3Context OPTIONAL\r
+  IN     CONST QEMU_LOADER_WRITE_POINTER  *WritePointer,\r
+  IN     CONST ORDERED_COLLECTION         *Tracker,\r
+  IN OUT       S3_CONTEXT                 *S3Context OPTIONAL\r
   )\r
 {\r
-  RETURN_STATUS            Status;\r
-  FIRMWARE_CONFIG_ITEM     PointerItem;\r
-  UINTN                    PointerItemSize;\r
-  ORDERED_COLLECTION_ENTRY *PointeeEntry;\r
-  BLOB                     *PointeeBlob;\r
-  UINT64                   PointerValue;\r
-\r
-  if (WritePointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0' ||\r
-      WritePointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') {\r
+  RETURN_STATUS             Status;\r
+  FIRMWARE_CONFIG_ITEM      PointerItem;\r
+  UINTN                     PointerItemSize;\r
+  ORDERED_COLLECTION_ENTRY  *PointeeEntry;\r
+  BLOB                      *PointeeBlob;\r
+  UINT64                    PointerValue;\r
+\r
+  if ((WritePointer->PointerFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0') ||\r
+      (WritePointer->PointeeFile[QEMU_LOADER_FNAME_SIZE - 1] != '\0'))\r
+  {\r
     DEBUG ((DEBUG_ERROR, "%a: malformed file name\n", __FUNCTION__));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
-  Status = QemuFwCfgFindFile ((CONST CHAR8 *)WritePointer->PointerFile,\r
-             &PointerItem, &PointerItemSize);\r
+  Status = QemuFwCfgFindFile (\r
+             (CONST CHAR8 *)WritePointer->PointerFile,\r
+             &PointerItem,\r
+             &PointerItemSize\r
+             );\r
   PointeeEntry = OrderedCollectionFind (Tracker, WritePointer->PointeeFile);\r
-  if (RETURN_ERROR (Status) || PointeeEntry == NULL) {\r
-    DEBUG ((DEBUG_ERROR,\r
+  if (RETURN_ERROR (Status) || (PointeeEntry == NULL)) {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
       "%a: invalid fw_cfg file or blob reference \"%a\" / \"%a\"\n",\r
-      __FUNCTION__, WritePointer->PointerFile, WritePointer->PointeeFile));\r
+      __FUNCTION__,\r
+      WritePointer->PointerFile,\r
+      WritePointer->PointeeFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
-  if ((WritePointer->PointerSize != 1 && WritePointer->PointerSize != 2 &&\r
-       WritePointer->PointerSize != 4 && WritePointer->PointerSize != 8) ||\r
+  if (((WritePointer->PointerSize != 1) && (WritePointer->PointerSize != 2) &&\r
+       (WritePointer->PointerSize != 4) && (WritePointer->PointerSize != 8)) ||\r
       (PointerItemSize < WritePointer->PointerSize) ||\r
       (PointerItemSize - WritePointer->PointerSize <\r
-       WritePointer->PointerOffset)) {\r
-    DEBUG ((DEBUG_ERROR, "%a: invalid pointer location or size in \"%a\"\n",\r
-      __FUNCTION__, WritePointer->PointerFile));\r
+       WritePointer->PointerOffset))\r
+  {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: invalid pointer location or size in \"%a\"\n",\r
+      __FUNCTION__,\r
+      WritePointer->PointerFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
-  PointeeBlob = OrderedCollectionUserStruct (PointeeEntry);\r
+  PointeeBlob  = OrderedCollectionUserStruct (PointeeEntry);\r
   PointerValue = WritePointer->PointeeOffset;\r
   if (PointerValue >= PointeeBlob->Size) {\r
     DEBUG ((DEBUG_ERROR, "%a: invalid PointeeOffset\n", __FUNCTION__));\r
@@ -472,10 +730,15 @@ ProcessCmdWritePointer (
   ASSERT ((UINTN)PointeeBlob->Base <= MAX_ADDRESS - PointeeBlob->Size);\r
 \r
   PointerValue += (UINT64)(UINTN)PointeeBlob->Base;\r
-  if (WritePointer->PointerSize < 8 &&\r
-      RShiftU64 (PointerValue, WritePointer->PointerSize * 8) != 0) {\r
-    DEBUG ((DEBUG_ERROR, "%a: pointer value unrepresentable in \"%a\"\n",\r
-      __FUNCTION__, WritePointer->PointerFile));\r
+  if ((WritePointer->PointerSize < 8) &&\r
+      (RShiftU64 (PointerValue, WritePointer->PointerSize * 8) != 0))\r
+  {\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: pointer value unrepresentable in \"%a\"\n",\r
+      __FUNCTION__,\r
+      WritePointer->PointerFile\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
@@ -484,7 +747,7 @@ ProcessCmdWritePointer (
   // form, to be replayed during S3 resume.\r
   //\r
   if (S3Context != NULL) {\r
-    EFI_STATUS SaveStatus;\r
+    EFI_STATUS  SaveStatus;\r
 \r
     SaveStatus = SaveCondensedWritePointerToS3Context (\r
                    S3Context,\r
@@ -509,15 +772,20 @@ ProcessCmdWritePointer (
   //\r
   PointeeBlob->HostsOnlyTableData = FALSE;\r
 \r
-  DEBUG ((DEBUG_VERBOSE, "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "\r
-    "PointerOffset=0x%x PointeeOffset=0x%x PointerSize=%d\n", __FUNCTION__,\r
-    WritePointer->PointerFile, WritePointer->PointeeFile,\r
-    WritePointer->PointerOffset, WritePointer->PointeeOffset,\r
-    WritePointer->PointerSize));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: PointerFile=\"%a\" PointeeFile=\"%a\" "\r
+    "PointerOffset=0x%x PointeeOffset=0x%x PointerSize=%d\n",\r
+    __FUNCTION__,\r
+    WritePointer->PointerFile,\r
+    WritePointer->PointeeFile,\r
+    WritePointer->PointerOffset,\r
+    WritePointer->PointeeOffset,\r
+    WritePointer->PointerSize\r
+    ));\r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Undo a QEMU_LOADER_WRITE_POINTER command.\r
 \r
@@ -531,16 +799,19 @@ ProcessCmdWritePointer (
 STATIC\r
 VOID\r
 UndoCmdWritePointer (\r
-  IN CONST QEMU_LOADER_WRITE_POINTER *WritePointer\r
+  IN CONST QEMU_LOADER_WRITE_POINTER  *WritePointer\r
   )\r
 {\r
-  RETURN_STATUS        Status;\r
-  FIRMWARE_CONFIG_ITEM PointerItem;\r
-  UINTN                PointerItemSize;\r
-  UINT64               PointerValue;\r
-\r
-  Status = QemuFwCfgFindFile ((CONST CHAR8 *)WritePointer->PointerFile,\r
-             &PointerItem, &PointerItemSize);\r
+  RETURN_STATUS         Status;\r
+  FIRMWARE_CONFIG_ITEM  PointerItem;\r
+  UINTN                 PointerItemSize;\r
+  UINT64                PointerValue;\r
+\r
+  Status = QemuFwCfgFindFile (\r
+             (CONST CHAR8 *)WritePointer->PointerFile,\r
+             &PointerItem,\r
+             &PointerItemSize\r
+             );\r
   ASSERT_RETURN_ERROR (Status);\r
 \r
   PointerValue = 0;\r
@@ -548,18 +819,21 @@ UndoCmdWritePointer (
   QemuFwCfgSkipBytes (WritePointer->PointerOffset);\r
   QemuFwCfgWriteBytes (WritePointer->PointerSize, &PointerValue);\r
 \r
-  DEBUG ((DEBUG_VERBOSE,\r
-    "%a: PointerFile=\"%a\" PointerOffset=0x%x PointerSize=%d\n", __FUNCTION__,\r
-    WritePointer->PointerFile, WritePointer->PointerOffset,\r
-    WritePointer->PointerSize));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: PointerFile=\"%a\" PointerOffset=0x%x PointerSize=%d\n",\r
+    __FUNCTION__,\r
+    WritePointer->PointerFile,\r
+    WritePointer->PointerOffset,\r
+    WritePointer->PointerSize\r
+    ));\r
 }\r
 \r
-\r
 //\r
 // We'll be saving the keys of installed tables so that we can roll them back\r
 // in case of failure. 128 tables should be enough for anyone (TM).\r
 //\r
-#define INSTALLED_TABLES_MAX 128\r
+#define INSTALLED_TABLES_MAX  128\r
 \r
 /**\r
   Process a QEMU_LOADER_ADD_POINTER command in order to see if its target byte\r
@@ -624,37 +898,37 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 Process2ndPassCmdAddPointer (\r
-  IN     CONST QEMU_LOADER_ADD_POINTER *AddPointer,\r
-  IN     CONST ORDERED_COLLECTION      *Tracker,\r
-  IN     EFI_ACPI_TABLE_PROTOCOL       *AcpiProtocol,\r
-  IN OUT UINTN                         InstalledKey[INSTALLED_TABLES_MAX],\r
-  IN OUT INT32                         *NumInstalled,\r
-  IN OUT ORDERED_COLLECTION            *SeenPointers\r
+  IN     CONST QEMU_LOADER_ADD_POINTER  *AddPointer,\r
+  IN     CONST ORDERED_COLLECTION       *Tracker,\r
+  IN     EFI_ACPI_TABLE_PROTOCOL        *AcpiProtocol,\r
+  IN OUT UINTN                          InstalledKey[INSTALLED_TABLES_MAX],\r
+  IN OUT INT32                          *NumInstalled,\r
+  IN OUT ORDERED_COLLECTION             *SeenPointers\r
   )\r
 {\r
-  CONST ORDERED_COLLECTION_ENTRY                     *TrackerEntry;\r
-  CONST ORDERED_COLLECTION_ENTRY                     *TrackerEntry2;\r
-  ORDERED_COLLECTION_ENTRY                           *SeenPointerEntry;\r
-  CONST BLOB                                         *Blob;\r
-  BLOB                                               *Blob2;\r
-  CONST UINT8                                        *PointerField;\r
-  UINT64                                             PointerValue;\r
-  UINTN                                              Blob2Remaining;\r
-  UINTN                                              TableSize;\r
-  CONST EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
-  CONST EFI_ACPI_DESCRIPTION_HEADER                  *Header;\r
-  EFI_STATUS                                         Status;\r
-\r
-  if (*NumInstalled < 0 || *NumInstalled > INSTALLED_TABLES_MAX) {\r
+  CONST ORDERED_COLLECTION_ENTRY                      *TrackerEntry;\r
+  CONST ORDERED_COLLECTION_ENTRY                      *TrackerEntry2;\r
+  ORDERED_COLLECTION_ENTRY                            *SeenPointerEntry;\r
+  CONST BLOB                                          *Blob;\r
+  BLOB                                                *Blob2;\r
+  CONST UINT8                                         *PointerField;\r
+  UINT64                                              PointerValue;\r
+  UINTN                                               Blob2Remaining;\r
+  UINTN                                               TableSize;\r
+  CONST EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs;\r
+  CONST EFI_ACPI_DESCRIPTION_HEADER                   *Header;\r
+  EFI_STATUS                                          Status;\r
+\r
+  if ((*NumInstalled < 0) || (*NumInstalled > INSTALLED_TABLES_MAX)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  TrackerEntry = OrderedCollectionFind (Tracker, AddPointer->PointerFile);\r
+  TrackerEntry  = OrderedCollectionFind (Tracker, AddPointer->PointerFile);\r
   TrackerEntry2 = OrderedCollectionFind (Tracker, AddPointer->PointeeFile);\r
-  Blob = OrderedCollectionUserStruct (TrackerEntry);\r
-  Blob2 = OrderedCollectionUserStruct (TrackerEntry2);\r
-  PointerField = Blob->Base + AddPointer->PointerOffset;\r
-  PointerValue = 0;\r
+  Blob          = OrderedCollectionUserStruct (TrackerEntry);\r
+  Blob2         = OrderedCollectionUserStruct (TrackerEntry2);\r
+  PointerField  = Blob->Base + AddPointer->PointerOffset;\r
+  PointerValue  = 0;\r
   CopyMem (&PointerValue, PointerField, AddPointer->PointerSize);\r
 \r
   //\r
@@ -662,7 +936,7 @@ Process2ndPassCmdAddPointer (
   // by the Blob2->Size check and later checks in ProcessCmdAddPointer().\r
   //\r
   Blob2Remaining = (UINTN)Blob2->Base;\r
-  ASSERT(PointerValue >= Blob2Remaining);\r
+  ASSERT (PointerValue >= Blob2Remaining);\r
   Blob2Remaining += Blob2->Size;\r
   ASSERT (PointerValue < Blob2Remaining);\r
 \r
@@ -684,13 +958,20 @@ Process2ndPassCmdAddPointer (
         ));\r
       Status = EFI_SUCCESS;\r
     }\r
+\r
     return Status;\r
   }\r
 \r
-  Blob2Remaining -= (UINTN) PointerValue;\r
-  DEBUG ((EFI_D_VERBOSE, "%a: checking for ACPI header in \"%a\" at 0x%Lx "\r
-    "(remaining: 0x%Lx): ", __FUNCTION__, AddPointer->PointeeFile,\r
-    PointerValue, (UINT64)Blob2Remaining));\r
+  Blob2Remaining -= (UINTN)PointerValue;\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: checking for ACPI header in \"%a\" at 0x%Lx "\r
+    "(remaining: 0x%Lx): ",\r
+    __FUNCTION__,\r
+    AddPointer->PointeeFile,\r
+    PointerValue,\r
+    (UINT64)Blob2Remaining\r
+    ));\r
 \r
   TableSize = 0;\r
 \r
@@ -700,12 +981,17 @@ Process2ndPassCmdAddPointer (
   if (sizeof *Facs <= Blob2Remaining) {\r
     Facs = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)PointerValue;\r
 \r
-    if (Facs->Length >= sizeof *Facs &&\r
-        Facs->Length <= Blob2Remaining &&\r
-        Facs->Signature ==\r
-                EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {\r
-      DEBUG ((EFI_D_VERBOSE, "found \"%-4.4a\" size 0x%x\n",\r
-        (CONST CHAR8 *)&Facs->Signature, Facs->Length));\r
+    if ((Facs->Length >= sizeof *Facs) &&\r
+        (Facs->Length <= Blob2Remaining) &&\r
+        (Facs->Signature ==\r
+         EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE))\r
+    {\r
+      DEBUG ((\r
+        DEBUG_VERBOSE,\r
+        "found \"%-4.4a\" size 0x%x\n",\r
+        (CONST CHAR8 *)&Facs->Signature,\r
+        Facs->Length\r
+        ));\r
       TableSize = Facs->Length;\r
     }\r
   }\r
@@ -713,54 +999,72 @@ Process2ndPassCmdAddPointer (
   //\r
   // check for the uniform tables\r
   //\r
-  if (TableSize == 0 && sizeof *Header <= Blob2Remaining) {\r
+  if ((TableSize == 0) && (sizeof *Header <= Blob2Remaining)) {\r
     Header = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)PointerValue;\r
 \r
-    if (Header->Length >= sizeof *Header &&\r
-        Header->Length <= Blob2Remaining &&\r
-        CalculateSum8 ((CONST UINT8 *)Header, Header->Length) == 0) {\r
+    if ((Header->Length >= sizeof *Header) &&\r
+        (Header->Length <= Blob2Remaining) &&\r
+        (CalculateSum8 ((CONST UINT8 *)Header, Header->Length) == 0))\r
+    {\r
       //\r
       // This looks very much like an ACPI table from QEMU:\r
       // - Length field consistent with both ACPI and containing blob size\r
       // - checksum is correct\r
       //\r
-      DEBUG ((EFI_D_VERBOSE, "found \"%-4.4a\" size 0x%x\n",\r
-        (CONST CHAR8 *)&Header->Signature, Header->Length));\r
+      DEBUG ((\r
+        DEBUG_VERBOSE,\r
+        "found \"%-4.4a\" size 0x%x\n",\r
+        (CONST CHAR8 *)&Header->Signature,\r
+        Header->Length\r
+        ));\r
       TableSize = Header->Length;\r
 \r
       //\r
       // Skip RSDT and XSDT because those are handled by\r
       // EFI_ACPI_TABLE_PROTOCOL automatically.\r
-      if (Header->Signature ==\r
-                    EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE ||\r
-          Header->Signature ==\r
-                    EFI_ACPI_2_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) {\r
+      if ((Header->Signature ==\r
+           EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) ||\r
+          (Header->Signature ==\r
+           EFI_ACPI_2_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE))\r
+      {\r
         return EFI_SUCCESS;\r
       }\r
     }\r
   }\r
 \r
   if (TableSize == 0) {\r
-    DEBUG ((EFI_D_VERBOSE, "not found; marking fw_cfg blob as opaque\n"));\r
+    DEBUG ((DEBUG_VERBOSE, "not found; marking fw_cfg blob as opaque\n"));\r
     Blob2->HostsOnlyTableData = FALSE;\r
     return EFI_SUCCESS;\r
   }\r
 \r
   if (*NumInstalled == INSTALLED_TABLES_MAX) {\r
-    DEBUG ((EFI_D_ERROR, "%a: can't install more than %d tables\n",\r
-      __FUNCTION__, INSTALLED_TABLES_MAX));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: can't install more than %d tables\n",\r
+      __FUNCTION__,\r
+      INSTALLED_TABLES_MAX\r
+      ));\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto RollbackSeenPointer;\r
   }\r
 \r
-  Status = AcpiProtocol->InstallAcpiTable (AcpiProtocol,\r
-                           (VOID *)(UINTN)PointerValue, TableSize,\r
-                           &InstalledKey[*NumInstalled]);\r
+  Status = AcpiProtocol->InstallAcpiTable (\r
+                           AcpiProtocol,\r
+                           (VOID *)(UINTN)PointerValue,\r
+                           TableSize,\r
+                           &InstalledKey[*NumInstalled]\r
+                           );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%a: InstallAcpiTable(): %r\n", __FUNCTION__,\r
-      Status));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: InstallAcpiTable(): %r\n",\r
+      __FUNCTION__,\r
+      Status\r
+      ));\r
     goto RollbackSeenPointer;\r
   }\r
+\r
   ++*NumInstalled;\r
   return EFI_SUCCESS;\r
 \r
@@ -769,7 +1073,6 @@ RollbackSeenPointer:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Download, process, and install ACPI table data from the QEMU loader\r
   interface.\r
@@ -795,32 +1098,39 @@ RollbackSeenPointer:
 EFI_STATUS\r
 EFIAPI\r
 InstallQemuFwCfgTables (\r
-  IN   EFI_ACPI_TABLE_PROTOCOL       *AcpiProtocol\r
+  IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiProtocol\r
   )\r
 {\r
-  EFI_STATUS               Status;\r
-  FIRMWARE_CONFIG_ITEM     FwCfgItem;\r
-  UINTN                    FwCfgSize;\r
-  QEMU_LOADER_ENTRY        *LoaderStart;\r
-  CONST QEMU_LOADER_ENTRY  *LoaderEntry, *LoaderEnd;\r
-  CONST QEMU_LOADER_ENTRY  *WritePointerSubsetEnd;\r
-  ORIGINAL_ATTRIBUTES      *OriginalPciAttributes;\r
-  UINTN                    OriginalPciAttributesCount;\r
-  S3_CONTEXT               *S3Context;\r
-  ORDERED_COLLECTION       *Tracker;\r
-  UINTN                    *InstalledKey;\r
-  INT32                    Installed;\r
-  ORDERED_COLLECTION_ENTRY *TrackerEntry, *TrackerEntry2;\r
-  ORDERED_COLLECTION       *SeenPointers;\r
-  ORDERED_COLLECTION_ENTRY *SeenPointerEntry, *SeenPointerEntry2;\r
+  EFI_STATUS                Status;\r
+  FIRMWARE_CONFIG_ITEM      FwCfgItem;\r
+  UINTN                     FwCfgSize;\r
+  QEMU_LOADER_ENTRY         *LoaderStart;\r
+  CONST QEMU_LOADER_ENTRY   *LoaderEntry, *LoaderEnd;\r
+  CONST QEMU_LOADER_ENTRY   *WritePointerSubsetEnd;\r
+  ORIGINAL_ATTRIBUTES       *OriginalPciAttributes;\r
+  UINTN                     OriginalPciAttributesCount;\r
+  ORDERED_COLLECTION        *AllocationsRestrictedTo32Bit;\r
+  S3_CONTEXT                *S3Context;\r
+  ORDERED_COLLECTION        *Tracker;\r
+  UINTN                     *InstalledKey;\r
+  INT32                     Installed;\r
+  ORDERED_COLLECTION_ENTRY  *TrackerEntry, *TrackerEntry2;\r
+  ORDERED_COLLECTION        *SeenPointers;\r
+  ORDERED_COLLECTION_ENTRY  *SeenPointerEntry, *SeenPointerEntry2;\r
+  EFI_HANDLE                QemuAcpiHandle;\r
 \r
   Status = QemuFwCfgFindFile ("etc/table-loader", &FwCfgItem, &FwCfgSize);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   if (FwCfgSize % sizeof *LoaderEntry != 0) {\r
-    DEBUG ((EFI_D_ERROR, "%a: \"etc/table-loader\" has invalid size 0x%Lx\n",\r
-      __FUNCTION__, (UINT64)FwCfgSize));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: \"etc/table-loader\" has invalid size 0x%Lx\n",\r
+      __FUNCTION__,\r
+      (UINT64)FwCfgSize\r
+      ));\r
     return EFI_PROTOCOL_ERROR;\r
   }\r
 \r
@@ -828,12 +1138,38 @@ InstallQemuFwCfgTables (
   if (LoaderStart == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+\r
   EnablePciDecoding (&OriginalPciAttributes, &OriginalPciAttributesCount);\r
   QemuFwCfgSelectItem (FwCfgItem);\r
   QemuFwCfgReadBytes (FwCfgSize, LoaderStart);\r
   RestorePciDecoding (OriginalPciAttributes, OriginalPciAttributesCount);\r
+\r
+  //\r
+  // Measure the "etc/table-loader" which is downloaded from QEMU.\r
+  // It has to be done before it is consumed. Because it would be\r
+  // updated in the following operations.\r
+  //\r
+  TpmMeasureAndLogData (\r
+    1,\r
+    EV_PLATFORM_CONFIG_FLAGS,\r
+    EV_POSTCODE_INFO_ACPI_DATA,\r
+    ACPI_DATA_LEN,\r
+    (VOID *)(UINTN)LoaderStart,\r
+    FwCfgSize\r
+    );\r
+\r
   LoaderEnd = LoaderStart + FwCfgSize / sizeof *LoaderEntry;\r
 \r
+  AllocationsRestrictedTo32Bit = NULL;\r
+  Status                       = CollectAllocationsRestrictedTo32Bit (\r
+                                   &AllocationsRestrictedTo32Bit,\r
+                                   LoaderStart,\r
+                                   LoaderEnd\r
+                                   );\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreeLoader;\r
+  }\r
+\r
   S3Context = NULL;\r
   if (QemuFwCfgS3Enabled ()) {\r
     //\r
@@ -842,7 +1178,7 @@ InstallQemuFwCfgTables (
     //\r
     Status = AllocateS3Context (&S3Context, LoaderEnd - LoaderStart);\r
     if (EFI_ERROR (Status)) {\r
-      goto FreeLoader;\r
+      goto FreeAllocationsRestrictedTo32Bit;\r
     }\r
   }\r
 \r
@@ -862,32 +1198,48 @@ InstallQemuFwCfgTables (
   WritePointerSubsetEnd = LoaderStart;\r
   for (LoaderEntry = LoaderStart; LoaderEntry < LoaderEnd; ++LoaderEntry) {\r
     switch (LoaderEntry->Type) {\r
-    case QemuLoaderCmdAllocate:\r
-      Status = ProcessCmdAllocate (&LoaderEntry->Command.Allocate, Tracker);\r
-      break;\r
-\r
-    case QemuLoaderCmdAddPointer:\r
-      Status = ProcessCmdAddPointer (&LoaderEntry->Command.AddPointer,\r
-                 Tracker);\r
-      break;\r
-\r
-    case QemuLoaderCmdAddChecksum:\r
-      Status = ProcessCmdAddChecksum (&LoaderEntry->Command.AddChecksum,\r
-                 Tracker);\r
-      break;\r
-\r
-    case QemuLoaderCmdWritePointer:\r
-        Status = ProcessCmdWritePointer (&LoaderEntry->Command.WritePointer,\r
-                   Tracker, S3Context);\r
+      case QemuLoaderCmdAllocate:\r
+        Status = ProcessCmdAllocate (\r
+                   &LoaderEntry->Command.Allocate,\r
+                   Tracker,\r
+                   AllocationsRestrictedTo32Bit\r
+                   );\r
+        break;\r
+\r
+      case QemuLoaderCmdAddPointer:\r
+        Status = ProcessCmdAddPointer (\r
+                   &LoaderEntry->Command.AddPointer,\r
+                   Tracker\r
+                   );\r
+        break;\r
+\r
+      case QemuLoaderCmdAddChecksum:\r
+        Status = ProcessCmdAddChecksum (\r
+                   &LoaderEntry->Command.AddChecksum,\r
+                   Tracker\r
+                   );\r
+        break;\r
+\r
+      case QemuLoaderCmdWritePointer:\r
+        Status = ProcessCmdWritePointer (\r
+                   &LoaderEntry->Command.WritePointer,\r
+                   Tracker,\r
+                   S3Context\r
+                   );\r
         if (!EFI_ERROR (Status)) {\r
           WritePointerSubsetEnd = LoaderEntry + 1;\r
         }\r
+\r
         break;\r
 \r
-    default:\r
-      DEBUG ((EFI_D_VERBOSE, "%a: unknown loader command: 0x%x\n",\r
-        __FUNCTION__, LoaderEntry->Type));\r
-      break;\r
+      default:\r
+        DEBUG ((\r
+          DEBUG_VERBOSE,\r
+          "%a: unknown loader command: 0x%x\n",\r
+          __FUNCTION__,\r
+          LoaderEntry->Type\r
+          ));\r
+        break;\r
     }\r
 \r
     if (EFI_ERROR (Status)) {\r
@@ -927,6 +1279,21 @@ InstallQemuFwCfgTables (
     }\r
   }\r
 \r
+  //\r
+  // Install a protocol to notify that the ACPI table provided by Qemu is\r
+  // ready.\r
+  //\r
+  QemuAcpiHandle = NULL;\r
+  Status         = gBS->InstallProtocolInterface (\r
+                          &QemuAcpiHandle,\r
+                          &gQemuAcpiTableNotifyProtocolGuid,\r
+                          EFI_NATIVE_INTERFACE,\r
+                          NULL\r
+                          );\r
+  if (EFI_ERROR (Status)) {\r
+    goto UninstallAcpiTables;\r
+  }\r
+\r
   //\r
   // Translating the condensed QEMU_LOADER_WRITE_POINTER commands to ACPI S3\r
   // Boot Script opcodes has to be the last operation in this function, because\r
@@ -935,14 +1302,26 @@ InstallQemuFwCfgTables (
   if (S3Context != NULL) {\r
     Status = TransferS3ContextToBootScript (S3Context);\r
     if (EFI_ERROR (Status)) {\r
-      goto UninstallAcpiTables;\r
+      goto UninstallQemuAcpiTableNotifyProtocol;\r
     }\r
+\r
     //\r
-    // Ownership of S3Context has been transfered.\r
+    // Ownership of S3Context has been transferred.\r
     //\r
     S3Context = NULL;\r
   }\r
 \r
+  DEBUG ((DEBUG_INFO, "%a: installed %d tables\n", __FUNCTION__, Installed));\r
+\r
+UninstallQemuAcpiTableNotifyProtocol:\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->UninstallProtocolInterface (\r
+           QemuAcpiHandle,\r
+           &gQemuAcpiTableNotifyProtocolGuid,\r
+           NULL\r
+           );\r
+  }\r
+\r
 UninstallAcpiTables:\r
   if (EFI_ERROR (Status)) {\r
     //\r
@@ -952,16 +1331,16 @@ UninstallAcpiTables:
       --Installed;\r
       AcpiProtocol->UninstallAcpiTable (AcpiProtocol, InstalledKey[Installed]);\r
     }\r
-  } else {\r
-    DEBUG ((EFI_D_INFO, "%a: installed %d tables\n", __FUNCTION__, Installed));\r
   }\r
 \r
   for (SeenPointerEntry = OrderedCollectionMin (SeenPointers);\r
        SeenPointerEntry != NULL;\r
-       SeenPointerEntry = SeenPointerEntry2) {\r
+       SeenPointerEntry = SeenPointerEntry2)\r
+  {\r
     SeenPointerEntry2 = OrderedCollectionNext (SeenPointerEntry);\r
     OrderedCollectionDelete (SeenPointers, SeenPointerEntry, NULL);\r
   }\r
+\r
   OrderedCollectionUninit (SeenPointers);\r
 \r
 FreeKeys:\r
@@ -988,21 +1367,28 @@ RollbackWritePointersAndFreeTracker:
   // not directly part of some ACPI table.\r
   //\r
   for (TrackerEntry = OrderedCollectionMin (Tracker); TrackerEntry != NULL;\r
-       TrackerEntry = TrackerEntry2) {\r
-    VOID *UserStruct;\r
-    BLOB *Blob;\r
+       TrackerEntry = TrackerEntry2)\r
+  {\r
+    VOID  *UserStruct;\r
+    BLOB  *Blob;\r
 \r
     TrackerEntry2 = OrderedCollectionNext (TrackerEntry);\r
     OrderedCollectionDelete (Tracker, TrackerEntry, &UserStruct);\r
     Blob = UserStruct;\r
 \r
     if (EFI_ERROR (Status) || Blob->HostsOnlyTableData) {\r
-      DEBUG ((EFI_D_VERBOSE, "%a: freeing \"%a\"\n", __FUNCTION__,\r
-        Blob->File));\r
+      DEBUG ((\r
+        DEBUG_VERBOSE,\r
+        "%a: freeing \"%a\"\n",\r
+        __FUNCTION__,\r
+        Blob->File\r
+        ));\r
       gBS->FreePages ((UINTN)Blob->Base, EFI_SIZE_TO_PAGES (Blob->Size));\r
     }\r
+\r
     FreePool (Blob);\r
   }\r
+\r
   OrderedCollectionUninit (Tracker);\r
 \r
 FreeS3Context:\r
@@ -1010,6 +1396,9 @@ FreeS3Context:
     ReleaseS3Context (S3Context);\r
   }\r
 \r
+FreeAllocationsRestrictedTo32Bit:\r
+  ReleaseAllocationsRestrictedTo32Bit (AllocationsRestrictedTo32Bit);\r
+\r
 FreeLoader:\r
   FreePool (LoaderStart);\r
 \r