It is not entirely clear from the code why, but the reserved region for storing performance data is allocated below 4 GB, and the variable to hold the address of the allocation is called 'AcpiLowMemoryBase' (which is the only mention of ACPI in the entire file).
Let's make this allocation dependent on PcdAcpiExposedTableVersions as well, since systems that can deal with ACPI table in high memory are also just as likely to be able to deal with performance data in high memory. This prevents memory fragmentation on systems that don't care about the 4 GB limit. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <[email protected]> --- IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf | 1 + IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf index 6afb8a09df9c..38172780fb49 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf @@ -215,6 +215,7 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions ## CONSUMES [Depex] TRUE diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c index ae7ad2153c51..bf5bd6524a90 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c @@ -22,6 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Hotkey.h" #include "HwErrRecSupport.h" +#include <Protocol/AcpiSystemDescriptionTable.h> + /// /// BDS arch protocol instance initial value. /// @@ -474,14 +476,21 @@ BdsAllocateMemoryForPerformanceData ( EFI_STATUS Status; EFI_PHYSICAL_ADDRESS AcpiLowMemoryBase; EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock; + EFI_ALLOCATE_TYPE AcpiTableAllocType; AcpiLowMemoryBase = 0x0FFFFFFFFULL; + if ((PcdGet32 (PcdAcpiExposedTableVersions) & EFI_ACPI_TABLE_VERSION_1_0B) != 0) { + AcpiTableAllocType = AllocateMaxAddress; + } else { + AcpiTableAllocType = AllocateAnyPages; + } + // // Allocate a block of memory that will contain performance data to OS. // Status = gBS->AllocatePages ( - AllocateMaxAddress, + AcpiTableAllocType, EfiReservedMemoryType, EFI_SIZE_TO_PAGES (PERF_DATA_MAX_LENGTH), &AcpiLowMemoryBase -- 2.5.0 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

