From cfaccc89a2bf734fcc20d1d97231bbeb344c0cf7 Mon Sep 17 00:00:00 2001 From: Wei6 Xu Date: Fri, 21 Jun 2024 15:04:57 +0800 Subject: 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 Cc: Sami Mujawar Cc: Ray Ni Cc: Jiaxin Wu Signed-off-by: Wei6 Xu --- StandaloneMmPkg/Core/StandaloneMmCore.c | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'StandaloneMmPkg') 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; // -- cgit