]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Remove CPU information from CPU_AP_DATA
authorJeff Fan <jeff.fan@intel.com>
Mon, 14 Nov 2016 02:49:51 +0000 (10:49 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 16 Nov 2016 08:28:02 +0000 (16:28 +0800)
Some CPU information (InitialApicId/ApicId/Health) are duplicated in CPU_AP_DATA
and CPU_INFO_IN_HOB.

This update is to remove the ones from CPU_AP_DATA and update MpInitLib to
consume the ones from CPU_INFO_IN_HOB.

V2:
  Fixed potential un-initialized variable issue.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
UefiCpuPkg/Library/MpInitLib/MpLib.c
UefiCpuPkg/Library/MpInitLib/MpLib.h

index 9641e5e82c200f8f14154f17d258805730e9fcf7..529df60ce6f680c69a871485379512956233eb46 100644 (file)
@@ -253,33 +253,33 @@ SortApicId (
   UINTN             Index2;\r
   UINTN             Index3;\r
   UINT32            ApicId;\r
-  CPU_AP_DATA       CpuData;\r
+  CPU_INFO_IN_HOB   CpuInfo;\r
   UINT32            ApCount;\r
   CPU_INFO_IN_HOB   *CpuInfoInHob;\r
 \r
   ApCount = CpuMpData->CpuCount - 1;\r
-\r
+  CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
   if (ApCount != 0) {\r
     for (Index1 = 0; Index1 < ApCount; Index1++) {\r
       Index3 = Index1;\r
       //\r
       // Sort key is the hardware default APIC ID\r
       //\r
-      ApicId = CpuMpData->CpuData[Index1].ApicId;\r
+      ApicId = CpuInfoInHob[Index1].ApicId;\r
       for (Index2 = Index1 + 1; Index2 <= ApCount; Index2++) {\r
-        if (ApicId > CpuMpData->CpuData[Index2].ApicId) {\r
+        if (ApicId > CpuInfoInHob[Index2].ApicId) {\r
           Index3 = Index2;\r
-          ApicId = CpuMpData->CpuData[Index2].ApicId;\r
+          ApicId = CpuInfoInHob[Index2].ApicId;\r
         }\r
       }\r
       if (Index3 != Index1) {\r
-        CopyMem (&CpuData, &CpuMpData->CpuData[Index3], sizeof (CPU_AP_DATA));\r
+        CopyMem (&CpuInfo, &CpuInfoInHob[Index3], sizeof (CPU_INFO_IN_HOB));\r
         CopyMem (\r
-          &CpuMpData->CpuData[Index3],\r
-          &CpuMpData->CpuData[Index1],\r
-          sizeof (CPU_AP_DATA)\r
+          &CpuInfoInHob[Index3],\r
+          &CpuInfoInHob[Index1],\r
+          sizeof (CPU_INFO_IN_HOB)\r
           );\r
-        CopyMem (&CpuMpData->CpuData[Index1], &CpuData, sizeof (CPU_AP_DATA));\r
+        CopyMem (&CpuInfoInHob[Index1], &CpuInfo, sizeof (CPU_INFO_IN_HOB));\r
       }\r
     }\r
 \r
@@ -288,18 +288,11 @@ SortApicId (
     //\r
     ApicId = GetInitialApicId ();\r
     for (Index1 = 0; Index1 < CpuMpData->CpuCount; Index1++) {\r
-      if (CpuMpData->CpuData[Index1].ApicId == ApicId) {\r
+      if (CpuInfoInHob[Index1].ApicId == ApicId) {\r
         CpuMpData->BspNumber = (UINT32) Index1;\r
         break;\r
       }\r
     }\r
-\r
-    CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
-    for (Index1 = 0; Index1 < CpuMpData->CpuCount; Index1++) {\r
-      CpuInfoInHob[Index1].InitialApicId = CpuMpData->CpuData[Index1].InitialApicId;\r
-      CpuInfoInHob[Index1].ApicId        = CpuMpData->CpuData[Index1].ApicId;\r
-      CpuInfoInHob[Index1].Health        = CpuMpData->CpuData[Index1].Health;\r
-    }\r
   }\r
 }\r
 \r
@@ -358,10 +351,13 @@ GetProcessorNumber (
 {\r
   UINTN                   TotalProcessorNumber;\r
   UINTN                   Index;\r
+  CPU_INFO_IN_HOB         *CpuInfoInHob;\r
+\r
+  CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
 \r
   TotalProcessorNumber = CpuMpData->CpuCount;\r
   for (Index = 0; Index < TotalProcessorNumber; Index ++) {\r
-    if (CpuMpData->CpuData[Index].ApicId == GetApicId ()) {\r
+    if (CpuInfoInHob[Index].ApicId == GetApicId ()) {\r
       *ProcessorNumber = Index;\r
       return EFI_SUCCESS;\r
     }\r
@@ -439,12 +435,16 @@ InitializeApData (
   IN     UINT32           BistData\r
   )\r
 {\r
+  CPU_INFO_IN_HOB          *CpuInfoInHob;\r
+\r
+  CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
+  CpuInfoInHob[ProcessorNumber].InitialApicId = GetInitialApicId ();\r
+  CpuInfoInHob[ProcessorNumber].ApicId        = GetApicId ();\r
+  CpuInfoInHob[ProcessorNumber].Health        = BistData;\r
+\r
   CpuMpData->CpuData[ProcessorNumber].Waiting    = FALSE;\r
-  CpuMpData->CpuData[ProcessorNumber].Health     = BistData;\r
   CpuMpData->CpuData[ProcessorNumber].CpuHealthy = (BistData == 0) ? TRUE : FALSE;\r
-  CpuMpData->CpuData[ProcessorNumber].ApicId     = GetApicId ();\r
-  CpuMpData->CpuData[ProcessorNumber].InitialApicId = GetInitialApicId ();\r
-  if (CpuMpData->CpuData[ProcessorNumber].InitialApicId >= 0xFF) {\r
+  if (CpuInfoInHob[ProcessorNumber].InitialApicId >= 0xFF) {\r
     //\r
     // Set x2APIC mode if there are any logical processor reporting\r
     // an Initial APIC ID of 255 or greater.\r
@@ -477,6 +477,7 @@ ApWakeupFunction (
   VOID                       *Parameter;\r
   UINT32                     BistData;\r
   volatile UINT32            *ApStartupSignalBuffer;\r
+  CPU_INFO_IN_HOB            *CpuInfoInHob;\r
 \r
   //\r
   // AP finished assembly code and begin to execute C code\r
@@ -536,6 +537,7 @@ ApWakeupFunction (
           // Invoke AP function here\r
           //\r
           Procedure (Parameter);\r
+          CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
           if (CpuMpData->SwitchBspFlag) {\r
             //\r
             // Re-get the processor number due to BSP/AP maybe exchange in AP function\r
@@ -547,8 +549,8 @@ ApWakeupFunction (
             //\r
             // Re-get the CPU APICID and Initial APICID\r
             //\r
-            CpuMpData->CpuData[ProcessorNumber].ApicId        = GetApicId ();\r
-            CpuMpData->CpuData[ProcessorNumber].InitialApicId = GetInitialApicId ();\r
+            CpuInfoInHob[ProcessorNumber].ApicId        = GetApicId ();\r
+            CpuInfoInHob[ProcessorNumber].InitialApicId = GetInitialApicId ();\r
           }\r
         }\r
         SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateFinished);\r
@@ -696,6 +698,7 @@ WakeUpAP (
   UINTN                            Index;\r
   CPU_AP_DATA                      *CpuData;\r
   BOOLEAN                          ResetVectorRequired;\r
+  CPU_INFO_IN_HOB                  *CpuInfoInHob;\r
 \r
   CpuMpData->FinishedCount = 0;\r
   ResetVectorRequired = FALSE;\r
@@ -760,8 +763,9 @@ WakeUpAP (
     ASSERT (CpuMpData->InitFlag != ApInitConfig);\r
     *(UINT32 *) CpuData->StartupApSignal = WAKEUP_AP_SIGNAL;\r
     if (ResetVectorRequired) {\r
+      CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
       SendInitSipiSipi (\r
-        CpuData->ApicId,\r
+        CpuInfoInHob[ProcessorNumber].ApicId,\r
         (UINT32) ExchangeInfo->BufferStart\r
         );\r
     }\r
@@ -1229,16 +1233,14 @@ MpInitLibInitialize (
     CpuMpData->CpuCount  = OldCpuMpData->CpuCount;\r
     CpuMpData->BspNumber = OldCpuMpData->BspNumber;\r
     CpuMpData->InitFlag  = ApInitReconfig;\r
-    CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) OldCpuMpData->CpuInfoInHob;\r
+    CpuMpData->CpuInfoInHob = OldCpuMpData->CpuInfoInHob;\r
+    CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
     for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
       InitializeSpinLock(&CpuMpData->CpuData[Index].ApLock);\r
-      CpuMpData->CpuData[Index].ApicId        = CpuInfoInHob[Index].ApicId;\r
-      CpuMpData->CpuData[Index].InitialApicId = CpuInfoInHob[Index].InitialApicId;\r
-      if (CpuMpData->CpuData[Index].InitialApicId >= 255) {\r
+      if (CpuInfoInHob[Index].InitialApicId >= 255) {\r
         CpuMpData->X2ApicEnable = TRUE;\r
       }\r
-      CpuMpData->CpuData[Index].Health     = CpuInfoInHob[Index].Health;\r
-      CpuMpData->CpuData[Index].CpuHealthy = (CpuMpData->CpuData[Index].Health == 0)? TRUE:FALSE;\r
+      CpuMpData->CpuData[Index].CpuHealthy = (CpuInfoInHob[Index].Health == 0)? TRUE:FALSE;\r
       CpuMpData->CpuData[Index].ApFunction = 0;\r
       CopyMem (\r
         &CpuMpData->CpuData[Index].VolatileRegisters,\r
@@ -1299,8 +1301,10 @@ MpInitLibGetProcessorInfo (
 {\r
   CPU_MP_DATA            *CpuMpData;\r
   UINTN                  CallerNumber;\r
+  CPU_INFO_IN_HOB        *CpuInfoInHob;\r
 \r
   CpuMpData = GetCpuMpData ();\r
+  CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;\r
 \r
   //\r
   // Check whether caller processor is BSP\r
@@ -1318,7 +1322,7 @@ MpInitLibGetProcessorInfo (
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  ProcessorInfoBuffer->ProcessorId = (UINT64) CpuMpData->CpuData[ProcessorNumber].ApicId;\r
+  ProcessorInfoBuffer->ProcessorId = (UINT64) CpuInfoInHob[ProcessorNumber].ApicId;\r
   ProcessorInfoBuffer->StatusFlag  = 0;\r
   if (ProcessorNumber == CpuMpData->BspNumber) {\r
     ProcessorInfoBuffer->StatusFlag |= PROCESSOR_AS_BSP_BIT;\r
@@ -1336,14 +1340,14 @@ MpInitLibGetProcessorInfo (
   // Get processor location information\r
   //\r
   GetProcessorLocationByApicId (\r
-    CpuMpData->CpuData[ProcessorNumber].ApicId,\r
+    CpuInfoInHob[ProcessorNumber].ApicId,\r
     &ProcessorInfoBuffer->Location.Package,\r
     &ProcessorInfoBuffer->Location.Core,\r
     &ProcessorInfoBuffer->Location.Thread\r
     );\r
 \r
   if (HealthData != NULL) {\r
-    HealthData->Uint32 = CpuMpData->CpuData[ProcessorNumber].Health;\r
+    HealthData->Uint32 = CpuInfoInHob[ProcessorNumber].Health;\r
   }\r
 \r
   return EFI_SUCCESS;\r
index ae78c591ff91609ba0a8cbf065e0a5dfcbecdc4a..f107b6d2d87147fa133066ee3ee2ef612eaba4ec 100644 (file)
@@ -112,9 +112,6 @@ typedef struct {
   volatile UINT32                *StartupApSignal;\r
   volatile UINTN                 ApFunction;\r
   volatile UINTN                 ApFunctionArgument;\r
-  UINT32                         InitialApicId;\r
-  UINT32                         ApicId;\r
-  UINT32                         Health;\r
   BOOLEAN                        CpuHealthy;\r
   volatile CPU_STATE             State;\r
   CPU_VOLATILE_REGISTERS         VolatileRegisters;\r