]> xenbits.xensource.com Git - people/aperard/ovmf.git/commitdiff
UefiCpuPkg/RegisterCpuFeaturesLib: Avoid AP calls PeiServices table.
authorEric Dong <eric.dong@intel.com>
Thu, 11 Jul 2019 11:56:25 +0000 (19:56 +0800)
committerEric Dong <eric.dong@intel.com>
Thu, 18 Jul 2019 00:22:19 +0000 (08:22 +0800)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1972

AP calls CollectProcessorData() to collect processor info.
CollectProcessorData function finally calls PcdGetSize function to
get DynamicPCD PcdCpuFeaturesSetting value. PcdGetSize will use
PeiServices table which caused below assert info:
Processor Info: Package: 1, MaxCore : 4, MaxThread: 1
Package: 0, Valid Core : 4
ASSERT [CpuFeaturesPei] c:\projects\jsl\jsl_v1193\Edk2\MdePkg\Library
\PeiServicesTablePointerLibIdt\PeiServicesTablePointer.c(48):
PeiServices != ((void *) 0)

This change uses saved global pcd size instead of calls PcdGetSize to
fix this issue.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Chandana Kumar <chandana.c.kumar@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c

index 1746f4f07f7be865c5deb31f6b4635808f47a4c8..1e25ba8b3288cfa9d32ea93cf05b2e26f2978f93 100644 (file)
@@ -246,19 +246,20 @@ CpuInitDataInitialize (
 \r
   @param[in]  SupportedFeatureMask  The pointer to CPU feature bits mask buffer\r
   @param[in]  OrFeatureBitMask      The feature bit mask to do OR operation\r
+  @param[in]  BitMaskSize           The CPU feature bits mask buffer size.\r
+\r
 **/\r
 VOID\r
 SupportedMaskOr (\r
   IN UINT8               *SupportedFeatureMask,\r
-  IN UINT8               *OrFeatureBitMask\r
+  IN UINT8               *OrFeatureBitMask,\r
+  IN UINT32              BitMaskSize\r
   )\r
 {\r
   UINTN                  Index;\r
-  UINTN                  BitMaskSize;\r
   UINT8                  *Data1;\r
   UINT8                  *Data2;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
   Data1 = SupportedFeatureMask;\r
   Data2 = OrFeatureBitMask;\r
   for (Index = 0; Index < BitMaskSize; Index++) {\r
@@ -384,12 +385,14 @@ CollectProcessorData (
       //\r
       SupportedMaskOr (\r
         CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
-        CpuFeature->FeatureMask\r
+        CpuFeature->FeatureMask,\r
+        CpuFeaturesData->BitMaskSize\r
         );\r
     } else if (CpuFeature->SupportFunc (ProcessorNumber, CpuInfo, CpuFeature->ConfigData)) {\r
       SupportedMaskOr (\r
         CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
-        CpuFeature->FeatureMask\r
+        CpuFeature->FeatureMask,\r
+        CpuFeaturesData->BitMaskSize\r
         );\r
     }\r
     Entry = Entry->ForwardLink;\r
index fa0f0b41e26bdff055db5bd0affd6b56bd3cee3d..36aabd7267d0c278d4be32a24dc1a166cdc4e0c9 100644 (file)
@@ -658,6 +658,11 @@ RegisterCpuFeatureWorker (
     InitializeListHead (&CpuFeaturesData->FeatureList);\r
     InitializeSpinLock (&CpuFeaturesData->CpuFlags.MemoryMappedLock);\r
     InitializeSpinLock (&CpuFeaturesData->CpuFlags.ConsoleLogLock);\r
+    //\r
+    // Driver has assumption that these three PCD should has same buffer size.\r
+    //\r
+    ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesCapability));\r
+    ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesSupport));\r
     CpuFeaturesData->BitMaskSize = (UINT32) BitMaskSize;\r
   }\r
   ASSERT (CpuFeaturesData->BitMaskSize == BitMaskSize);\r