]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
ACPI4.0/5.0 have clear description:
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / Acpi / AcpiSupportDxe / AcpiSupportAcpiSupportProtocol.c
index a54cffb169fb844e495b9627823ea3a982a4e65c..107db88ed3ebfec5426229304b20bb10a71fee56 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   ACPI Support 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
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -776,14 +776,24 @@ 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
-      AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
-      Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
-      CopyMem (\r
-        &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
-        &Buffer64,\r
-        sizeof (UINT64)\r
-        );\r
+      if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
+        ZeroMem (\r
+          &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+          sizeof (UINT64)\r
+          );\r
+      } else {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = 0;\r
+        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
+        CopyMem (\r
+          &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+          &Buffer64,\r
+          sizeof (UINT64)\r
+          );\r
+      }\r
       AcpiSupportInstance->Fadt3->Dsdt  = (UINT32) (UINTN) AcpiSupportInstance->Dsdt3;\r
       Buffer64                          = (UINT64) (UINTN) AcpiSupportInstance->Dsdt3;\r
       CopyMem (\r
@@ -900,13 +910,20 @@ AddTableToList (
       // If FADT already exists, update table pointers.\r
       //\r
       if (AcpiSupportInstance->Fadt3 != NULL) {\r
-        AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
-        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
-        CopyMem (\r
-          &AcpiSupportInstance->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
+          AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
+        } else {\r
+          Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
+          CopyMem (\r
+            &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+            &Buffer64,\r
+            sizeof (UINT64)\r
+            );\r
+        }\r
 \r
         //\r
         // Checksum FADT table\r