UefiCpuPkg/RegisterCpuFeaturesLib: avoid use dynamic PCD.
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1972 Function in this library may be used by APs. Assert will be trig if AP uses dynamic pcd. This patch enhance the current code, remove the unnecessary usage of dynamic PCD. This change try to avoid report this issue again later. 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>
This commit is contained in:
@@ -8,46 +8,22 @@
|
||||
|
||||
#include "RegisterCpuFeatures.h"
|
||||
|
||||
/**
|
||||
Checks if two CPU feature bit masks are equal.
|
||||
|
||||
@param[in] FirstFeatureMask The first input CPU feature bit mask
|
||||
@param[in] SecondFeatureMask The second input CPU feature bit mask
|
||||
|
||||
@retval TRUE Two CPU feature bit masks are equal.
|
||||
@retval FALSE Two CPU feature bit masks are not equal.
|
||||
**/
|
||||
BOOLEAN
|
||||
IsCpuFeatureMatch (
|
||||
IN UINT8 *FirstFeatureMask,
|
||||
IN UINT8 *SecondFeatureMask
|
||||
)
|
||||
{
|
||||
UINTN BitMaskSize;
|
||||
|
||||
BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);
|
||||
if (CompareMem (FirstFeatureMask, SecondFeatureMask, BitMaskSize) == 0) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Function that uses DEBUG() macros to display the contents of a a CPU feature bit mask.
|
||||
|
||||
@param[in] FeatureMask A pointer to the CPU feature bit mask.
|
||||
@param[in] BitMaskSize CPU feature bits mask buffer size.
|
||||
|
||||
**/
|
||||
VOID
|
||||
DumpCpuFeatureMask (
|
||||
IN UINT8 *FeatureMask
|
||||
IN UINT8 *FeatureMask,
|
||||
IN UINT32 BitMaskSize
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINT8 *Data8;
|
||||
UINTN BitMaskSize;
|
||||
|
||||
BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);
|
||||
Data8 = (UINT8 *) FeatureMask;
|
||||
for (Index = 0; Index < BitMaskSize; Index++) {
|
||||
DEBUG ((DEBUG_INFO, " %02x ", *Data8++));
|
||||
@@ -59,10 +35,13 @@ DumpCpuFeatureMask (
|
||||
Dump CPU feature name or CPU feature bit mask.
|
||||
|
||||
@param[in] CpuFeature Pointer to CPU_FEATURES_ENTRY
|
||||
@param[in] BitMaskSize CPU feature bits mask buffer size.
|
||||
|
||||
**/
|
||||
VOID
|
||||
DumpCpuFeature (
|
||||
IN CPU_FEATURES_ENTRY *CpuFeature
|
||||
IN CPU_FEATURES_ENTRY *CpuFeature,
|
||||
IN UINT32 BitMaskSize
|
||||
)
|
||||
{
|
||||
|
||||
@@ -70,7 +49,7 @@ DumpCpuFeature (
|
||||
DEBUG ((DEBUG_INFO, "FeatureName: %a\n", CpuFeature->FeatureName));
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO, "FeatureMask = "));
|
||||
DumpCpuFeatureMask (CpuFeature->FeatureMask);
|
||||
DumpCpuFeatureMask (CpuFeature->FeatureMask, BitMaskSize);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,16 +68,16 @@ IsBitMaskMatchCheck (
|
||||
IN UINT8 *DependentBitMask
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN BitMaskSize;
|
||||
UINT8 *Data1;
|
||||
UINT8 *Data2;
|
||||
UINTN Index;
|
||||
UINT8 *Data1;
|
||||
UINT8 *Data2;
|
||||
CPU_FEATURES_DATA *CpuFeaturesData;
|
||||
|
||||
BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);
|
||||
CpuFeaturesData = GetCpuFeaturesData ();
|
||||
|
||||
Data1 = FeatureMask;
|
||||
Data2 = DependentBitMask;
|
||||
for (Index = 0; Index < BitMaskSize; Index++) {
|
||||
for (Index = 0; Index < CpuFeaturesData->BitMaskSize; Index++) {
|
||||
if (((*(Data1++)) & (*(Data2++))) != 0) {
|
||||
return TRUE;
|
||||
}
|
||||
@@ -631,6 +610,7 @@ CheckCpuFeaturesDependency (
|
||||
/**
|
||||
Worker function to register CPU Feature.
|
||||
|
||||
@param[in] CpuFeaturesData Pointer to CPU feature data structure.
|
||||
@param[in] CpuFeature Pointer to CPU feature entry
|
||||
|
||||
@retval RETURN_SUCCESS The CPU feature was successfully registered.
|
||||
@@ -642,37 +622,21 @@ CheckCpuFeaturesDependency (
|
||||
**/
|
||||
RETURN_STATUS
|
||||
RegisterCpuFeatureWorker (
|
||||
IN CPU_FEATURES_DATA *CpuFeaturesData,
|
||||
IN CPU_FEATURES_ENTRY *CpuFeature
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CPU_FEATURES_DATA *CpuFeaturesData;
|
||||
CPU_FEATURES_ENTRY *CpuFeatureEntry;
|
||||
LIST_ENTRY *Entry;
|
||||
UINTN BitMaskSize;
|
||||
BOOLEAN FeatureExist;
|
||||
|
||||
BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);
|
||||
CpuFeaturesData = GetCpuFeaturesData ();
|
||||
if (CpuFeaturesData->FeaturesCount == 0) {
|
||||
InitializeListHead (&CpuFeaturesData->FeatureList);
|
||||
InitializeSpinLock (&CpuFeaturesData->CpuFlags.MemoryMappedLock);
|
||||
InitializeSpinLock (&CpuFeaturesData->CpuFlags.ConsoleLogLock);
|
||||
//
|
||||
// Driver has assumption that these three PCD should has same buffer size.
|
||||
//
|
||||
ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesCapability));
|
||||
ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesSupport));
|
||||
CpuFeaturesData->BitMaskSize = (UINT32) BitMaskSize;
|
||||
}
|
||||
ASSERT (CpuFeaturesData->BitMaskSize == BitMaskSize);
|
||||
|
||||
FeatureExist = FALSE;
|
||||
CpuFeatureEntry = NULL;
|
||||
Entry = GetFirstNode (&CpuFeaturesData->FeatureList);
|
||||
while (!IsNull (&CpuFeaturesData->FeatureList, Entry)) {
|
||||
CpuFeatureEntry = CPU_FEATURE_ENTRY_FROM_LINK (Entry);
|
||||
if (IsCpuFeatureMatch (CpuFeature->FeatureMask, CpuFeatureEntry->FeatureMask)) {
|
||||
if (CompareMem (CpuFeature->FeatureMask, CpuFeatureEntry->FeatureMask, CpuFeaturesData->BitMaskSize) == 0) {
|
||||
//
|
||||
// If this feature already registered
|
||||
//
|
||||
@@ -684,12 +648,12 @@ RegisterCpuFeatureWorker (
|
||||
|
||||
if (!FeatureExist) {
|
||||
DEBUG ((DEBUG_INFO, "[NEW] "));
|
||||
DumpCpuFeature (CpuFeature);
|
||||
DumpCpuFeature (CpuFeature, CpuFeaturesData->BitMaskSize);
|
||||
InsertTailList (&CpuFeaturesData->FeatureList, &CpuFeature->Link);
|
||||
CpuFeaturesData->FeaturesCount++;
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO, "[OVERRIDE] "));
|
||||
DumpCpuFeature (CpuFeature);
|
||||
DumpCpuFeature (CpuFeature, CpuFeaturesData->BitMaskSize);
|
||||
ASSERT (CpuFeatureEntry != NULL);
|
||||
//
|
||||
// Overwrite original parameters of CPU feature
|
||||
@@ -849,7 +813,6 @@ RegisterCpuFeature (
|
||||
EFI_STATUS Status;
|
||||
VA_LIST Marker;
|
||||
UINT32 Feature;
|
||||
UINTN BitMaskSize;
|
||||
CPU_FEATURES_ENTRY *CpuFeature;
|
||||
UINT8 *FeatureMask;
|
||||
UINT8 *BeforeFeatureBitMask;
|
||||
@@ -860,6 +823,7 @@ RegisterCpuFeature (
|
||||
UINT8 *PackageAfterFeatureBitMask;
|
||||
BOOLEAN BeforeAll;
|
||||
BOOLEAN AfterAll;
|
||||
CPU_FEATURES_DATA *CpuFeaturesData;
|
||||
|
||||
FeatureMask = NULL;
|
||||
BeforeFeatureBitMask = NULL;
|
||||
@@ -871,7 +835,18 @@ RegisterCpuFeature (
|
||||
BeforeAll = FALSE;
|
||||
AfterAll = FALSE;
|
||||
|
||||
BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);
|
||||
CpuFeaturesData = GetCpuFeaturesData ();
|
||||
if (CpuFeaturesData->FeaturesCount == 0) {
|
||||
InitializeListHead (&CpuFeaturesData->FeatureList);
|
||||
InitializeSpinLock (&CpuFeaturesData->CpuFlags.MemoryMappedLock);
|
||||
InitializeSpinLock (&CpuFeaturesData->CpuFlags.ConsoleLogLock);
|
||||
//
|
||||
// Code assumes below three PCDs have PCD same buffer size.
|
||||
//
|
||||
ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesCapability));
|
||||
ASSERT (PcdGetSize (PcdCpuFeaturesSetting) == PcdGetSize (PcdCpuFeaturesSupport));
|
||||
CpuFeaturesData->BitMaskSize = (UINT32) PcdGetSize (PcdCpuFeaturesSetting);
|
||||
}
|
||||
|
||||
VA_START (Marker, InitializeFunc);
|
||||
Feature = VA_ARG (Marker, UINT32);
|
||||
@@ -889,19 +864,19 @@ RegisterCpuFeature (
|
||||
AfterAll = ((Feature & CPU_FEATURE_AFTER_ALL) != 0) ? TRUE : FALSE;
|
||||
Feature &= ~(CPU_FEATURE_BEFORE_ALL | CPU_FEATURE_AFTER_ALL);
|
||||
ASSERT (FeatureMask == NULL);
|
||||
SetCpuFeaturesBitMask (&FeatureMask, Feature, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&FeatureMask, Feature, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_BEFORE) != 0) {
|
||||
SetCpuFeaturesBitMask (&BeforeFeatureBitMask, Feature & ~CPU_FEATURE_BEFORE, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&BeforeFeatureBitMask, Feature & ~CPU_FEATURE_BEFORE, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_AFTER) != 0) {
|
||||
SetCpuFeaturesBitMask (&AfterFeatureBitMask, Feature & ~CPU_FEATURE_AFTER, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&AfterFeatureBitMask, Feature & ~CPU_FEATURE_AFTER, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_CORE_BEFORE) != 0) {
|
||||
SetCpuFeaturesBitMask (&CoreBeforeFeatureBitMask, Feature & ~CPU_FEATURE_CORE_BEFORE, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&CoreBeforeFeatureBitMask, Feature & ~CPU_FEATURE_CORE_BEFORE, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_CORE_AFTER) != 0) {
|
||||
SetCpuFeaturesBitMask (&CoreAfterFeatureBitMask, Feature & ~CPU_FEATURE_CORE_AFTER, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&CoreAfterFeatureBitMask, Feature & ~CPU_FEATURE_CORE_AFTER, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_PACKAGE_BEFORE) != 0) {
|
||||
SetCpuFeaturesBitMask (&PackageBeforeFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_BEFORE, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&PackageBeforeFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_BEFORE, CpuFeaturesData->BitMaskSize);
|
||||
} else if ((Feature & CPU_FEATURE_PACKAGE_AFTER) != 0) {
|
||||
SetCpuFeaturesBitMask (&PackageAfterFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_AFTER, BitMaskSize);
|
||||
SetCpuFeaturesBitMask (&PackageAfterFeatureBitMask, Feature & ~CPU_FEATURE_PACKAGE_AFTER, CpuFeaturesData->BitMaskSize);
|
||||
}
|
||||
Feature = VA_ARG (Marker, UINT32);
|
||||
}
|
||||
@@ -929,7 +904,7 @@ RegisterCpuFeature (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
Status = RegisterCpuFeatureWorker (CpuFeature);
|
||||
Status = RegisterCpuFeatureWorker (CpuFeaturesData, CpuFeature);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
|
Reference in New Issue
Block a user