/**\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] CpuFeature Pointer to CPU feature.\r
+ @param[in] Before Check before dependence or after.\r
+ @param[in] NextCpuFeatureMask Pointer to next CPU feature Mask.\r
\r
@retval return the dependence result.\r
**/\r
CPU_FEATURE_DEPENDENCE_TYPE\r
DetectFeatureScope (\r
IN CPU_FEATURES_ENTRY *CpuFeature,\r
- IN BOOLEAN Before\r
+ IN BOOLEAN Before,\r
+ IN CHAR8 *NextCpuFeatureMask\r
)\r
{\r
+ //\r
+ // if need to check before type dependence but the feature after current feature is not\r
+ // exist, means this before type dependence not valid, just return NoneDepType.\r
+ // Just like Feature A has a dependence of feature B, but Feature B not installed, so\r
+ // Feature A maybe insert to the last entry of the list. In this case, for below code,\r
+ // Featrure A has depend of feature B, but it is the last entry of the list, so the\r
+ // NextCpuFeatureMask is NULL, so the dependence for feature A here is useless and code\r
+ // just return NoneDepType.\r
+ //\r
+ if (NextCpuFeatureMask == NULL) {\r
+ return NoneDepType;\r
+ }\r
+\r
if (Before) {\r
- if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
+ if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageBeforeFeatureBitMask)) {\r
return PackageDepType;\r
}\r
\r
- if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
+ if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreBeforeFeatureBitMask)) {\r
return CoreDepType;\r
}\r
\r
- if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
+ if ((CpuFeature->BeforeFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->BeforeFeatureBitMask)) {\r
return ThreadDepType;\r
}\r
\r
return NoneDepType;\r
}\r
\r
- if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
+ if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageAfterFeatureBitMask)) {\r
return PackageDepType;\r
}\r
\r
- if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
+ if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreAfterFeatureBitMask)) {\r
return CoreDepType;\r
}\r
\r
- if (CpuFeature->AfterFeatureBitMask != NULL) {\r
+ if ((CpuFeature->AfterFeatureBitMask != NULL) &&\r
+ IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->AfterFeatureBitMask)) {\r
return ThreadDepType;\r
}\r
\r
return NoneDepType;\r
}\r
\r
-/**\r
- Clear dependence for the specified type.\r
-\r
- @param[in] CpuFeature Cpu feature need to clear.\r
- @param[in] Before Before or after dependence relationship.\r
-\r
-**/\r
-VOID\r
-ClearFeatureScope (\r
- IN CPU_FEATURES_ENTRY *CpuFeature,\r
- IN BOOLEAN Before\r
- )\r
-{\r
- if (Before) {\r
- if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->BeforeFeatureBitMask);\r
- CpuFeature->BeforeFeatureBitMask = NULL;\r
- }\r
- if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->CoreBeforeFeatureBitMask);\r
- CpuFeature->CoreBeforeFeatureBitMask = NULL;\r
- }\r
- if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->PackageBeforeFeatureBitMask);\r
- CpuFeature->PackageBeforeFeatureBitMask = NULL;\r
- }\r
- } else {\r
- if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->PackageAfterFeatureBitMask);\r
- CpuFeature->PackageAfterFeatureBitMask = NULL;\r
- }\r
- if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->CoreAfterFeatureBitMask);\r
- CpuFeature->CoreAfterFeatureBitMask = NULL;\r
- }\r
- if (CpuFeature->AfterFeatureBitMask != NULL) {\r
- FreePool (CpuFeature->AfterFeatureBitMask);\r
- CpuFeature->AfterFeatureBitMask = NULL;\r
- }\r
- }\r
-}\r
-\r
/**\r
Base on dependence relationship to asjust feature dependence.\r
\r
\r
@param[in, out] PreviousFeature CPU feature current before the find one.\r
@param[in, out] CurrentFeature Cpu feature need to adjust.\r
+ @param[in] FindFeature Cpu feature which current feature depends.\r
@param[in] Before Before or after dependence relationship.\r
\r
@retval TRUE means the current feature dependence has been adjusted.\r
AdjustFeaturesDependence (\r
IN OUT CPU_FEATURES_ENTRY *PreviousFeature,\r
IN OUT CPU_FEATURES_ENTRY *CurrentFeature,\r
+ IN CPU_FEATURES_ENTRY *FindFeature,\r
IN BOOLEAN Before\r
)\r
{\r
CPU_FEATURE_DEPENDENCE_TYPE PreDependType;\r
CPU_FEATURE_DEPENDENCE_TYPE CurrentDependType;\r
\r
- PreDependType = DetectFeatureScope(PreviousFeature, Before);\r
- CurrentDependType = DetectFeatureScope(CurrentFeature, Before);\r
+ PreDependType = DetectFeatureScope(PreviousFeature, Before, FindFeature->FeatureMask);\r
+ CurrentDependType = DetectFeatureScope(CurrentFeature, Before, FindFeature->FeatureMask);\r
\r
//\r
// If previous feature has no dependence with the find featue.\r
// processors and clear the dependence for the other one.\r
//\r
if (PreDependType >= CurrentDependType) {\r
- ClearFeatureScope (CurrentFeature, Before);\r
return TRUE;\r
} else {\r
- ClearFeatureScope (PreviousFeature, Before);\r
return FALSE;\r
}\r
}\r
LIST_ENTRY *PreviousEntry;\r
CPU_FEATURES_ENTRY *PreviousFeature;\r
CPU_FEATURES_ENTRY *CurrentFeature;\r
+ CPU_FEATURES_ENTRY *FindFeature;\r
\r
//\r
// For CPU feature which has core or package type dependence, later code need to insert\r
// If exist the previous or next entry, need to check it before insert curent entry.\r
//\r
PreviousFeature = CPU_FEATURE_ENTRY_FROM_LINK (PreviousEntry);\r
+ FindFeature = CPU_FEATURE_ENTRY_FROM_LINK (FindEntry);\r
\r
- if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, Before)) {\r
+ if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, FindFeature, Before)) {\r
//\r
// Return TRUE means current feature dependence has been cleared and the previous\r
// feature dependence has been kept and used. So insert current feature before (or after)\r
if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->BeforeFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r
if (CpuFeature->AfterFeatureBitMask != NULL) {\r
Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->AfterFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r
if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->CoreBeforeFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r
if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->CoreAfterFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r
if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->PackageBeforeFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r
if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->PackageAfterFeatureBitMask);\r
if (Swapped) {\r
- CurrentEntry = NextEntry;\r
continue;\r
}\r
}\r