diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c index 90f3e46781..d6406784b7 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.c @@ -498,6 +498,43 @@ EndOfPeiCallback ( return Status; } +/** + Dispatch StandaloneMm drivers in MM. + + StandaloneMm core will exit when MmEntryPoint was registered in CPU + StandaloneMm driver, and issue a software SMI by communicate mode to + dispatch other StandaloneMm drivers. + + @retval EFI_SUCCESS Dispatch StandaloneMm drivers successfully. + @retval Other Dispatch StandaloneMm drivers failed. + +**/ +EFI_STATUS +MmIplDispatchMmDrivers ( + VOID + ) +{ + EFI_STATUS Status; + UINTN Size; + EFI_MM_COMMUNICATE_HEADER CommunicateHeader; + + // + // Use Guid to initialize EFI_MM_COMMUNICATE_HEADER structure + // + CopyGuid (&CommunicateHeader.HeaderGuid, &gEventMmDispatchGuid); + CommunicateHeader.MessageLength = 1; + CommunicateHeader.Data[0] = 0; + + // + // Generate the Software SMI and return the result + // + Size = sizeof (CommunicateHeader); + Status = Communicate (NULL, &CommunicateHeader, &Size); + ASSERT_EFI_ERROR (Status); + + return Status; +} + /** Build communication buffer HOB. @@ -603,5 +640,11 @@ StandaloneMmIplPeiEntry ( Status = PeiServicesNotifyPpi (&mNotifyList); ASSERT_EFI_ERROR (Status); + // + // Dispatch StandaloneMm drivers in MM + // + Status = MmIplDispatchMmDrivers (); + ASSERT_EFI_ERROR (Status); + return EFI_SUCCESS; } diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf index 9c748539c6..a873efb0df 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf @@ -45,6 +45,7 @@ [Guids] gMmCommBufferHobGuid gEfiSmmSmramMemoryGuid + gEventMmDispatchGuid [Ppis] gEfiPeiMmControlPpiGuid