From 8ead7af22bc596de23cdcc46e1f1a8c4e721d6d0 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Fri, 16 Oct 2020 16:58:01 +0200 Subject: MdeModulePkg/AcpiTableDxe: use pool allocation for RSDP if possible 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 Reviewed-by: Liming Gao --- .../Acpi/AcpiTableDxe/AcpiTableProtocol.c | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'MdeModulePkg/Universal') diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c index ae446270fa..5a2afdff27 100644 --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c @@ -1745,19 +1745,29 @@ AcpiTableAcpiTableConstructor ( RsdpTableSize += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER); } - PageAddress = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - mAcpiTableAllocType, - EfiACPIReclaimMemory, - EFI_SIZE_TO_PAGES (RsdpTableSize), - &PageAddress - ); + if (mAcpiTableAllocType != AllocateAnyPages) { + PageAddress = 0xFFFFFFFF; + Status = gBS->AllocatePages ( + mAcpiTableAllocType, + EfiACPIReclaimMemory, + EFI_SIZE_TO_PAGES (RsdpTableSize), + &PageAddress + ); + } else { + Status = gBS->AllocatePool ( + EfiACPIReclaimMemory, + RsdpTableSize, + (VOID **)&Pointer + ); + } if (EFI_ERROR (Status)) { return EFI_OUT_OF_RESOURCES; } - Pointer = (UINT8 *) (UINTN) PageAddress; + if (mAcpiTableAllocType != AllocateAnyPages) { + Pointer = (UINT8 *)(UINTN)PageAddress; + } ZeroMem (Pointer, RsdpTableSize); AcpiTableInstance->Rsdp1 = (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer; @@ -1805,7 +1815,12 @@ AcpiTableAcpiTableConstructor ( } if (EFI_ERROR (Status)) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1, EFI_SIZE_TO_PAGES (RsdpTableSize)); + if (mAcpiTableAllocType != AllocateAnyPages) { + gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiTableInstance->Rsdp1, + EFI_SIZE_TO_PAGES (RsdpTableSize)); + } else { + gBS->FreePool (AcpiTableInstance->Rsdp1); + } return EFI_OUT_OF_RESOURCES; } -- cgit v1.2.3