#include <Guid/BootScriptExecutorVariable.h>\r
#include <Guid/ExtendedFirmwarePerformance.h>\r
#include <Guid/EndOfS3Resume.h>\r
+#include <Guid/S3SmmInitDone.h>\r
#include <Ppi/ReadOnlyVariable2.h>\r
#include <Ppi/S3Resume2.h>\r
#include <Ppi/SmmAccess.h>\r
0\r
};\r
\r
+EFI_PEI_PPI_DESCRIPTOR mPpiListS3SmmInitDoneTable = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEdkiiS3SmmInitDoneGuid,\r
+ 0\r
+};\r
+\r
//\r
// Global Descriptor Table (GDT)\r
//\r
}\r
\r
/**\r
- Send EndOfS3Resume event to SmmCore through communication buffer way.\r
+ Signal to SMM through communication buffer way.\r
+\r
+ @param[in] HandlerType SMI handler type to be signaled.\r
\r
- @retval EFI_SUCCESS Return send the event success.\r
**/\r
-EFI_STATUS\r
-SignalEndOfS3Resume (\r
- VOID\r
+VOID\r
+SignalToSmmByCommunication (\r
+ IN EFI_GUID *HandlerType\r
)\r
{\r
EFI_STATUS Status;\r
SMM_COMMUNICATE_HEADER_64 Header64;\r
VOID *CommBuffer;\r
\r
- DEBUG ((DEBUG_INFO, "SignalEndOfS3Resume - Enter\n"));\r
+ DEBUG ((DEBUG_INFO, "Signal %g to SMM - Enter\n", HandlerType));\r
\r
//\r
// This buffer consumed in DXE phase, so base on DXE mode to prepare communicate buffer.\r
Header32.MessageLength = 0;\r
CommSize = OFFSET_OF (SMM_COMMUNICATE_HEADER_32, Data);\r
}\r
- CopyGuid (CommBuffer, &gEdkiiEndOfS3ResumeGuid);\r
+ CopyGuid (CommBuffer, HandlerType);\r
\r
Status = PeiServicesLocatePpi (\r
&gEfiPeiSmmCommunicationPpiGuid,\r
);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "Locate Smm Communicate Ppi failed (%r)!\n", Status));\r
- return Status;\r
+ return;\r
}\r
\r
Status = SmmCommunicationPpi->Communicate (\r
DEBUG ((DEBUG_ERROR, "SmmCommunicationPpi->Communicate return failure (%r)!\n", Status));\r
}\r
\r
- DEBUG ((DEBUG_INFO, "SignalEndOfS3Resume - Exit (%r)\n", Status));\r
- return Status;\r
+ DEBUG ((DEBUG_INFO, "Signal %g to SMM - Exit (%r)\n", HandlerType, Status));\r
+ return;\r
}\r
\r
/**\r
\r
PERF_END_EX (NULL, "EndOfPeiPpi", NULL, 0, PERF_INMODULE_END_ID);\r
\r
- //\r
- // Signal EndOfS3Resume event.\r
- //\r
PERF_START_EX (NULL, "EndOfS3Resume", NULL, 0, PERF_INMODULE_START_ID);\r
\r
- SignalEndOfS3Resume ();\r
+ DEBUG ((DEBUG_INFO, "Signal EndOfS3Resume\n"));\r
+ //\r
+ // Signal EndOfS3Resume to SMM.\r
+ //\r
+ SignalToSmmByCommunication (&gEdkiiEndOfS3ResumeGuid);\r
\r
PERF_END_EX (NULL, "EndOfS3Resume", NULL, 0, PERF_INMODULE_END_ID);\r
\r
Status = SmmAccess->Lock ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), SmmAccess, Index);\r
}\r
}\r
+\r
+ DEBUG ((DEBUG_INFO, "Signal S3SmmInitDone\n"));\r
+ //\r
+ // Install S3SmmInitDone PPI.\r
+ //\r
+ Status = PeiServicesInstallPpi (&mPpiListS3SmmInitDoneTable);\r
+ ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Signal S3SmmInitDone to SMM.\r
+ //\r
+ SignalToSmmByCommunication (&gEdkiiS3SmmInitDoneGuid);\r
}\r
\r
if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r