mirror of
https://github.com/acidanthera/audk.git
synced 2025-08-18 16:18:12 +02:00
Removes the following types from the memory type information HOBs produced in the MemoryInitPei code: - `EfiBootServicesCode` - `EfiBootServicesData` - `EfiLoaderCode` - `EfiLoaderData` Our platform has a memory type information validation routine that currently expects those types to be excluded as they would not impact the UEFI memory map since they are not runtime memory types. This follows the guidance in the whitepaper "A Tour Beyond BIOS Memory Map and Practices in UEFI BIOS". https://github.com/tianocore-docs/Docs/raw/master/White_Papers/A_Tour_Beyond_BIOS_Memory_Map_And_Practices_in_UEFI_BIOS_V2.pdf "NOTE: We recommend a platform only define the ReservedMemory, ACPINvs, ACPIReclaim, RuntimeCode, RuntimeData in Memory Type Information table, because OSes only request these regions to be consistent. There is no need to add BootServicesCode, BootServicesData, LoaderCode, LoaderData in memory type information table, because these regions will not be reserved during S4 resume." Since these memory types are not tracked in memory type information any longer it also reduces the number of resets that may need to occur to update memory type buckets that are not needed. Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
137 lines
4.2 KiB
C
137 lines
4.2 KiB
C
/** @file
|
|
|
|
Copyright (c) 2011, ARM Limited. All rights reserved.
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <PiPei.h>
|
|
|
|
//
|
|
// The protocols, PPI and GUID definitions for this module
|
|
//
|
|
#include <Ppi/MasterBootMode.h>
|
|
#include <Ppi/BootInRecoveryMode.h>
|
|
#include <Guid/MemoryTypeInformation.h>
|
|
//
|
|
// The Library classes this module consumes
|
|
//
|
|
#include <Library/ArmPlatformLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Library/PeimEntryPoint.h>
|
|
#include <Library/PeiServicesLib.h>
|
|
#include <Library/PcdLib.h>
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
MemoryPeim (
|
|
IN EFI_PHYSICAL_ADDRESS UefiMemoryBase,
|
|
IN UINT64 UefiMemorySize
|
|
);
|
|
|
|
// May want to put this into a library so you only need the PCD settings if you are using the feature?
|
|
VOID
|
|
BuildMemoryTypeInformationHob (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_MEMORY_TYPE_INFORMATION Info[6];
|
|
|
|
Info[0].Type = EfiACPIReclaimMemory;
|
|
Info[0].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory);
|
|
Info[1].Type = EfiACPIMemoryNVS;
|
|
Info[1].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS);
|
|
Info[2].Type = EfiReservedMemoryType;
|
|
Info[2].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiReservedMemoryType);
|
|
Info[3].Type = EfiRuntimeServicesData;
|
|
Info[3].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesData);
|
|
Info[4].Type = EfiRuntimeServicesCode;
|
|
Info[4].NumberOfPages = PcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode);
|
|
// Terminator for the list
|
|
Info[5].Type = EfiMaxMemoryType;
|
|
Info[5].NumberOfPages = 0;
|
|
|
|
BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info));
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
FileHandle - Handle of the file being invoked.
|
|
PeiServices - Describes the list of possible PEI Services.
|
|
|
|
Returns:
|
|
|
|
Status - EFI_SUCCESS if the boot mode could be set
|
|
|
|
--*/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
InitializeMemory (
|
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
UINTN SystemMemoryBase;
|
|
UINT64 SystemMemoryTop;
|
|
UINTN FdBase;
|
|
UINTN FdTop;
|
|
UINTN UefiMemoryBase;
|
|
|
|
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Memory Init PEIM Loaded\n"));
|
|
|
|
// Ensure PcdSystemMemorySize has been set
|
|
ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);
|
|
ASSERT (PcdGet64 (PcdSystemMemoryBase) < (UINT64)MAX_ALLOC_ADDRESS);
|
|
|
|
SystemMemoryBase = (UINTN)PcdGet64 (PcdSystemMemoryBase);
|
|
SystemMemoryTop = SystemMemoryBase + PcdGet64 (PcdSystemMemorySize);
|
|
if (SystemMemoryTop - 1 > MAX_ALLOC_ADDRESS) {
|
|
SystemMemoryTop = (UINT64)MAX_ALLOC_ADDRESS + 1;
|
|
}
|
|
|
|
FdBase = (UINTN)PcdGet64 (PcdFdBaseAddress);
|
|
FdTop = FdBase + (UINTN)PcdGet32 (PcdFdSize);
|
|
|
|
//
|
|
// Declare the UEFI memory to PEI
|
|
//
|
|
|
|
// In case the firmware has been shadowed in the System Memory
|
|
if ((FdBase >= SystemMemoryBase) && (FdTop <= SystemMemoryTop)) {
|
|
// Check if there is enough space between the top of the system memory and the top of the
|
|
// firmware to place the UEFI memory (for PEI & DXE phases)
|
|
if (SystemMemoryTop - FdTop >= FixedPcdGet32 (PcdSystemMemoryUefiRegionSize)) {
|
|
UefiMemoryBase = SystemMemoryTop - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
|
|
} else {
|
|
// Check there is enough space for the UEFI memory
|
|
ASSERT (SystemMemoryBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize) <= FdBase);
|
|
|
|
UefiMemoryBase = FdBase - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
|
|
}
|
|
} else {
|
|
// Check the Firmware does not overlapped with the system memory
|
|
ASSERT ((FdBase < SystemMemoryBase) || (FdBase >= SystemMemoryTop));
|
|
ASSERT ((FdTop <= SystemMemoryBase) || (FdTop > SystemMemoryTop));
|
|
|
|
UefiMemoryBase = SystemMemoryTop - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
|
|
}
|
|
|
|
Status = PeiServicesInstallPeiMemory (UefiMemoryBase, FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
// Initialize MMU and Memory HOBs (Resource Descriptor HOBs)
|
|
Status = MemoryPeim (UefiMemoryBase, FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
return Status;
|
|
}
|