]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/AcpiTableDxe: use pool allocation for RSDP if possible
authorArd Biesheuvel <ard.biesheuvel@arm.com>
Fri, 16 Oct 2020 14:58:01 +0000 (16:58 +0200)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 30 Oct 2020 14:50:33 +0000 (14:50 +0000)
Use a pool allocation for the RSDP ACPI root pointer structure if no
memory limit is in effect that forces us to use page based allocation,
which may be wasteful if they get rounded up to 64 KB as is the case
on AArch64.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
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