]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuCommonFeaturesLib: Use new macros.
authorDong, Eric <eric.dong@intel.com>
Fri, 16 Aug 2019 03:57:30 +0000 (11:57 +0800)
committerRay Ni <ray.ni@intel.com>
Tue, 20 Aug 2019 18:44:50 +0000 (02:44 +0800)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040

Below code is current implementation:
  if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {
    CPU_REGISTER_TABLE_WRITE_FIELD (
      ProcessorNumber,
      Msr,
      MSR_IA32_FEATURE_CONTROL,
      MSR_IA32_FEATURE_CONTROL_REGISTER,
      Bits.Lock,
      1
    );
  }

1. In first normal boot, the Bits.Lock is 0, 1 will be added
   into the register table and then will set to the MSR.
2. Trig warm reboot, MSR value preserves. After normal boot phase,
   the Bits.Lock is 1, so it will not be added into the register
   table during the warm reboot phase.
3. Trig S3 then resume, the Bits.Lock change to 0 and Bits.Lock is
   not added in register table, so it's still 0 after resume. This
   is not an expect behavior. The expect value is the value should
   always 1 after booting or resuming from S3.

The root cause for this issue is
1. driver bases on current value to insert the "set value action" to
   the register table.
2. Some MSRs may reserve their value during warm reboot.

The solution for this issue is using new added macros for the MSRs which
preserve value during warm reboot.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeatures.h
UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.c
UefiCpuPkg/Library/CpuCommonFeaturesLib/FeatureControl.c
UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c

index 25d01747272b1756352ac929864776f4dc0c1543..b2390e6c39dfa8ad25b6bcaa4c8c1d4d795b1f0e 100644 (file)
@@ -848,21 +848,6 @@ X2ApicInitialize (
   IN BOOLEAN                           State\r
   );\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
 /**\r
   Prepares for the data used by CPU feature detection and initialization.\r
 \r
index fd43b8d66290fbe880d27ded4970fbf2319bbf37..238632f88af754b08c21c6e22c164879ec3235e8 100644 (file)
@@ -2,7 +2,7 @@
   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
@@ -91,7 +91,7 @@ CpuCommonFeaturesLibConstructor (
   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
@@ -102,7 +102,7 @@ CpuCommonFeaturesLibConstructor (
   if (IsCpuFeatureSupported (CPU_FEATURE_SMX)) {\r
     Status = RegisterCpuFeature (\r
                "SMX",\r
-               FeatureControlGetConfigData,\r
+               NULL,\r
                SmxSupport,\r
                SmxInitialize,\r
                CPU_FEATURE_SMX,\r
@@ -114,7 +114,7 @@ CpuCommonFeaturesLibConstructor (
   if (IsCpuFeatureSupported (CPU_FEATURE_VMX)) {\r
     Status = RegisterCpuFeature (\r
                "VMX",\r
-               FeatureControlGetConfigData,\r
+               NULL,\r
                VmxSupport,\r
                VmxInitialize,\r
                CPU_FEATURE_VMX,\r
@@ -214,7 +214,7 @@ CpuCommonFeaturesLibConstructor (
   if (IsCpuFeatureSupported (CPU_FEATURE_LMCE)) {\r
     Status = RegisterCpuFeature (\r
                "LMCE",\r
-               FeatureControlGetConfigData,\r
+               NULL,\r
                LmceSupport,\r
                LmceInitialize,\r
                CPU_FEATURE_LMCE,\r
index 3712ef1e5cc9c5417491c08b3f0204a50a35a631..38d3f53f5646f5f37555c806f0f03c80606d242e 100644 (file)
@@ -1,35 +1,13 @@
 /** @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
@@ -54,11 +32,6 @@ VmxSupport (
   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
@@ -88,8 +61,6 @@ VmxInitialize (
   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
@@ -103,18 +74,15 @@ VmxInitialize (
     }\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
@@ -142,11 +110,6 @@ LockFeatureControlRegisterSupport (
   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
@@ -176,8 +139,6 @@ LockFeatureControlRegisterInitialize (
   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
@@ -191,18 +152,15 @@ LockFeatureControlRegisterInitialize (
     }\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
@@ -230,11 +188,6 @@ SmxSupport (
   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
@@ -265,7 +218,6 @@ SmxInitialize (
   IN BOOLEAN                           State\r
   )\r
 {\r
-  MSR_IA32_FEATURE_CONTROL_REGISTER    *MsrRegister;\r
   RETURN_STATUS                        Status;\r
 \r
   //\r
@@ -288,35 +240,32 @@ SmxInitialize (
     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
index 2528e0044ecbdfacbe1d315f1faaf5593c9f7dd4..844052b9a5867f61d5226552fc35422703a08b7a 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Machine Check features.\r
 \r
-  Copyright (c) 2017 - 2018, 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
@@ -319,8 +319,6 @@ LmceInitialize (
   IN BOOLEAN                           State\r
   )\r
 {\r
-  MSR_IA32_FEATURE_CONTROL_REGISTER    *MsrRegister;\r
-\r
   //\r
   // The scope of LcmeOn bit in the MSR_IA32_MISC_ENABLE is core for below processor type, only program\r
   // MSR_IA32_MISC_ENABLE for thread 0 in each core.\r
@@ -333,17 +331,14 @@ LmceInitialize (
     }\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.LmceOn,\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.LmceOn,\r
+    (State) ? 1 : 0\r
+    );\r
+\r
   return RETURN_SUCCESS;\r
 }\r