]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
UefiCpuPkg/RegisterCpuFeaturesLib: avoid use dynamic PCD.
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / RegisterCpuFeaturesLib.c
index 36aabd7267d0c278d4be32a24dc1a166cdc4e0c9..493566de5dea244501e07e4b405f47bb2b8bab4a 100644 (file)
@@ -8,46 +8,22 @@
 \r
 #include "RegisterCpuFeatures.h"\r
 \r
-/**\r
-  Checks if two CPU feature bit masks are equal.\r
-\r
-  @param[in]  FirstFeatureMask  The first input CPU feature bit mask\r
-  @param[in]  SecondFeatureMask The second input CPU feature bit mask\r
-\r
-  @retval TRUE  Two CPU feature bit masks are equal.\r
-  @retval FALSE Two CPU feature bit masks are not equal.\r
-**/\r
-BOOLEAN\r
-IsCpuFeatureMatch (\r
-  IN UINT8               *FirstFeatureMask,\r
-  IN UINT8               *SecondFeatureMask\r
-  )\r
-{\r
-  UINTN                 BitMaskSize;\r
-\r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
-  if (CompareMem (FirstFeatureMask, SecondFeatureMask, BitMaskSize) == 0) {\r
-    return TRUE;\r
-  } else {\r
-    return FALSE;\r
-  }\r
-}\r
-\r
 /**\r
   Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.\r
 \r
   @param[in]  FeatureMask  A pointer to the CPU feature bit mask.\r
+  @param[in]  BitMaskSize  CPU feature bits mask buffer size.\r
+\r
 **/\r
 VOID\r
 DumpCpuFeatureMask (\r
-  IN UINT8               *FeatureMask\r
+  IN UINT8               *FeatureMask,\r
+  IN UINT32              BitMaskSize\r
   )\r
 {\r
   UINTN                  Index;\r
   UINT8                  *Data8;\r
-  UINTN                  BitMaskSize;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
   Data8       = (UINT8 *) FeatureMask;\r
   for (Index = 0; Index < BitMaskSize; Index++) {\r
     DEBUG ((DEBUG_INFO, " %02x ", *Data8++));\r
@@ -59,10 +35,13 @@ DumpCpuFeatureMask (
   Dump CPU feature name or CPU feature bit mask.\r
 \r
   @param[in]  CpuFeature   Pointer to CPU_FEATURES_ENTRY\r
+  @param[in]  BitMaskSize  CPU feature bits mask buffer size.\r
+\r
 **/\r
 VOID\r
 DumpCpuFeature (\r
-  IN CPU_FEATURES_ENTRY  *CpuFeature\r
+  IN CPU_FEATURES_ENTRY  *CpuFeature,\r
+  IN UINT32              BitMaskSize\r
   )\r
 {\r
 \r
@@ -70,7 +49,7 @@ DumpCpuFeature (
     DEBUG ((DEBUG_INFO, "FeatureName: %a\n", CpuFeature->FeatureName));\r
   } else {\r
     DEBUG ((DEBUG_INFO, "FeatureMask = "));\r
-    DumpCpuFeatureMask (CpuFeature->FeatureMask);\r
+    DumpCpuFeatureMask (CpuFeature->FeatureMask, BitMaskSize);\r
   }\r
 }\r
 \r
@@ -89,16 +68,16 @@ IsBitMaskMatchCheck (
   IN UINT8        *DependentBitMask\r
   )\r
 {\r
-  UINTN      Index;\r
-  UINTN      BitMaskSize;\r
-  UINT8      *Data1;\r
-  UINT8      *Data2;\r
+  UINTN              Index;\r
+  UINT8              *Data1;\r
+  UINT8              *Data2;\r
+  CPU_FEATURES_DATA  *CpuFeaturesData;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
+  CpuFeaturesData = GetCpuFeaturesData ();\r
 \r
   Data1 = FeatureMask;\r
   Data2 = DependentBitMask;\r
-  for (Index = 0; Index < BitMaskSize; Index++) {\r
+  for (Index = 0; Index < CpuFeaturesData->BitMaskSize; Index++) {\r
     if (((*(Data1++)) & (*(Data2++))) != 0) {\r
       return TRUE;\r
     }\r
@@ -631,6 +610,7 @@ CheckCpuFeaturesDependency (
 /**\r
   Worker function to register CPU Feature.\r
 \r
+  @param[in]  CpuFeaturesData       Pointer to CPU feature data structure.\r
   @param[in]  CpuFeature            Pointer to CPU feature entry\r
 \r
   @retval  RETURN_SUCCESS           The CPU feature was successfully registered.\r
@@ -642,37 +622,21 @@ CheckCpuFeaturesDependency (
 **/\r
 RETURN_STATUS\r
 RegisterCpuFeatureWorker (\r
+  IN CPU_FEATURES_DATA       *CpuFeaturesData,\r
   IN CPU_FEATURES_ENTRY      *CpuFeature\r
   )\r
 {\r
   EFI_STATUS                 Status;\r
-  CPU_FEATURES_DATA          *CpuFeaturesData;\r
   CPU_FEATURES_ENTRY         *CpuFeatureEntry;\r
   LIST_ENTRY                 *Entry;\r
-  UINTN                      BitMaskSize;\r
   BOOLEAN                    FeatureExist;\r
 \r
-  BitMaskSize     = PcdGetSize (PcdCpuFeaturesSetting);\r
-  CpuFeaturesData = GetCpuFeaturesData ();\r
-  if (CpuFeaturesData->FeaturesCount == 0) {\r
-    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
-\r
   FeatureExist = FALSE;\r
   CpuFeatureEntry = NULL;\r
   Entry = GetFirstNode (&CpuFeaturesData->FeatureList);\r
   while (!IsNull (&CpuFeaturesData->FeatureList, Entry)) {\r
     CpuFeatureEntry = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
-    if (IsCpuFeatureMatch (CpuFeature->FeatureMask, CpuFeatureEntry->FeatureMask)) {\r
+    if (CompareMem (CpuFeature->FeatureMask, CpuFeatureEntry->FeatureMask, CpuFeaturesData->BitMaskSize) == 0) {\r
       //\r
       // If this feature already registered\r
       //\r
@@ -684,12 +648,12 @@ RegisterCpuFeatureWorker (
 \r
   if (!FeatureExist) {\r
     DEBUG ((DEBUG_INFO, "[NEW] "));\r
-    DumpCpuFeature (CpuFeature);\r
+    DumpCpuFeature (CpuFeature, CpuFeaturesData->BitMaskSize);\r
     InsertTailList (&CpuFeaturesData->FeatureList, &CpuFeature->Link);\r
     CpuFeaturesData->FeaturesCount++;\r
   } else {\r
     DEBUG ((DEBUG_INFO, "[OVERRIDE] "));\r
-    DumpCpuFeature (CpuFeature);\r
+    DumpCpuFeature (CpuFeature, CpuFeaturesData->BitMaskSize);\r
     ASSERT (CpuFeatureEntry != NULL);\r
     //\r
     // Overwrite original parameters of CPU feature\r
@@ -849,7 +813,6 @@ RegisterCpuFeature (
   EFI_STATUS                 Status;\r
   VA_LIST                    Marker;\r
   UINT32                     Feature;\r
-  UINTN                      BitMaskSize;\r
   CPU_FEATURES_ENTRY         *CpuFeature;\r
   UINT8                      *FeatureMask;\r
   UINT8                      *BeforeFeatureBitMask;\r
@@ -860,6 +823,7 @@ RegisterCpuFeature (
   UINT8                      *PackageAfterFeatureBitMask;\r
   BOOLEAN                    BeforeAll;\r
   BOOLEAN                    AfterAll;\r
+  CPU_FEATURES_DATA          *CpuFeaturesData;\r
 \r
   FeatureMask                 = NULL;\r
   BeforeFeatureBitMask        = NULL;\r
@@ -871,7 +835,18 @@ RegisterCpuFeature (
   BeforeAll            = FALSE;\r
   AfterAll             = FALSE;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
+  CpuFeaturesData = GetCpuFeaturesData ();\r
+  if (CpuFeaturesData->FeaturesCount == 0) {\r
+    InitializeListHead (&CpuFeaturesData->FeatureList);\r
+    InitializeSpinLock (&CpuFeaturesData->CpuFlags.MemoryMappedLock);\r
+    InitializeSpinLock (&CpuFeaturesData->CpuFlags.ConsoleLogLock);\r
+    //\r
+    // Code assumes below three PCDs have PCD same buffer size.\r
+    //\r
+    ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesCapability));\r
+    ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesSupport));\r
+    CpuFeaturesData->BitMaskSize = (UINT32) PcdGetSize (PcdCpuFeaturesSetting);\r
+  }\r
 \r
   VA_START (Marker, InitializeFunc);\r
   Feature = VA_ARG (Marker, UINT32);\r
@@ -889,19 +864,19 @@ RegisterCpuFeature (
       AfterAll  = ((Feature & CPU_FEATURE_AFTER_ALL) != 0) ? TRUE : FALSE;\r
       Feature  &= ~(CPU_FEATURE_BEFORE_ALL | CPU_FEATURE_AFTER_ALL);\r
       ASSERT (FeatureMask == NULL);\r
-      SetCpuFeaturesBitMask (&FeatureMask, Feature, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&FeatureMask, Feature, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_BEFORE) != 0) {\r
-      SetCpuFeaturesBitMask (&BeforeFeatureBitMask, Feature & ~CPU_FEATURE_BEFORE, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&BeforeFeatureBitMask, Feature & ~CPU_FEATURE_BEFORE, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_AFTER) != 0) {\r
-      SetCpuFeaturesBitMask (&AfterFeatureBitMask, Feature & ~CPU_FEATURE_AFTER, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&AfterFeatureBitMask, Feature & ~CPU_FEATURE_AFTER, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_CORE_BEFORE) != 0) {\r
-      SetCpuFeaturesBitMask (&CoreBeforeFeatureBitMask, Feature & ~CPU_FEATURE_CORE_BEFORE, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&CoreBeforeFeatureBitMask, Feature & ~CPU_FEATURE_CORE_BEFORE, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_CORE_AFTER) != 0) {\r
-      SetCpuFeaturesBitMask (&CoreAfterFeatureBitMask, Feature & ~CPU_FEATURE_CORE_AFTER, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&CoreAfterFeatureBitMask, Feature & ~CPU_FEATURE_CORE_AFTER, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_PACKAGE_BEFORE) != 0) {\r
-      SetCpuFeaturesBitMask (&PackageBeforeFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_BEFORE, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&PackageBeforeFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_BEFORE, CpuFeaturesData->BitMaskSize);\r
     } else if ((Feature & CPU_FEATURE_PACKAGE_AFTER) != 0) {\r
-      SetCpuFeaturesBitMask (&PackageAfterFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_AFTER, BitMaskSize);\r
+      SetCpuFeaturesBitMask (&PackageAfterFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_AFTER, CpuFeaturesData->BitMaskSize);\r
     }\r
     Feature = VA_ARG (Marker, UINT32);\r
   }\r
@@ -929,7 +904,7 @@ RegisterCpuFeature (
     ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
-  Status = RegisterCpuFeatureWorker (CpuFeature);\r
+  Status = RegisterCpuFeatureWorker (CpuFeaturesData, CpuFeature);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   return RETURN_SUCCESS;\r