From 5aa5ecd5ff1ad845f5fe9d848a66a7a6f89dd9aa Mon Sep 17 00:00:00 2001 From: Hongbin1 Zhang Date: Thu, 9 May 2024 19:26:24 +0800 Subject: [PATCH] StandaloneMmPkg/MmIpl: Dispatch StandaloneMm drivers in MM MmIpl will issue a SWSMI by MM communicate to call gEventMmDispatchGuid handler to dispatch all StandaloneMm drivers Signed-off-by: Hongbin1 Zhang Cc: Jiewen Yao Cc: Ray Ni Cc: Star Zeng Cc: Jiaxin Wu Cc: Wei6 Xu Cc: Sami Mujawar Cc: Ard Biesheuvel Cc: Supreeth Venkatesh --- .../StandaloneMmIplPei/StandaloneMmIplPei.c | 43 +++++++++++++++++++ .../StandaloneMmIplPei/StandaloneMmIplPei.inf | 1 + 2 files changed, 44 insertions(+) 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