summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c56
1 files changed, 52 insertions, 4 deletions
diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c
index b2611f2b49..27103a4564 100644
--- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c
+++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c
@@ -804,6 +804,49 @@ GetRemainingHobSize (
}
/**
+ Check if FV HOB was created.
+
+ Check if FV HOB was created on HOB list,
+ if yes, skip building MM Core FV HOB,
+ if No, continue to build MM Core FV HOB
+
+ @param[in] HobList HOB list.
+ @param[in] HobSize HOB size.
+
+ @retval TRUE Skip building MM Core FV HOB.
+ FALSE Continue to build MM Core FV HOB.
+**/
+BOOLEAN
+IsFvHobExist (
+ IN UINT8 *HobList,
+ IN UINTN HobSize
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ UINTN HobLength;
+
+ if ((HobList == NULL) || (HobSize == 0)) {
+ return FALSE;
+ }
+
+ Hob.Raw = (UINT8 *)HobList;
+ HobLength = GET_HOB_LENGTH (Hob);
+ //
+ // Parse the HOB list until end of list or matching type is found.
+ //
+ while (HobLength <= HobSize) {
+ if (Hob.Header->HobType == EFI_HOB_TYPE_FV) {
+ return TRUE;
+ }
+
+ Hob.Raw = GET_NEXT_HOB (Hob);
+ HobLength += GET_HOB_LENGTH (Hob);
+ }
+
+ return FALSE;
+}
+
+/**
Create the MM foundation specific HOB list which StandaloneMm Core needed.
This function build the MM foundation specific HOB list needed by StandaloneMm Core
@@ -892,11 +935,16 @@ CreateMmFoundationHobList (
UsedSize += HobLength;
//
- // BFV address for StandaloneMm Core
+ // Skip to report FV that contains MmCore when Platform reports FV
//
- HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize);
- MmIplBuildFvHob (FoundationHobList + UsedSize, &HobLength, MmFvBase, MmFvSize);
- UsedSize += HobLength;
+ if (!IsFvHobExist (PlatformHobList, PlatformHobSize)) {
+ //
+ // BFV address for StandaloneMm Core
+ //
+ HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize);
+ MmIplBuildFvHob (FoundationHobList + UsedSize, &HobLength, MmFvBase, MmFvSize);
+ UsedSize += HobLength;
+ }
//
// Build MM ACPI S3 Enable HOB