mirror of https://github.com/acidanthera/audk.git
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:
parent
05973f9e8a
commit
b1fe2029fa
|
@ -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] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
|
||||
|
@ -355,42 +355,16 @@ VmxSupport (
|
|||
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 VMX inside SMX feature must be enabled.
|
||||
If FALSE, then the VMX inside SMX feature must be disabled.
|
||||
@param[in] State If TRUE, then the VMX feature must be enabled.
|
||||
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.
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
VmxInsideSmxInitialize (
|
||||
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 (
|
||||
VmxInitialize (
|
||||
IN UINTN ProcessorNumber,
|
||||
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
|
||||
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] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
|
||||
|
@ -481,16 +455,17 @@ SmxSupport (
|
|||
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 VMX outside SMX feature must be enabled.
|
||||
If FALSE, then the VMX outside SMX feature must be disabled.
|
||||
@param[in] State If TRUE, then SMX feature must be enabled.
|
||||
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.
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
VmxOutsideSmxInitialize (
|
||||
SmxInitialize (
|
||||
IN UINTN ProcessorNumber,
|
||||
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
|
||||
IN VOID *ConfigData, OPTIONAL
|
||||
|
|
|
@ -105,25 +105,12 @@ CpuCommonFeaturesLibConstructor (
|
|||
);
|
||||
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)) {
|
||||
Status = RegisterCpuFeature (
|
||||
"SMX",
|
||||
FeatureControlGetConfigData,
|
||||
SmxSupport,
|
||||
VmxInsideSmxInitialize,
|
||||
SmxInitialize,
|
||||
CPU_FEATURE_SMX,
|
||||
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
|
||||
CPU_FEATURE_END
|
||||
|
@ -134,8 +121,8 @@ CpuCommonFeaturesLibConstructor (
|
|||
Status = RegisterCpuFeature (
|
||||
"VMX",
|
||||
FeatureControlGetConfigData,
|
||||
SmxSupport,
|
||||
VmxOutsideSmxInitialize,
|
||||
VmxSupport,
|
||||
VmxInitialize,
|
||||
CPU_FEATURE_VMX,
|
||||
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,
|
||||
CPU_FEATURE_END
|
||||
|
|
|
@ -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] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
|
||||
|
@ -78,16 +78,16 @@ VmxSupport (
|
|||
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 VMX inside SMX feature must be enabled.
|
||||
If FALSE, then the VMX inside SMX feature must be disabled.
|
||||
@param[in] State If TRUE, then the VMX feature must be enabled.
|
||||
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.
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
VmxInsideSmxInitialize (
|
||||
VmxInitialize (
|
||||
IN UINTN ProcessorNumber,
|
||||
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
|
||||
IN VOID *ConfigData, OPTIONAL
|
||||
|
@ -104,59 +104,7 @@ VmxInsideSmxInitialize (
|
|||
Msr,
|
||||
MSR_IA32_FEATURE_CONTROL,
|
||||
MSR_IA32_FEATURE_CONTROL_REGISTER,
|
||||
Bits.EnableVmxInsideSmx,
|
||||
(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,
|
||||
Bits.EnableVmxOutsideSmx,
|
||||
(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] CpuInfo A pointer to the REGISTER_CPU_FEATURE_INFORMATION
|
||||
|
@ -280,16 +228,17 @@ SmxSupport (
|
|||
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 VMX outside SMX feature must be enabled.
|
||||
If FALSE, then the VMX outside SMX feature must be disabled.
|
||||
@param[in] State If TRUE, then SMX feature must be enabled.
|
||||
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.
|
||||
**/
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
VmxOutsideSmxInitialize (
|
||||
SmxInitialize (
|
||||
IN UINTN ProcessorNumber,
|
||||
IN REGISTER_CPU_FEATURE_INFORMATION *CpuInfo,
|
||||
IN VOID *ConfigData, OPTIONAL
|
||||
|
@ -297,6 +246,15 @@ VmxOutsideSmxInitialize (
|
|||
)
|
||||
{
|
||||
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);
|
||||
MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;
|
||||
|
@ -306,9 +264,27 @@ VmxOutsideSmxInitialize (
|
|||
Msr,
|
||||
MSR_IA32_FEATURE_CONTROL,
|
||||
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
|
||||
);
|
||||
}
|
||||
return RETURN_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue