]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c
UefiCpuPkg/MpInitLib: Fix VS2012 build failure
[mirror_edk2.git] / OvmfPkg / SmmControl2Dxe / SmmControl2Dxe.c
index 6c03e17a3a8d8a8415ace7b2744304c956abc038..e1cd3d02ac36f56d02dc2cf1226162c8a8f9baba 100644 (file)
 #include <Library/PcdLib.h>\r
 #include <Library/PciLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
+#include <Library/QemuFwCfgS3Lib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Protocol/S3SaveState.h>\r
 #include <Protocol/SmmControl2.h>\r
 \r
+#include "SmiFeatures.h"\r
+\r
 //\r
 // Forward declaration.\r
 //\r
@@ -55,6 +58,13 @@ OnS3SaveStateInstalled (
 //\r
 STATIC UINTN mSmiEnable;\r
 \r
+//\r
+// Captures whether SMI feature negotiation is supported. The variable is only\r
+// used to carry this information from the entry point function to the\r
+// S3SaveState protocol installation callback.\r
+//\r
+STATIC BOOLEAN mSmiFeatureNegotiation;\r
+\r
 //\r
 // Event signaled when an S3SaveState protocol interface is installed.\r
 //\r
@@ -229,6 +239,11 @@ SmmControl2DxeEntryPoint (
     goto FatalError;\r
   }\r
 \r
+  //\r
+  // QEMU can inject SMIs in different ways, negotiate our preferences.\r
+  //\r
+  mSmiFeatureNegotiation = NegotiateSmiFeatures ();\r
+\r
   if (QemuFwCfgS3Enabled ()) {\r
     VOID *Registration;\r
 \r
@@ -363,7 +378,15 @@ OnS3SaveStateInstalled (
     CpuDeadLoop ();\r
   }\r
 \r
-  DEBUG ((EFI_D_VERBOSE, "%a: boot script fragment saved\n", __FUNCTION__));\r
+  DEBUG ((DEBUG_VERBOSE, "%a: chipset boot script saved\n", __FUNCTION__));\r
+\r
+  //\r
+  // Append a boot script fragment that re-selects the negotiated SMI features.\r
+  //\r
+  if (mSmiFeatureNegotiation) {\r
+    SaveSmiFeatures ();\r
+  }\r
+\r
   gBS->CloseEvent (Event);\r
   mS3SaveStateInstalled = NULL;\r
 }\r