]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
ACPI4.0/5.0 have clear description:
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / AcpiTableDxe / AcpiTableProtocol.c
index 6505de8bede51ee3f1817a7c57414178196c13a1..dfd1669ab1070acb92294638484bddc0474f0f9c 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   ACPI Table Protocol Implementation\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -717,14 +717,19 @@ AddTableToList (
 \r
       //\r
       // Update pointers in FADT.  If tables don't exist this will put NULL pointers there.\r
+      // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+      // vice-versa.\r
       //\r
-      AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
-      Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
-      CopyMem (\r
-        &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
-        &Buffer64,\r
-        sizeof (UINT64)\r
-        );\r
+      if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+        AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
+      } else {\r
+        Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
+        CopyMem (\r
+          &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
+          &Buffer64,\r
+          sizeof (UINT64)\r
+          );\r
+      }\r
       AcpiTableInstance->Fadt3->Dsdt  = (UINT32) (UINTN) AcpiTableInstance->Dsdt3;\r
       Buffer64                          = (UINT64) (UINTN) AcpiTableInstance->Dsdt3;\r
       CopyMem (\r
@@ -840,13 +845,20 @@ AddTableToList (
       // If FADT already exists, update table pointers.\r
       //\r
       if (AcpiTableInstance->Fadt3 != NULL) {\r
-        AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
-        Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
-        CopyMem (\r
-          &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
-          &Buffer64,\r
-          sizeof (UINT64)\r
-          );\r
+        //\r
+        // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+        // vice-versa.\r
+        //\r
+        if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+          AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
+        } else {\r
+          Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
+          CopyMem (\r
+            &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
+            &Buffer64,\r
+            sizeof (UINT64)\r
+            );\r
+        }\r
 \r
         //\r
         // Checksum FADT table\r