]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg RegisterCpuFeaturesLib: Add error handling code.
authorEric Dong <eric.dong@intel.com>
Tue, 11 Jul 2017 02:06:56 +0000 (10:06 +0800)
committerEric Dong <eric.dong@intel.com>
Wed, 12 Jul 2017 00:50:58 +0000 (08:50 +0800)
Add error handling code when initialize the CPU feature failed.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c

index 5e11b2b21cf3754dfa53bf9ac43c11a40f92316d..e91a4388b4ec70beeda2995174d6a47117754829 100644 (file)
@@ -234,6 +234,31 @@ SupportedMaskAnd (
   }\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
@@ -497,12 +522,32 @@ AnalysisProcessorFeatures (
       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