]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
UefiCpuPkg/RegisterCpuFeaturesLib: Adjust Order.
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / RegisterCpuFeaturesLib.c
index 394695baf2091b52db950c746390ae2ffb4672bf..ed8d526325b0daad599a1592f33c01f02efb1750 100644 (file)
@@ -112,6 +112,75 @@ IsBitMaskMatchCheck (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Try to find the specify cpu featuren in former/after feature list.\r
+\r
+  @param[in]  FeatureList        Pointer to dependent CPU feature list\r
+  @param[in]  CurrentEntry       Pointer to current CPU feature entry.\r
+  @param[in]  SearchFormer       Find in former feature or after features.\r
+  @param[in]  FeatureMask        Pointer to CPU feature bit mask\r
+\r
+  @retval TRUE  The feature bit mask is in dependent CPU feature bit mask buffer.\r
+  @retval FALSE The feature bit mask is not in dependent CPU feature bit mask buffer.\r
+**/\r
+BOOLEAN\r
+FindSpecifyFeature (\r
+  IN LIST_ENTRY              *FeatureList,\r
+  IN LIST_ENTRY              *CurrentEntry,\r
+  IN BOOLEAN                 SearchFormer,\r
+  IN UINT8                   *FeatureMask\r
+  )\r
+{\r
+  CPU_FEATURES_ENTRY         *CpuFeature;\r
+  LIST_ENTRY                 *NextEntry;\r
+\r
+  //\r
+  // Check whether exist the not neighborhood entry first.\r
+  // If not exist, return FALSE means not found status.\r
+  //\r
+  if (SearchFormer) {\r
+    NextEntry = CurrentEntry->BackLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = NextEntry->BackLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = CurrentEntry->BackLink->BackLink;\r
+  } else {\r
+    NextEntry = CurrentEntry->ForwardLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = NextEntry->ForwardLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = CurrentEntry->ForwardLink->ForwardLink;\r
+  }\r
+\r
+  while (!IsNull (FeatureList, NextEntry)) {\r
+    CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (NextEntry);\r
+\r
+    if (IsBitMaskMatchCheck (FeatureMask, CpuFeature->FeatureMask)) {\r
+      return TRUE;\r
+    }\r
+\r
+    if (SearchFormer) {\r
+      NextEntry = NextEntry->BackLink;\r
+    } else {\r
+      NextEntry = NextEntry->ForwardLink;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Return feature dependence result.\r
 \r
@@ -178,6 +247,59 @@ DetectFeatureScope (
   return NoneDepType;\r
 }\r
 \r
+/**\r
+  Return feature dependence result.\r
+\r
+  @param[in]  CpuFeature            Pointer to CPU feature.\r
+  @param[in]  Before                Check before dependence or after.\r
+  @param[in]  FeatureList           Pointer to CPU feature list.\r
+\r
+  @retval     return the dependence result.\r
+**/\r
+CPU_FEATURE_DEPENDENCE_TYPE\r
+DetectNoneNeighborhoodFeatureScope (\r
+  IN CPU_FEATURES_ENTRY         *CpuFeature,\r
+  IN BOOLEAN                    Before,\r
+  IN LIST_ENTRY                 *FeatureList\r
+  )\r
+{\r
+  if (Before) {\r
+    if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->PackageBeforeFeatureBitMask)) {\r
+      return PackageDepType;\r
+    }\r
+\r
+    if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->CoreBeforeFeatureBitMask)) {\r
+      return CoreDepType;\r
+    }\r
+\r
+    if ((CpuFeature->BeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->BeforeFeatureBitMask)) {\r
+      return ThreadDepType;\r
+    }\r
+\r
+    return NoneDepType;\r
+  }\r
+\r
+  if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->PackageAfterFeatureBitMask)) {\r
+    return PackageDepType;\r
+  }\r
+\r
+  if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->CoreAfterFeatureBitMask)) {\r
+    return CoreDepType;\r
+  }\r
+\r
+  if ((CpuFeature->AfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->AfterFeatureBitMask)) {\r
+    return ThreadDepType;\r
+  }\r
+\r
+  return NoneDepType;\r
+}\r
+\r
 /**\r
   Base on dependence relationship to asjust feature dependence.\r
 \r