#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
//\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
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
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