diff options
author | Wei6 Xu <wei6.xu@intel.com> | 2024-06-21 15:04:57 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-08-28 15:25:27 +0000 |
commit | cfaccc89a2bf734fcc20d1d97231bbeb344c0cf7 (patch) | |
tree | 4169dd7bd9ab1332f0fc65e588f00c62454fc6ea /StandaloneMmPkg | |
parent | 6b69f564a949830fcc08c8bc19a2f27587034d37 (diff) | |
download | edk2-cfaccc89a2bf734fcc20d1d97231bbeb344c0cf7.tar.gz |
StandaloneMmPkg/Core: Migrate Memory Allocation Hob into MMRAM
If a Memory Allocation Hob with EfiBootServicesData memory type is
reported into MM Hob List and it also has a non-zero GUID name, then the
HOB is used by MM driver and needs to migrate the memory into MMRAM.
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Signed-off-by: Wei6 Xu <wei6.xu@intel.com>
Diffstat (limited to 'StandaloneMmPkg')
-rw-r--r-- | StandaloneMmPkg/Core/StandaloneMmCore.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.c b/StandaloneMmPkg/Core/StandaloneMmCore.c index 352a067253..f38d7d7483 100644 --- a/StandaloneMmPkg/Core/StandaloneMmCore.c +++ b/StandaloneMmPkg/Core/StandaloneMmCore.c @@ -643,6 +643,66 @@ MmConfigurationMmNotify ( return EFI_SUCCESS;
}
+/**
+ Migrate MemoryBaseAddress in memory allocation HOBs with BootServiceData
+ type and non-zero GUID name from Boot Service memory to MMRAM.
+
+ @param[in] HobStart Pointer to the start of the HOB list.
+
+**/
+VOID
+MigrateMemoryAllocationHobs (
+ IN VOID *HobStart
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_HOB_MEMORY_ALLOCATION *MemoryAllocationHob;
+ VOID *MemoryInMmram;
+
+ MemoryAllocationHob = NULL;
+ Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, HobStart);
+ while (Hob.Raw != NULL) {
+ MemoryAllocationHob = (EFI_HOB_MEMORY_ALLOCATION *)Hob.Raw;
+ if ((MemoryAllocationHob->AllocDescriptor.MemoryType == EfiBootServicesData) &&
+ (MmIsBufferOutsideMmValid (
+ MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress,
+ MemoryAllocationHob->AllocDescriptor.MemoryLength
+ ))
+ )
+ {
+ if (!IsZeroGuid (&MemoryAllocationHob->AllocDescriptor.Name)) {
+ MemoryInMmram = AllocatePages (EFI_SIZE_TO_PAGES (MemoryAllocationHob->AllocDescriptor.MemoryLength));
+ if (MemoryInMmram != NULL) {
+ DEBUG ((
+ DEBUG_INFO,
+ "Migrate Memory Allocation Hob (%g) from %08x to %08p\n",
+ &MemoryAllocationHob->AllocDescriptor.Name,
+ MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress,
+ MemoryInMmram
+ ));
+ CopyMem (
+ MemoryInMmram,
+ (VOID *)(UINTN)MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress,
+ MemoryAllocationHob->AllocDescriptor.MemoryLength
+ );
+ MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryInMmram;
+ MemoryAllocationHob->AllocDescriptor.MemoryType = EfiRuntimeServicesData;
+ }
+ } else {
+ DEBUG ((
+ DEBUG_ERROR,
+ "Error - Memory Allocation Hob [%08x, %08x] doesn't have a GUID name specified\n",
+ MemoryAllocationHob->AllocDescriptor.MemoryBaseAddress,
+ MemoryAllocationHob->AllocDescriptor.MemoryLength
+ ));
+ }
+ }
+
+ Hob.Raw = GET_NEXT_HOB (Hob);
+ Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw);
+ }
+}
+
/** Returns the HOB list size.
@param [in] HobStart Pointer to the start of the HOB list.
@@ -757,6 +817,7 @@ StandaloneMmMain ( CopyMem (MmHobStart, HobStart, HobSize);
Status = MmInstallConfigurationTable (&gMmCoreMmst, &gEfiHobListGuid, MmHobStart, HobSize);
ASSERT_EFI_ERROR (Status);
+ MigrateMemoryAllocationHobs (MmHobStart);
gHobList = MmHobStart;
//
|