public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch] UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU feature style.
@ 2018-10-25  6:50 Eric Dong
  2018-10-26  4:16 ` Ni, Ruiyu
  0 siblings, 1 reply; 2+ messages in thread
From: Eric Dong @ 2018-10-25  6:50 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ruiyu Ni, Laszlo Ersek

Current code assume only one dependence (before or after) for one
feature. Enhance code logic to support feature has two dependence
(before and after) type.

Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
---
 .../RegisterCpuFeaturesLib/CpuFeaturesInitialize.c |  5 +-
 .../RegisterCpuFeaturesLib/RegisterCpuFeatures.h   |  8 +-
 .../RegisterCpuFeaturesLib.c                       | 99 ++++++++--------------
 3 files changed, 45 insertions(+), 67 deletions(-)

diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
index 173f2edbea..bc372a338f 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
@@ -671,10 +671,11 @@ AnalysisProcessorFeatures (
         // If feature has dependence with the next feature (ONLY care core/package dependency).
         // and feature initialize succeed, add sync semaphere here.
         //
-        BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE);
         if (NextCpuFeatureInOrder != NULL) {
-          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE);
+          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE, NextCpuFeatureInOrder->FeatureMask);
+          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE, CpuFeatureInOrder->FeatureMask);
         } else {
+          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE, NULL);
           AfterDep = NoneDepType;
         }
         //
diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
index 42a3f91fbf..b5fe8fbce1 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
@@ -193,15 +193,17 @@ DumpCpuFeature (
 /**
   Return feature dependence result.
 
-  @param[in]  CpuFeature        Pointer to CPU feature.
-  @param[in]  Before            Check before dependence or after.
+  @param[in]  CpuFeature            Pointer to CPU feature.
+  @param[in]  Before                Check before dependence or after.
+  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.
 
   @retval     return the dependence result.
 **/
 CPU_FEATURE_DEPENDENCE_TYPE
 DetectFeatureScope (
   IN CPU_FEATURES_ENTRY         *CpuFeature,
-  IN BOOLEAN                    Before
+  IN BOOLEAN                    Before,
+  IN CHAR8                      *NextCpuFeatureMask
   );
 
 /**
diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
index b6e108b8ad..9a66bc49ff 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
@@ -115,90 +115,69 @@ IsBitMaskMatchCheck (
 /**
   Return feature dependence result.
 
-  @param[in]  CpuFeature        Pointer to CPU feature.
-  @param[in]  Before            Check before dependence or after.
+  @param[in]  CpuFeature            Pointer to CPU feature.
+  @param[in]  Before                Check before dependence or after.
+  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.
 
   @retval     return the dependence result.
 **/
 CPU_FEATURE_DEPENDENCE_TYPE
 DetectFeatureScope (
   IN CPU_FEATURES_ENTRY         *CpuFeature,
-  IN BOOLEAN                    Before
+  IN BOOLEAN                    Before,
+  IN CHAR8                      *NextCpuFeatureMask
   )
 {
+  //
+  // if need to check before type dependence but the feature after current feature is not
+  // exist, means this before type dependence not valid, just return NoneDepType.
+  // Just like Feature A has a dependence of feature B, but Feature B not installed, so
+  // Feature A maybe insert to the last entry of the list. In this case, for below code,
+  // Featrure A has depend of feature B, but it is the last entry of the list, so the
+  // NextCpuFeatureMask is NULL, so the dependence for feature A here is useless and code
+  // just return NoneDepType.
+  //
+  if (NextCpuFeatureMask == NULL) {
+    return NoneDepType;
+  }
+
   if (Before) {
-    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
+    if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageBeforeFeatureBitMask)) {
       return PackageDepType;
     }
 
-    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
+    if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreBeforeFeatureBitMask)) {
       return CoreDepType;
     }
 
-    if (CpuFeature->BeforeFeatureBitMask != NULL) {
+    if ((CpuFeature->BeforeFeatureBitMask != NULL) &&
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->BeforeFeatureBitMask)) {
       return ThreadDepType;
     }
 
     return NoneDepType;
   }
 
-  if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
+  if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageAfterFeatureBitMask)) {
     return PackageDepType;
   }
 
-  if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
+  if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreAfterFeatureBitMask)) {
     return CoreDepType;
   }
 
-  if (CpuFeature->AfterFeatureBitMask != NULL) {
+  if ((CpuFeature->AfterFeatureBitMask != NULL) &&
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->AfterFeatureBitMask)) {
     return ThreadDepType;
   }
 
   return NoneDepType;
 }
 
-/**
-  Clear dependence for the specified type.
-
-  @param[in]  CpuFeature         Cpu feature need to clear.
-  @param[in]  Before             Before or after dependence relationship.
-
-**/
-VOID
-ClearFeatureScope (
-  IN CPU_FEATURES_ENTRY           *CpuFeature,
-  IN BOOLEAN                      Before
-  )
-{
-  if (Before) {
-    if (CpuFeature->BeforeFeatureBitMask != NULL) {
-      FreePool (CpuFeature->BeforeFeatureBitMask);
-      CpuFeature->BeforeFeatureBitMask = NULL;
-    }
-    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
-      FreePool (CpuFeature->CoreBeforeFeatureBitMask);
-      CpuFeature->CoreBeforeFeatureBitMask = NULL;
-    }
-    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
-      FreePool (CpuFeature->PackageBeforeFeatureBitMask);
-      CpuFeature->PackageBeforeFeatureBitMask = NULL;
-    }
-  } else {
-    if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
-      FreePool (CpuFeature->PackageAfterFeatureBitMask);
-      CpuFeature->PackageAfterFeatureBitMask = NULL;
-    }
-    if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
-      FreePool (CpuFeature->CoreAfterFeatureBitMask);
-      CpuFeature->CoreAfterFeatureBitMask = NULL;
-    }
-    if (CpuFeature->AfterFeatureBitMask != NULL) {
-      FreePool (CpuFeature->AfterFeatureBitMask);
-      CpuFeature->AfterFeatureBitMask = NULL;
-    }
-  }
-}
-
 /**
   Base on dependence relationship to asjust feature dependence.
 
@@ -209,6 +188,7 @@ ClearFeatureScope (
 
   @param[in, out]  PreviousFeature    CPU feature current before the find one.
   @param[in, out]  CurrentFeature     Cpu feature need to adjust.
+  @param[in]       FindFeature        Cpu feature which current feature depends.
   @param[in]       Before             Before or after dependence relationship.
 
   @retval   TRUE   means the current feature dependence has been adjusted.
@@ -221,14 +201,15 @@ BOOLEAN
 AdjustFeaturesDependence (
   IN OUT CPU_FEATURES_ENTRY         *PreviousFeature,
   IN OUT CPU_FEATURES_ENTRY         *CurrentFeature,
+  IN     CPU_FEATURES_ENTRY         *FindFeature,
   IN     BOOLEAN                    Before
   )
 {
   CPU_FEATURE_DEPENDENCE_TYPE            PreDependType;
   CPU_FEATURE_DEPENDENCE_TYPE            CurrentDependType;
 
-  PreDependType     = DetectFeatureScope(PreviousFeature, Before);
-  CurrentDependType = DetectFeatureScope(CurrentFeature, Before);
+  PreDependType     = DetectFeatureScope(PreviousFeature, Before, FindFeature->FeatureMask);
+  CurrentDependType = DetectFeatureScope(CurrentFeature, Before, FindFeature->FeatureMask);
 
   //
   // If previous feature has no dependence with the find featue.
@@ -243,10 +224,8 @@ AdjustFeaturesDependence (
   // processors and clear the dependence for the other one.
   //
   if (PreDependType >= CurrentDependType) {
-    ClearFeatureScope (CurrentFeature, Before);
     return TRUE;
   } else {
-    ClearFeatureScope (PreviousFeature, Before);
     return FALSE;
   }
 }
@@ -271,6 +250,7 @@ AdjustEntry (
   LIST_ENTRY                *PreviousEntry;
   CPU_FEATURES_ENTRY        *PreviousFeature;
   CPU_FEATURES_ENTRY        *CurrentFeature;
+  CPU_FEATURES_ENTRY        *FindFeature;
 
   //
   // For CPU feature which has core or package type dependence, later code need to insert
@@ -308,8 +288,9 @@ AdjustEntry (
     // If exist the previous or next entry, need to check it before insert curent entry.
     //
     PreviousFeature = CPU_FEATURE_ENTRY_FROM_LINK (PreviousEntry);
+    FindFeature     = CPU_FEATURE_ENTRY_FROM_LINK (FindEntry);
 
-    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, Before)) {
+    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, FindFeature, Before)) {
       //
       // Return TRUE means current feature dependence has been cleared and the previous
       // feature dependence has been kept and used. So insert current feature before (or after)
@@ -486,7 +467,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->BeforeFeatureBitMask != NULL) {
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->BeforeFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
@@ -494,7 +474,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->AfterFeatureBitMask != NULL) {
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->AfterFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
@@ -502,7 +481,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->CoreBeforeFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
@@ -510,7 +488,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->CoreAfterFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
@@ -518,7 +495,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->PackageBeforeFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
@@ -526,7 +502,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->PackageAfterFeatureBitMask);
       if (Swapped) {
-        CurrentEntry = NextEntry;
         continue;
       }
     }
-- 
2.15.0.windows.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Patch] UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU feature style.
  2018-10-25  6:50 [Patch] UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU feature style Eric Dong
@ 2018-10-26  4:16 ` Ni, Ruiyu
  0 siblings, 0 replies; 2+ messages in thread
From: Ni, Ruiyu @ 2018-10-26  4:16 UTC (permalink / raw)
  To: Dong, Eric, edk2-devel@lists.01.org; +Cc: Laszlo Ersek

Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>

> -----Original Message-----
> From: Dong, Eric
> Sent: Thursday, October 25, 2018 2:50 PM
> To: edk2-devel@lists.01.org
> Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>
> Subject: [Patch] UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU
> feature style.
> 
> Current code assume only one dependence (before or after) for one feature.
> Enhance code logic to support feature has two dependence (before and after)
> type.
> 
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> ---
>  .../RegisterCpuFeaturesLib/CpuFeaturesInitialize.c |  5 +-
>  .../RegisterCpuFeaturesLib/RegisterCpuFeatures.h   |  8 +-
>  .../RegisterCpuFeaturesLib.c                       | 99 ++++++++--------------
>  3 files changed, 45 insertions(+), 67 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> index 173f2edbea..bc372a338f 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
> @@ -671,10 +671,11 @@ AnalysisProcessorFeatures (
>          // If feature has dependence with the next feature (ONLY care
> core/package dependency).
>          // and feature initialize succeed, add sync semaphere here.
>          //
> -        BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE);
>          if (NextCpuFeatureInOrder != NULL) {
> -          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE);
> +          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE,
> NextCpuFeatureInOrder->FeatureMask);
> +          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE,
> + CpuFeatureInOrder->FeatureMask);
>          } else {
> +          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE,
> + NULL);
>            AfterDep = NoneDepType;
>          }
>          //
> diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> index 42a3f91fbf..b5fe8fbce1 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
> @@ -193,15 +193,17 @@ DumpCpuFeature (
>  /**
>    Return feature dependence result.
> 
> -  @param[in]  CpuFeature        Pointer to CPU feature.
> -  @param[in]  Before            Check before dependence or after.
> +  @param[in]  CpuFeature            Pointer to CPU feature.
> +  @param[in]  Before                Check before dependence or after.
> +  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.
> 
>    @retval     return the dependence result.
>  **/
>  CPU_FEATURE_DEPENDENCE_TYPE
>  DetectFeatureScope (
>    IN CPU_FEATURES_ENTRY         *CpuFeature,
> -  IN BOOLEAN                    Before
> +  IN BOOLEAN                    Before,
> +  IN CHAR8                      *NextCpuFeatureMask
>    );
> 
>  /**
> diff --git
> a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> index b6e108b8ad..9a66bc49ff 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> @@ -115,90 +115,69 @@ IsBitMaskMatchCheck (
>  /**
>    Return feature dependence result.
> 
> -  @param[in]  CpuFeature        Pointer to CPU feature.
> -  @param[in]  Before            Check before dependence or after.
> +  @param[in]  CpuFeature            Pointer to CPU feature.
> +  @param[in]  Before                Check before dependence or after.
> +  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.
> 
>    @retval     return the dependence result.
>  **/
>  CPU_FEATURE_DEPENDENCE_TYPE
>  DetectFeatureScope (
>    IN CPU_FEATURES_ENTRY         *CpuFeature,
> -  IN BOOLEAN                    Before
> +  IN BOOLEAN                    Before,
> +  IN CHAR8                      *NextCpuFeatureMask
>    )
>  {
> +  //
> +  // if need to check before type dependence but the feature after
> + current feature is not  // exist, means this before type dependence not valid,
> just return NoneDepType.
> +  // Just like Feature A has a dependence of feature B, but Feature B
> + not installed, so  // Feature A maybe insert to the last entry of the
> + list. In this case, for below code,  // Featrure A has depend of
> + feature B, but it is the last entry of the list, so the  //
> + NextCpuFeatureMask is NULL, so the dependence for feature A here is useless
> and code  // just return NoneDepType.
> +  //
> +  if (NextCpuFeatureMask == NULL) {
> +    return NoneDepType;
> +  }
> +
>    if (Before) {
> -    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
> +    if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&
> +        IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->PackageBeforeFeatureBitMask)) {
>        return PackageDepType;
>      }
> 
> -    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
> +    if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&
> +        IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->CoreBeforeFeatureBitMask)) {
>        return CoreDepType;
>      }
> 
> -    if (CpuFeature->BeforeFeatureBitMask != NULL) {
> +    if ((CpuFeature->BeforeFeatureBitMask != NULL) &&
> +        IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->BeforeFeatureBitMask)) {
>        return ThreadDepType;
>      }
> 
>      return NoneDepType;
>    }
> 
> -  if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
> +  if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&
> +      IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->PackageAfterFeatureBitMask)) {
>      return PackageDepType;
>    }
> 
> -  if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
> +  if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&
> +      IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->CoreAfterFeatureBitMask)) {
>      return CoreDepType;
>    }
> 
> -  if (CpuFeature->AfterFeatureBitMask != NULL) {
> +  if ((CpuFeature->AfterFeatureBitMask != NULL) &&
> +      IsBitMaskMatchCheck (NextCpuFeatureMask,
> + CpuFeature->AfterFeatureBitMask)) {
>      return ThreadDepType;
>    }
> 
>    return NoneDepType;
>  }
> 
> -/**
> -  Clear dependence for the specified type.
> -
> -  @param[in]  CpuFeature         Cpu feature need to clear.
> -  @param[in]  Before             Before or after dependence relationship.
> -
> -**/
> -VOID
> -ClearFeatureScope (
> -  IN CPU_FEATURES_ENTRY           *CpuFeature,
> -  IN BOOLEAN                      Before
> -  )
> -{
> -  if (Before) {
> -    if (CpuFeature->BeforeFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->BeforeFeatureBitMask);
> -      CpuFeature->BeforeFeatureBitMask = NULL;
> -    }
> -    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->CoreBeforeFeatureBitMask);
> -      CpuFeature->CoreBeforeFeatureBitMask = NULL;
> -    }
> -    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->PackageBeforeFeatureBitMask);
> -      CpuFeature->PackageBeforeFeatureBitMask = NULL;
> -    }
> -  } else {
> -    if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->PackageAfterFeatureBitMask);
> -      CpuFeature->PackageAfterFeatureBitMask = NULL;
> -    }
> -    if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->CoreAfterFeatureBitMask);
> -      CpuFeature->CoreAfterFeatureBitMask = NULL;
> -    }
> -    if (CpuFeature->AfterFeatureBitMask != NULL) {
> -      FreePool (CpuFeature->AfterFeatureBitMask);
> -      CpuFeature->AfterFeatureBitMask = NULL;
> -    }
> -  }
> -}
> -
>  /**
>    Base on dependence relationship to asjust feature dependence.
> 
> @@ -209,6 +188,7 @@ ClearFeatureScope (
> 
>    @param[in, out]  PreviousFeature    CPU feature current before the find one.
>    @param[in, out]  CurrentFeature     Cpu feature need to adjust.
> +  @param[in]       FindFeature        Cpu feature which current feature depends.
>    @param[in]       Before             Before or after dependence relationship.
> 
>    @retval   TRUE   means the current feature dependence has been adjusted.
> @@ -221,14 +201,15 @@ BOOLEAN
>  AdjustFeaturesDependence (
>    IN OUT CPU_FEATURES_ENTRY         *PreviousFeature,
>    IN OUT CPU_FEATURES_ENTRY         *CurrentFeature,
> +  IN     CPU_FEATURES_ENTRY         *FindFeature,
>    IN     BOOLEAN                    Before
>    )
>  {
>    CPU_FEATURE_DEPENDENCE_TYPE            PreDependType;
>    CPU_FEATURE_DEPENDENCE_TYPE            CurrentDependType;
> 
> -  PreDependType     = DetectFeatureScope(PreviousFeature, Before);
> -  CurrentDependType = DetectFeatureScope(CurrentFeature, Before);
> +  PreDependType     = DetectFeatureScope(PreviousFeature, Before,
> FindFeature->FeatureMask);
> +  CurrentDependType = DetectFeatureScope(CurrentFeature, Before,
> + FindFeature->FeatureMask);
> 
>    //
>    // If previous feature has no dependence with the find featue.
> @@ -243,10 +224,8 @@ AdjustFeaturesDependence (
>    // processors and clear the dependence for the other one.
>    //
>    if (PreDependType >= CurrentDependType) {
> -    ClearFeatureScope (CurrentFeature, Before);
>      return TRUE;
>    } else {
> -    ClearFeatureScope (PreviousFeature, Before);
>      return FALSE;
>    }
>  }
> @@ -271,6 +250,7 @@ AdjustEntry (
>    LIST_ENTRY                *PreviousEntry;
>    CPU_FEATURES_ENTRY        *PreviousFeature;
>    CPU_FEATURES_ENTRY        *CurrentFeature;
> +  CPU_FEATURES_ENTRY        *FindFeature;
> 
>    //
>    // For CPU feature which has core or package type dependence, later code
> need to insert @@ -308,8 +288,9 @@ AdjustEntry (
>      // If exist the previous or next entry, need to check it before insert curent
> entry.
>      //
>      PreviousFeature = CPU_FEATURE_ENTRY_FROM_LINK (PreviousEntry);
> +    FindFeature     = CPU_FEATURE_ENTRY_FROM_LINK (FindEntry);
> 
> -    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, Before)) {
> +    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature,
> + FindFeature, Before)) {
>        //
>        // Return TRUE means current feature dependence has been cleared and the
> previous
>        // feature dependence has been kept and used. So insert current feature
> before (or after) @@ -486,7 +467,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->BeforeFeatureBitMask != NULL) {
>        Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature-
> >BeforeFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> @@ -494,7 +474,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->AfterFeatureBitMask != NULL) {
>        Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature-
> >AfterFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> @@ -502,7 +481,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {
>        Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature-
> >CoreBeforeFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> @@ -510,7 +488,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->CoreAfterFeatureBitMask != NULL) {
>        Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature-
> >CoreAfterFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> @@ -518,7 +495,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {
>        Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature-
> >PackageBeforeFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> @@ -526,7 +502,6 @@ CheckCpuFeaturesDependency (
>      if (CpuFeature->PackageAfterFeatureBitMask != NULL) {
>        Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature-
> >PackageAfterFeatureBitMask);
>        if (Swapped) {
> -        CurrentEntry = NextEntry;
>          continue;
>        }
>      }
> --
> 2.15.0.windows.1



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-10-26  4:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-25  6:50 [Patch] UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU feature style Eric Dong
2018-10-26  4:16 ` Ni, Ruiyu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox