]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
MdeModulePkg/AcpiTableDxe: use pool allocation for RSDP if possible
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / AcpiTableDxe / AcpiTableProtocol.c
index ae446270faef3dbb8d600391a0a24a1048c17314..5a2afdff27e27816757adda513aa0391603818e0 100644 (file)
@@ -1745,19 +1745,29 @@ AcpiTableAcpiTableConstructor (
     RsdpTableSize += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
   }\r
 \r
-  PageAddress = 0xFFFFFFFF;\r
-  Status = gBS->AllocatePages (\r
-                  mAcpiTableAllocType,\r
-                  EfiACPIReclaimMemory,\r
-                  EFI_SIZE_TO_PAGES (RsdpTableSize),\r
-                  &PageAddress\r
-                  );\r
+  if (mAcpiTableAllocType != AllocateAnyPages) {\r
+    PageAddress = 0xFFFFFFFF;\r
+    Status = gBS->AllocatePages (\r
+                    mAcpiTableAllocType,\r
+                    EfiACPIReclaimMemory,\r
+                    EFI_SIZE_TO_PAGES (RsdpTableSize),\r
+                    &PageAddress\r
+                    );\r
+  } else {\r
+    Status = gBS->AllocatePool (\r
+                    EfiACPIReclaimMemory,\r
+                    RsdpTableSize,\r
+                    (VOID **)&Pointer\r
+                    );\r
+  }\r
 \r
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Pointer = (UINT8 *) (UINTN) PageAddress;\r
+  if (mAcpiTableAllocType != AllocateAnyPages) {\r
+    Pointer = (UINT8 *)(UINTN)PageAddress;\r
+  }\r
   ZeroMem (Pointer, RsdpTableSize);\r
 \r
   AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer;\r
@@ -1805,7 +1815,12 @@ AcpiTableAcpiTableConstructor (
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1, EFI_SIZE_TO_PAGES (RsdpTableSize));\r
+    if (mAcpiTableAllocType != AllocateAnyPages) {\r
+      gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1,\r
+             EFI_SIZE_TO_PAGES (RsdpTableSize));\r
+    } else {\r
+      gBS->FreePool (AcpiTableInstance->Rsdp1);\r
+    }\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r