]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix the bug in AcpiTableDxe drivers that doesn't work when more than 20 Acpi tables...
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 9 Aug 2011 08:46:04 +0000 (08:46 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 9 Aug 2011 08:46:04 +0000 (08:46 +0000)
Signed-off-by: lgao4
Signed-off-by: jljusten
Reviewed-by: jyao1
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12112 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c

index 764ad86e61b8316de9ee158d6748d6db4e01d686..ec2c16bb67f0018e9a20ff29e295963375ae230f 100644 (file)
@@ -457,16 +457,14 @@ ReallocateAcpiTableBuffer (
   //\r
   NewMaxTableNumber = mEfiAcpiMaxNumTables + EFI_ACPI_MAX_NUM_TABLES;\r
   //\r
-  // Create RSDP, RSDT, XSDT structures and allocate all buffers\r
+  // Create RSDT, XSDT structures and allocate buffers.\r
   //\r
-  TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
-      NewMaxTableNumber * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
-      NewMaxTableNumber * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
-      NewMaxTableNumber * sizeof (UINT64);\r
+  TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
+              NewMaxTableNumber * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
+              NewMaxTableNumber * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
+              NewMaxTableNumber * sizeof (UINT64);\r
 \r
   //\r
   // Allocate memory in the lower 32 bit of address range for\r
@@ -492,25 +490,16 @@ ReallocateAcpiTableBuffer (
   Pointer = (UINT8 *) (UINTN) PageAddress;\r
   ZeroMem (Pointer, TotalSize);\r
   \r
-  AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
-  Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
-  AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
-  Pointer += sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
-\r
   AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
   Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));\r
   AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
   Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * sizeof (UINT32));\r
-\r
   AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
 \r
   //\r
-  // Initialize RSDP\r
+  // Update RSDP to point to the new Rsdt and Xsdt address.\r
   //\r
-  CopyMem (AcpiTableInstance->Rsdp1, TempPrivateData.Rsdp1, sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER)); \r
   AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt1;\r
-  \r
-  CopyMem (AcpiTableInstance->Rsdp3, TempPrivateData.Rsdp3, sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER)); \r
   AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) AcpiTableInstance->Rsdt3;\r
   CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt;\r
   CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof (UINT64));\r
@@ -525,15 +514,13 @@ ReallocateAcpiTableBuffer (
   //\r
   // Calculate orignal ACPI table buffer size\r
   //\r
-  TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT64);\r
-  gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdp1, EFI_SIZE_TO_PAGES (TotalSize));\r
+  TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT64);\r
+  gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdt1, EFI_SIZE_TO_PAGES (TotalSize));\r
   \r
   //\r
   // Update the Max ACPI table number\r
@@ -1718,6 +1705,7 @@ AcpiTableAcpiTableConstructor (
   EFI_STATUS            Status;\r
   UINT64                CurrentData;\r
   UINTN                 TotalSize;\r
+  UINTN                 RsdpTableSize;\r
   UINT8                 *Pointer;\r
   EFI_PHYSICAL_ADDRESS  PageAddress;\r
 \r
@@ -1737,17 +1725,39 @@ AcpiTableAcpiTableConstructor (
   }\r
 \r
   //\r
-  // Create RSDP, RSDT, XSDT structures\r
-  // Allocate all buffers\r
+  // Create RSDP table\r
+  //\r
+  RsdpTableSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
+                  sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
+\r
+  PageAddress = 0xFFFFFFFF;\r
+  Status = gBS->AllocatePages (\r
+                  AllocateMaxAddress,\r
+                  EfiACPIReclaimMemory,\r
+                  EFI_SIZE_TO_PAGES (RsdpTableSize),\r
+                  &PageAddress\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Pointer = (UINT8 *) (UINTN) PageAddress;\r
+  ZeroMem (Pointer, RsdpTableSize);\r
+\r
+  AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
+  Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
+  AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
+\r
+  //\r
+  // Create RSDT, XSDT structures\r
   //\r
-  TotalSize = sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
-      sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
-      mEfiAcpiMaxNumTables * sizeof (UINT64);\r
+  TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 1.0 RSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 RSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT32) +\r
+              sizeof (EFI_ACPI_DESCRIPTION_HEADER) +         // for ACPI 2.0/3.0 XSDT\r
+              mEfiAcpiMaxNumTables * sizeof (UINT64);\r
 \r
   //\r
   // Allocate memory in the lower 32 bit of address range for\r
@@ -1767,22 +1777,17 @@ AcpiTableAcpiTableConstructor (
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
+    gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1, EFI_SIZE_TO_PAGES (RsdpTableSize));\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   Pointer = (UINT8 *) (UINTN) PageAddress;\r
   ZeroMem (Pointer, TotalSize);\r
 \r
-  AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
-  Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
-  AcpiTableInstance->Rsdp3 = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
-  Pointer += sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
-\r
   AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
   Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));\r
   AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
   Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32));\r
-\r
   AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer;\r
 \r
   //\r