diff --git a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c index 6210b7515e..c9d8755432 100644 --- a/OvmfPkg/SmmControl2Dxe/SmiFeatures.c +++ b/OvmfPkg/SmmControl2Dxe/SmiFeatures.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,12 @@ // "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files. // #define ICH9_LPC_SMI_F_BROADCAST BIT0 +// +// The following bit value stands for "enable CPU hotplug, and inject an SMI +// with control value ICH9_APM_CNT_CPU_HOTPLUG upon hotplug", in the +// "etc/smi/supported-features" and "etc/smi/requested-features" fw_cfg files. +// +#define ICH9_LPC_SMI_F_CPU_HOTPLUG BIT1 // // Provides a scratch buffer (allocated in EfiReservedMemoryType type memory) @@ -67,6 +74,7 @@ NegotiateSmiFeatures ( UINTN SupportedFeaturesSize; UINTN RequestedFeaturesSize; UINTN FeaturesOkSize; + UINT64 RequestedFeaturesMask; // // Look up the fw_cfg files used for feature negotiation. The selector keys @@ -104,9 +112,16 @@ NegotiateSmiFeatures ( QemuFwCfgReadBytes (sizeof mSmiFeatures, &mSmiFeatures); // - // We want broadcast SMI and nothing else. + // We want broadcast SMI, SMI on CPU hotplug, and nothing else. // - mSmiFeatures &= ICH9_LPC_SMI_F_BROADCAST; + RequestedFeaturesMask = ICH9_LPC_SMI_F_BROADCAST; + if (!MemEncryptSevIsEnabled ()) { + // + // For now, we only support hotplug with SEV disabled. + // + RequestedFeaturesMask |= ICH9_LPC_SMI_F_CPU_HOTPLUG; + } + mSmiFeatures &= RequestedFeaturesMask; QemuFwCfgSelectItem (mRequestedFeaturesItem); QemuFwCfgWriteBytes (sizeof mSmiFeatures, &mSmiFeatures); @@ -144,6 +159,13 @@ NegotiateSmiFeatures ( DEBUG ((DEBUG_INFO, "%a: using SMI broadcast\n", __FUNCTION__)); } + if ((mSmiFeatures & ICH9_LPC_SMI_F_CPU_HOTPLUG) == 0) { + DEBUG ((DEBUG_INFO, "%a: CPU hotplug not negotiated\n", __FUNCTION__)); + } else { + DEBUG ((DEBUG_INFO, "%a: CPU hotplug with SMI negotiated\n", + __FUNCTION__)); + } + // // Negotiation successful (although we may not have gotten the optimal // feature set). diff --git a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf index 3abed141e6..b8fdea8deb 100644 --- a/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf +++ b/OvmfPkg/SmmControl2Dxe/SmmControl2Dxe.inf @@ -46,6 +46,7 @@ BaseLib DebugLib IoLib + MemEncryptSevLib MemoryAllocationLib PcdLib PciLib