]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg CpuCommonFeaturesLib: Fix smx/vmx enable logic error.
authorEric Dong <eric.dong@intel.com>
Tue, 11 Jul 2017 02:07:36 +0000 (10:07 +0800)
committerEric Dong <eric.dong@intel.com>
Wed, 12 Jul 2017 00:51:08 +0000 (08:51 +0800)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed: Jeff Fan <jeff.fan@intel.com>

UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h
UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c
UefiCpuPkg/Library/CpuCommonFeaturesLib/FeatureControl.c

index 9a7afed105706ae747036148d8192e7a11f2514a..9c6e0b4e674165e3afb98b8286b4013292d011ee 100644 (file)
@@ -346,7 +346,7 @@ VmxSupport (
   );\r
 \r
 /**\r
-  Initializes VMX inside SMX feature to specific state.\r
+  Initializes VMX feature to specific state.\r
 \r
   @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
@@ -355,42 +355,16 @@ VmxSupport (
                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
                                CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
                                RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the VMX inside SMX feature must be enabled.\r
-                               If FALSE, then the VMX inside SMX feature must be disabled.\r
+  @param[in]  State            If TRUE, then the VMX feature must be enabled.\r
+                               If FALSE, then the VMX feature must be disabled.\r
 \r
-  @retval RETURN_SUCCESS       VMX inside SMX feature is initialized.\r
+  @retval RETURN_SUCCESS       VMX feature is initialized.\r
 \r
   @note This service could be called by BSP only.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
-VmxInsideSmxInitialize (\r
-  IN UINTN                             ProcessorNumber,\r
-  IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
-  IN VOID                              *ConfigData,  OPTIONAL\r
-  IN BOOLEAN                           State\r
-  );\r
-\r
-/**\r
-  Initializes SENTER feature to specific state.\r
-\r
-  @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
-  @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
-                               structure for the CPU executing this function.\r
-  @param[in]  ConfigData       A pointer to the configuration buffer returned\r
-                               by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
-                               CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
-                               RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the SENTER feature must be enabled.\r
-                               If FALSE, then the SENTER feature must be disabled.\r
-\r
-  @retval RETURN_SUCCESS       SENTER feature is initialized.\r
-\r
-  @note This service could be called by BSP only.\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-SenterInitialize (\r
+VmxInitialize (\r
   IN UINTN                             ProcessorNumber,\r
   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
   IN VOID                              *ConfigData,  OPTIONAL\r
@@ -472,7 +446,7 @@ SmxSupport (
   );\r
 \r
 /**\r
-  Initializes VMX outside SMX feature to specific state.\r
+  Initializes SMX feature to specific state.\r
 \r
   @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
@@ -481,16 +455,17 @@ SmxSupport (
                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
                                CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
                                RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the VMX outside SMX feature must be enabled.\r
-                               If FALSE, then the VMX outside SMX feature must be disabled.\r
+  @param[in]  State            If TRUE, then SMX feature must be enabled.\r
+                               If FALSE, then SMX feature must be disabled.\r
 \r
-  @retval RETURN_SUCCESS       VMX outside SMX feature is initialized.\r
+  @retval RETURN_SUCCESS       SMX feature is initialized.\r
+  @retval RETURN_UNSUPPORTED   VMX not initialized.\r
 \r
   @note This service could be called by BSP only.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
-VmxOutsideSmxInitialize (\r
+SmxInitialize (\r
   IN UINTN                             ProcessorNumber,\r
   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
   IN VOID                              *ConfigData,  OPTIONAL\r
index 793a0956d3f82520578fb0fa6261d1c70d1ed231..2bd32ab8a6bbb6e17d02405607bfe7e6a13624c0 100644 (file)
@@ -105,25 +105,12 @@ CpuCommonFeaturesLibConstructor (
                );\r
     ASSERT_EFI_ERROR (Status);\r
   }\r
-  if (IsCpuFeatureSupported (CPU_FEATURE_SENTER)) {\r
-    Status = RegisterCpuFeature (\r
-               "SENTER",\r
-               FeatureControlGetConfigData,\r
-               VmxSupport,\r
-               SenterInitialize,\r
-               CPU_FEATURE_SENTER,\r
-               CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,\r
-               CPU_FEATURE_SMX | CPU_FEATURE_AFTER,\r
-               CPU_FEATURE_END\r
-               );\r
-    ASSERT_EFI_ERROR (Status);\r
-  }\r
   if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {\r
     Status = RegisterCpuFeature (\r
                "SMX",\r
                FeatureControlGetConfigData,\r
                SmxSupport,\r
-               VmxInsideSmxInitialize,\r
+               SmxInitialize,\r
                CPU_FEATURE_SMX,\r
                CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,\r
                CPU_FEATURE_END\r
@@ -134,8 +121,8 @@ CpuCommonFeaturesLibConstructor (
     Status = RegisterCpuFeature (\r
                "VMX",\r
                FeatureControlGetConfigData,\r
-               SmxSupport,\r
-               VmxOutsideSmxInitialize,\r
+               VmxSupport,\r
+               VmxInitialize,\r
                CPU_FEATURE_VMX,\r
                CPU_FEATURE_LOCK_FEATURE_CONTROL_REGISTER | CPU_FEATURE_BEFORE,\r
                CPU_FEATURE_END\r
index 0b5c161f87a02afd24aff4eb5179ec7620f77352..d28c4ec51a04164480ffbae86a01f457151eee84 100644 (file)
@@ -69,7 +69,7 @@ VmxSupport (
 }\r
 \r
 /**\r
-  Initializes VMX inside SMX feature to specific state.\r
+  Initializes VMX feature to specific state.\r
 \r
   @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
@@ -78,16 +78,16 @@ VmxSupport (
                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
                                CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
                                RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the VMX inside SMX feature must be enabled.\r
-                               If FALSE, then the VMX inside SMX feature must be disabled.\r
+  @param[in]  State            If TRUE, then the VMX feature must be enabled.\r
+                               If FALSE, then the VMX feature must be disabled.\r
 \r
-  @retval RETURN_SUCCESS       VMX inside SMX feature is initialized.\r
+  @retval RETURN_SUCCESS       VMX feature is initialized.\r
 \r
   @note This service could be called by BSP only.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
-VmxInsideSmxInitialize (\r
+VmxInitialize (\r
   IN UINTN                             ProcessorNumber,\r
   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
   IN VOID                              *ConfigData,  OPTIONAL\r
@@ -104,59 +104,7 @@ VmxInsideSmxInitialize (
       Msr,\r
       MSR_IA32_FEATURE_CONTROL,\r
       MSR_IA32_FEATURE_CONTROL_REGISTER,\r
-      Bits.EnableVmxInsideSmx,\r
-      (State) ? 1 : 0\r
-      );\r
-  }\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-/**\r
-  Initializes SENTER feature to specific state.\r
-\r
-  @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
-  @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
-                               structure for the CPU executing this function.\r
-  @param[in]  ConfigData       A pointer to the configuration buffer returned\r
-                               by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
-                               CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
-                               RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the SENTER feature must be enabled.\r
-                               If FALSE, then the SENTER feature must be disabled.\r
-\r
-  @retval RETURN_SUCCESS       SENTER feature is initialized.\r
-\r
-  @note This service could be called by BSP only.\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-SenterInitialize (\r
-  IN UINTN                             ProcessorNumber,\r
-  IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
-  IN VOID                              *ConfigData,  OPTIONAL\r
-  IN BOOLEAN                           State\r
-  )\r
-{\r
-  MSR_IA32_FEATURE_CONTROL_REGISTER    *MsrRegister;\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
+      Bits.EnableVmxOutsideSmx,\r
       (State) ? 1 : 0\r
       );\r
   }\r
@@ -271,7 +219,7 @@ SmxSupport (
 }\r
 \r
 /**\r
-  Initializes VMX outside SMX feature to specific state.\r
+  Initializes SMX feature to specific state.\r
 \r
   @param[in]  ProcessorNumber  The index of the CPU executing this function.\r
   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION\r
@@ -280,16 +228,17 @@ SmxSupport (
                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if\r
                                CPU_FEATURE_GET_CONFIG_DATA was not provided in\r
                                RegisterCpuFeature().\r
-  @param[in]  State            If TRUE, then the VMX outside SMX feature must be enabled.\r
-                               If FALSE, then the VMX outside SMX feature must be disabled.\r
+  @param[in]  State            If TRUE, then SMX feature must be enabled.\r
+                               If FALSE, then SMX feature must be disabled.\r
 \r
-  @retval RETURN_SUCCESS       VMX outside SMX feature is initialized.\r
+  @retval RETURN_SUCCESS       SMX feature is initialized.\r
+  @retval RETURN_UNSUPPORTED   VMX not initialized.\r
 \r
   @note This service could be called by BSP only.\r
 **/\r
 RETURN_STATUS\r
 EFIAPI\r
-VmxOutsideSmxInitialize (\r
+SmxInitialize (\r
   IN UINTN                             ProcessorNumber,\r
   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,\r
   IN VOID                              *ConfigData,  OPTIONAL\r
@@ -297,6 +246,15 @@ VmxOutsideSmxInitialize (
   )\r
 {\r
   MSR_IA32_FEATURE_CONTROL_REGISTER    *MsrRegister;\r
+  RETURN_STATUS                        Status;\r
+\r
+  Status = RETURN_SUCCESS;\r
+\r
+  if (State && (!IsCpuFeatureInSetting (CPU_FEATURE_VMX))) {\r
+    DEBUG ((DEBUG_WARN, "Warning :: Can't enable SMX feature when VMX feature not enabled, disable it.\n"));\r
+    State = FALSE;\r
+    Status = RETURN_UNSUPPORTED;\r
+  }\r
 \r
   ASSERT (ConfigData != NULL);\r
   MsrRegister = (MSR_IA32_FEATURE_CONTROL_REGISTER *) ConfigData;\r
@@ -306,9 +264,27 @@ VmxOutsideSmxInitialize (
       Msr,\r
       MSR_IA32_FEATURE_CONTROL,\r
       MSR_IA32_FEATURE_CONTROL_REGISTER,\r
-      Bits.EnableVmxOutsideSmx,\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
-  return RETURN_SUCCESS;\r
+  return Status;\r
 }\r