UefiCpuPkg S3ResumePei: Signal S3SmmInitDone
authorStar Zeng <star.zeng@intel.com>
Fri, 8 Dec 2017 11:22:49 +0000 (19:22 +0800)
committerStar Zeng <star.zeng@intel.com>
Sat, 3 Mar 2018 06:20:57 +0000 (14:20 +0800)
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c
UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf

index 4d77689..4ae168a 100644 (file)
@@ -24,6 +24,7 @@
 #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
@@ -259,6 +260,12 @@ EFI_PEI_PPI_DESCRIPTOR mPpiListEndOfPeiTable = {
   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
@@ -322,13 +329,14 @@ IsLongModeWakingVector (
 }\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
@@ -338,7 +346,7 @@ SignalEndOfS3Resume (
   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
@@ -355,7 +363,7 @@ SignalEndOfS3Resume (
     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
@@ -365,7 +373,7 @@ SignalEndOfS3Resume (
              );\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
@@ -377,8 +385,8 @@ SignalEndOfS3Resume (
     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
@@ -463,12 +471,13 @@ S3ResumeBootOs (
 \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
@@ -787,6 +796,17 @@ S3ResumeExecuteBootScript (
         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
index 9522ede..47fecd7 100644 (file)
@@ -78,6 +78,9 @@
   gEfiAcpiVariableGuid\r
   gEfiAcpiS3ContextGuid                         ## SOMETIMES_CONSUMES ## UNDEFINED # LockBox\r
   gEdkiiEndOfS3ResumeGuid                       ## SOMETIMES_CONSUMES ## UNDEFINED # Used to do smm communication\r
+  ## SOMETIMES_PRODUCES ## UNDEFINED # Install PPI\r
+  ## SOMETIMES_CONSUMES ## UNDEFINED # Used to do smm communication\r
+  gEdkiiS3SmmInitDoneGuid\r
 \r
 [Ppis]\r
   gEfiPeiReadOnlyVariable2PpiGuid               ## CONSUMES\r