]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c
BaseTools/Capsule: Do not support -o with --dump-info
[mirror_edk2.git] / OvmfPkg / SmmControl2Dxe / SmmControl2Dxe.c
index 82549b0a7e353153f2678b50ae5901dfd066303c..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
@@ -311,6 +326,7 @@ OnS3SaveStateInstalled (
   EFI_STATUS                 Status;\r
   EFI_S3_SAVE_STATE_PROTOCOL *S3SaveState;\r
   UINT32                     SmiEnOrMask, SmiEnAndMask;\r
+  UINT64                     GenPmCon1Address;\r
   UINT16                     GenPmCon1OrMask, GenPmCon1AndMask;\r
 \r
   ASSERT (Event == mS3SaveStateInstalled);\r
@@ -342,13 +358,15 @@ OnS3SaveStateInstalled (
     CpuDeadLoop ();\r
   }\r
 \r
+  GenPmCon1Address = POWER_MGMT_REGISTER_Q35_EFI_PCI_ADDRESS (\r
+                       ICH9_GEN_PMCON_1);\r
   GenPmCon1OrMask  = ICH9_GEN_PMCON_1_SMI_LOCK;\r
   GenPmCon1AndMask = MAX_UINT16;\r
   Status = S3SaveState->Write (\r
                           S3SaveState,\r
                           EFI_BOOT_SCRIPT_PCI_CONFIG_READ_WRITE_OPCODE,\r
                           EfiBootScriptWidthUint16,\r
-                          (UINT64)POWER_MGMT_REGISTER_Q35 (ICH9_GEN_PMCON_1),\r
+                          GenPmCon1Address,\r
                           &GenPmCon1OrMask,\r
                           &GenPmCon1AndMask\r
                           );\r
@@ -360,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