]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.c
MdeModulePkg/DxeCore: base code protection on permission attributes
[mirror_edk2.git] / OvmfPkg / SmmControl2Dxe / SmmControl2Dxe.c
index 82549b0a7e353153f2678b50ae5901dfd066303c..f31646d73461fa457ac7751f2518351fbe5144af 100644 (file)
@@ -36,6 +36,8 @@
 #include <Protocol/S3SaveState.h>\r
 #include <Protocol/SmmControl2.h>\r
 \r
+#include "SmiFeatures.h"\r
+\r
 //\r
 // Forward declaration.\r
 //\r
@@ -55,6 +57,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 +238,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 +325,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 +357,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,6 +377,13 @@ OnS3SaveStateInstalled (
     CpuDeadLoop ();\r
   }\r
 \r
+  //\r
+  // Append a boot script fragment that re-selects the negotiated SMI features.\r
+  //\r
+  if (mSmiFeatureNegotiation) {\r
+    SaveSmiFeatures (S3SaveState);\r
+  }\r
+\r
   DEBUG ((EFI_D_VERBOSE, "%a: boot script fragment saved\n", __FUNCTION__));\r
   gBS->CloseEvent (Event);\r
   mS3SaveStateInstalled = NULL;\r