This library registers CPU features defined in Intel(R) 64 and IA-32\r
Architectures Software Developer's Manual.\r
\r
- Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
if (IsCpuFeatureSupported (CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER)) {\r
Status = RegisterCpuFeature (\r
"Lock Feature Control Register",\r
- FeatureControlGetConfigData,\r
+ NULL,\r
LockFeatureControlRegisterSupport,\r
LockFeatureControlRegisterInitialize,\r
CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER,\r
if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {\r
Status = RegisterCpuFeature (\r
"SMX",\r
- FeatureControlGetConfigData,\r
+ NULL,\r
SmxSupport,\r
SmxInitialize,\r
CPU_FEATURE_SMX,\r
if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) {\r
Status = RegisterCpuFeature (\r
"VMX",\r
- FeatureControlGetConfigData,\r
+ NULL,\r
VmxSupport,\r
VmxInitialize,\r
CPU_FEATURE_VMX,\r
if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) {\r
Status = RegisterCpuFeature (\r
"LMCE",\r
- FeatureControlGetConfigData,\r
+ NULL,\r
LmceSupport,\r
LmceInitialize,\r
CPU_FEATURE_LMCE,\r
/** @file\r
Features in MSR_IA32_FEATURE_CONTROL register.\r
\r
- Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "CpuCommonFeatures.h"\r
\r
-/**\r
- Prepares for the data used by CPU feature detection and initialization.\r
-\r
- @param[in] NumberOfProcessors The number of CPUs in the platform.\r
-\r
- @return Pointer to a buffer of CPU related configuration data.\r
-\r
- @note This service could be called by BSP only.\r
-**/\r
-VOID *\r
-EFIAPI\r
-FeatureControlGetConfigData (\r
- IN UINTN NumberOfProcessors\r
- )\r
-{\r
- VOID *ConfigData;\r
-\r
- ConfigData = AllocateZeroPool (sizeof (MSR_IA32_FEATURE_CONTROL_REGISTER) * NumberOfProcessors);\r
- ASSERT (ConfigData != NULL);\r
- return ConfigData;\r
-}\r
-\r
/**\r
Detects if VMX feature supported on current processor.\r
\r
IN VOID *ConfigData OPTIONAL\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
-\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
return (CpuInfo->CpuIdVersionInfoEcx.Bits.VMX == 1);\r
}\r
\r
IN BOOLEAN State\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
-\r
//\r
// The scope of EnableVmxOutsideSmx bit in the MSR_IA32_FEATURE_CONTROL is core for\r
// below processor type, only program MSR_IA32_FEATURE_CONTROL for thread 0 in each\r
}\r
}\r
\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
- CPU_REGISTER_TABLE_WRITE_FIELD (\r
- ProcessorNumber,\r
- Msr,\r
- MSR_IA32_FEATURE_CONTROL,\r
- MSR_IA32_FEATURE_CONTROL_REGISTER,\r
- Bits.EnableVmxOutsideSmx,\r
- (State) ? 1 : 0\r
- );\r
- }\r
+ CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD (\r
+ ProcessorNumber,\r
+ Msr,\r
+ MSR_IA32_FEATURE_CONTROL,\r
+ MSR_IA32_FEATURE_CONTROL_REGISTER,\r
+ Bits.EnableVmxOutsideSmx,\r
+ (State) ? 1 : 0\r
+ );\r
+\r
return RETURN_SUCCESS;\r
}\r
\r
IN VOID *ConfigData OPTIONAL\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
-\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
return TRUE;\r
}\r
\r
IN BOOLEAN State\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
-\r
//\r
// The scope of Lock bit in the MSR_IA32_FEATURE_CONTROL is core for\r
// below processor type, only program MSR_IA32_FEATURE_CONTROL for thread 0 in each\r
}\r
}\r
\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
- CPU_REGISTER_TABLE_WRITE_FIELD (\r
- ProcessorNumber,\r
- Msr,\r
- MSR_IA32_FEATURE_CONTROL,\r
- MSR_IA32_FEATURE_CONTROL_REGISTER,\r
- Bits.Lock,\r
- 1\r
- );\r
- }\r
+ CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD (\r
+ ProcessorNumber,\r
+ Msr,\r
+ MSR_IA32_FEATURE_CONTROL,\r
+ MSR_IA32_FEATURE_CONTROL_REGISTER,\r
+ Bits.Lock,\r
+ 1\r
+ );\r
+\r
return RETURN_SUCCESS;\r
}\r
\r
IN VOID *ConfigData OPTIONAL\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
-\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- MsrRegister[ProcessorNumber].Uint64 = AsmReadMsr64 (MSR_IA32_FEATURE_CONTROL);\r
return (CpuInfo->CpuIdVersionInfoEcx.Bits.SMX == 1);\r
}\r
\r
IN BOOLEAN State\r
)\r
{\r
- MSR_IA32_FEATURE_CONTROL_REGISTER *MsrRegister;\r
RETURN_STATUS Status;\r
\r
//\r
Status = RETURN_UNSUPPORTED;\r
}\r
\r
- ASSERT (ConfigData != NULL);\r
- MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
- if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {\r
- CPU_REGISTER_TABLE_WRITE_FIELD (\r
- ProcessorNumber,\r
- Msr,\r
- MSR_IA32_FEATURE_CONTROL,\r
- MSR_IA32_FEATURE_CONTROL_REGISTER,\r
- Bits.SenterLocalFunctionEnables,\r
- (State) ? 0x7F : 0\r
- );\r
-\r
- CPU_REGISTER_TABLE_WRITE_FIELD (\r
- ProcessorNumber,\r
- Msr,\r
- MSR_IA32_FEATURE_CONTROL,\r
- MSR_IA32_FEATURE_CONTROL_REGISTER,\r
- Bits.SenterGlobalEnable,\r
- (State) ? 1 : 0\r
- );\r
-\r
- CPU_REGISTER_TABLE_WRITE_FIELD (\r
- ProcessorNumber,\r
- Msr,\r
- MSR_IA32_FEATURE_CONTROL,\r
- MSR_IA32_FEATURE_CONTROL_REGISTER,\r
- Bits.EnableVmxInsideSmx,\r
- (State) ? 1 : 0\r
- );\r
- }\r
+ CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD (\r
+ ProcessorNumber,\r
+ Msr,\r
+ MSR_IA32_FEATURE_CONTROL,\r
+ MSR_IA32_FEATURE_CONTROL_REGISTER,\r
+ Bits.SenterLocalFunctionEnables,\r
+ (State) ? 0x7F : 0\r
+ );\r
+\r
+ CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD (\r
+ ProcessorNumber,\r
+ Msr,\r
+ MSR_IA32_FEATURE_CONTROL,\r
+ MSR_IA32_FEATURE_CONTROL_REGISTER,\r
+ Bits.SenterGlobalEnable,\r
+ (State) ? 1 : 0\r
+ );\r
+\r
+ CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD (\r
+ ProcessorNumber,\r
+ Msr,\r
+ MSR_IA32_FEATURE_CONTROL,\r
+ MSR_IA32_FEATURE_CONTROL_REGISTER,\r
+ Bits.EnableVmxInsideSmx,\r
+ (State) ? 1 : 0\r
+ );\r
+\r
return Status;\r
}\r