UefiCpuPkg CpuCommonFeaturesLib: Fix smx/vmx enable logic error.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed: Jeff Fan <jeff.fan@intel.com>
This commit is contained in:
Eric Dong 2017-07-11 10:07:36 +08:00
parent 05973f9e8a
commit b1fe2029fa
3 changed files with 55 additions and 117 deletions

View File

@ -346,7 +346,7 @@ VmxSupport (
); );
/** /**
Initializes VMX inside SMX feature to specific state. Initializes VMX feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function. @param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
@ -355,42 +355,16 @@ VmxSupport (
by CPU_FEATURE_GET_CONFIG_DATA. NULL if by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature(). RegisterCpuFeature().
@param[in] State If TRUE, then the VMX inside SMX feature must be enabled. @param[in] State If TRUE, then the VMX feature must be enabled.
If FALSE, then the VMX inside SMX feature must be disabled. If FALSE, then the VMX feature must be disabled.
@retval RETURN_SUCCESS VMX inside SMX feature is initialized. @retval RETURN_SUCCESS VMX feature is initialized.
@note This service could be called by BSP only. @note This service could be called by BSP only.
**/ **/
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
VmxInsideSmxInitialize ( VmxInitialize (
IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL
IN BOOLEAN State
);
/**
Initializes SENTER feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
structure for the CPU executing this function.
@param[in] ConfigData A pointer to the configuration buffer returned
by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature().
@param[in] State If TRUE, then the SENTER feature must be enabled.
If FALSE, then the SENTER feature must be disabled.
@retval RETURN_SUCCESS SENTER feature is initialized.
@note This service could be called by BSP only.
**/
RETURN_STATUS
EFIAPI
SenterInitialize (
IN UINTN ProcessorNumber, IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo, IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL IN VOID *ConfigData, OPTIONAL
@ -472,7 +446,7 @@ SmxSupport (
); );
/** /**
Initializes VMX outside SMX feature to specific state. Initializes SMX feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function. @param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
@ -481,16 +455,17 @@ SmxSupport (
by CPU_FEATURE_GET_CONFIG_DATA. NULL if by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature(). RegisterCpuFeature().
@param[in] State If TRUE, then the VMX outside SMX feature must be enabled. @param[in] State If TRUE, then SMX feature must be enabled.
If FALSE, then the VMX outside SMX feature must be disabled. If FALSE, then SMX feature must be disabled.
@retval RETURN_SUCCESS VMX outside SMX feature is initialized. @retval RETURN_SUCCESS SMX feature is initialized.
@retval RETURN_UNSUPPORTED VMX not initialized.
@note This service could be called by BSP only. @note This service could be called by BSP only.
**/ **/
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
VmxOutsideSmxInitialize ( SmxInitialize (
IN UINTN ProcessorNumber, IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo, IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL IN VOID *ConfigData, OPTIONAL

View File

@ -105,25 +105,12 @@ CpuCommonFeaturesLibConstructor (
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
} }
if (IsCpuFeatureSupported (CPU_FEATURE_SENTER)) {
Status = RegisterCpuFeature (
"SENTER",
FeatureControlGetConfigData,
VmxSupport,
SenterInitialize,
CPU_FEATURE_SENTER,
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
CPU_FEATURE_SMX | CPU_FEATURE_AFTER,
CPU_FEATURE_END
);
ASSERT_EFI_ERROR (Status);
}
if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) { if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {
Status = RegisterCpuFeature ( Status = RegisterCpuFeature (
"SMX", "SMX",
FeatureControlGetConfigData, FeatureControlGetConfigData,
SmxSupport, SmxSupport,
VmxInsideSmxInitialize, SmxInitialize,
CPU_FEATURE_SMX, CPU_FEATURE_SMX,
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE, CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
CPU_FEATURE_END CPU_FEATURE_END
@ -134,8 +121,8 @@ CpuCommonFeaturesLibConstructor (
Status = RegisterCpuFeature ( Status = RegisterCpuFeature (
"VMX", "VMX",
FeatureControlGetConfigData, FeatureControlGetConfigData,
SmxSupport, VmxSupport,
VmxOutsideSmxInitialize, VmxInitialize,
CPU_FEATURE_VMX, CPU_FEATURE_VMX,
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE, CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
CPU_FEATURE_END CPU_FEATURE_END

View File

@ -69,7 +69,7 @@ VmxSupport (
} }
/** /**
Initializes VMX inside SMX feature to specific state. Initializes VMX feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function. @param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
@ -78,16 +78,16 @@ VmxSupport (
by CPU_FEATURE_GET_CONFIG_DATA. NULL if by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature(). RegisterCpuFeature().
@param[in] State If TRUE, then the VMX inside SMX feature must be enabled. @param[in] State If TRUE, then the VMX feature must be enabled.
If FALSE, then the VMX inside SMX feature must be disabled. If FALSE, then the VMX feature must be disabled.
@retval RETURN_SUCCESS VMX inside SMX feature is initialized. @retval RETURN_SUCCESS VMX feature is initialized.
@note This service could be called by BSP only. @note This service could be called by BSP only.
**/ **/
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
VmxInsideSmxInitialize ( VmxInitialize (
IN UINTN ProcessorNumber, IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo, IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL IN VOID *ConfigData, OPTIONAL
@ -104,59 +104,7 @@ VmxInsideSmxInitialize (
Msr, Msr,
MSR_IA32_FEATURE_CONTROL, MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER, MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.EnableVmxInsideSmx, Bits.EnableVmxOutsideSmx,
(State) ? 1 : 0
);
}
return RETURN_SUCCESS;
}
/**
Initializes SENTER feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
structure for the CPU executing this function.
@param[in] ConfigData A pointer to the configuration buffer returned
by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature().
@param[in] State If TRUE, then the SENTER feature must be enabled.
If FALSE, then the SENTER feature must be disabled.
@retval RETURN_SUCCESS SENTER feature is initialized.
@note This service could be called by BSP only.
**/
RETURN_STATUS
EFIAPI
SenterInitialize (
IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL
IN BOOLEAN State
)
{
MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;
ASSERT (ConfigData != NULL);
MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;
if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {
CPU_REGISTER_TABLE_WRITE_FIELD (
ProcessorNumber,
Msr,
MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.SenterLocalFunctionEnables,
(State) ? 0x7F : 0
);
CPU_REGISTER_TABLE_WRITE_FIELD (
ProcessorNumber,
Msr,
MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.SenterGlobalEnable,
(State) ? 1 : 0 (State) ? 1 : 0
); );
} }
@ -271,7 +219,7 @@ SmxSupport (
} }
/** /**
Initializes VMX outside SMX feature to specific state. Initializes SMX feature to specific state.
@param[in] ProcessorNumber The index of the CPU executing this function. @param[in] ProcessorNumber The index of the CPU executing this function.
@param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION @param[in] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
@ -280,16 +228,17 @@ SmxSupport (
by CPU_FEATURE_GET_CONFIG_DATA. NULL if by CPU_FEATURE_GET_CONFIG_DATA. NULL if
CPU_FEATURE_GET_CONFIG_DATA was not provided in CPU_FEATURE_GET_CONFIG_DATA was not provided in
RegisterCpuFeature(). RegisterCpuFeature().
@param[in] State If TRUE, then the VMX outside SMX feature must be enabled. @param[in] State If TRUE, then SMX feature must be enabled.
If FALSE, then the VMX outside SMX feature must be disabled. If FALSE, then SMX feature must be disabled.
@retval RETURN_SUCCESS VMX outside SMX feature is initialized. @retval RETURN_SUCCESS SMX feature is initialized.
@retval RETURN_UNSUPPORTED VMX not initialized.
@note This service could be called by BSP only. @note This service could be called by BSP only.
**/ **/
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
VmxOutsideSmxInitialize ( SmxInitialize (
IN UINTN ProcessorNumber, IN UINTN ProcessorNumber,
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo, IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
IN VOID *ConfigData, OPTIONAL IN VOID *ConfigData, OPTIONAL
@ -297,6 +246,15 @@ VmxOutsideSmxInitialize (
) )
{ {
MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister; MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;
RETURN_STATUS Status;
Status = RETURN_SUCCESS;
if (State && (!IsCpuFeatureInSetting (CPU_FEATURE_VMX))) {
DEBUG ((DEBUG_WARN, "Warning :: Can't enable SMX feature when VMX feature not enabled, disable it.\n"));
State = FALSE;
Status = RETURN_UNSUPPORTED;
}
ASSERT (ConfigData != NULL); ASSERT (ConfigData != NULL);
MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData; MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;
@ -306,9 +264,27 @@ VmxOutsideSmxInitialize (
Msr, Msr,
MSR_IA32_FEATURE_CONTROL, MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER, MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.EnableVmxOutsideSmx, Bits.SenterLocalFunctionEnables,
(State) ? 0x7F : 0
);
CPU_REGISTER_TABLE_WRITE_FIELD (
ProcessorNumber,
Msr,
MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.SenterGlobalEnable,
(State) ? 1 : 0
);
CPU_REGISTER_TABLE_WRITE_FIELD (
ProcessorNumber,
Msr,
MSR_IA32_FEATURE_CONTROL,
MSR_IA32_FEATURE_CONTROL_REGISTER,
Bits.EnableVmxInsideSmx,
(State) ? 1 : 0 (State) ? 1 : 0
); );
} }
return RETURN_SUCCESS; return Status;
} }