diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c index b2611f2b4961..27103a456420 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c @@ -803,6 +803,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. @@ -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