}\r
}\r
\r
+/**\r
+ Worker function to clean bit operation on CPU feature supported bits mask buffer.\r
+\r
+ @param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
+ @param[in] AndFeatureBitMask The feature bit mask to do XOR operation\r
+**/\r
+VOID\r
+SupportedMaskCleanBit (\r
+ IN UINT8 *SupportedFeatureMask,\r
+ IN UINT8 *AndFeatureBitMask\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN BitMaskSize;\r
+ UINT8 *Data1;\r
+ UINT8 *Data2;\r
+\r
+ BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+ Data1 = SupportedFeatureMask;\r
+ Data2 = AndFeatureBitMask;\r
+ for (Index = 0; Index < BitMaskSize; Index++) {\r
+ *(Data1++) &= ~(*(Data2++));\r
+ }\r
+}\r
+\r
/**\r
Worker function to check if the compared CPU feature set in the CPU feature\r
supported bits mask buffer.\r
CpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
if (IsBitMaskMatch (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->SettingPcds)) {\r
Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData, TRUE);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Clean the CpuFeatureInOrder->FeatureMask in setting PCD.\r
+ //\r
+ SupportedMaskCleanBit (CpuFeaturesData->SettingPcds, CpuFeatureInOrder->FeatureMask);\r
+ if (CpuFeatureInOrder->FeatureName != NULL) {\r
+ DEBUG ((DEBUG_WARN, "Warning :: Failed to enable Feature Name = %a.\n", CpuFeatureInOrder->FeatureName));\r
+ } else {\r
+ DEBUG ((DEBUG_WARN, "Warning :: Failed to enable Feature Mask = "));\r
+ DumpCpuFeatureMask (CpuFeatureInOrder->FeatureMask);\r
+ }\r
+ }\r
} else {\r
Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData, FALSE);\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
- ASSERT_EFI_ERROR (Status);\r
Entry = Entry->ForwardLink;\r
}\r
+\r
+ //\r
+ // Dump PcdCpuFeaturesSetting again because this value maybe updated\r
+ // again during initialize the features.\r
+ //\r
+ DEBUG ((DEBUG_INFO, "Dump final value for PcdCpuFeaturesSetting:\n"));\r
+ DumpCpuFeatureMask (CpuFeaturesData->SettingPcds);\r
+\r
//\r
// Dump the RegisterTable\r
//\r