]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Sort processor by ascending order of APIC ID
authorJeff Fan <jeff.fan@intel.com>
Wed, 20 Jul 2016 16:31:36 +0000 (00:31 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 17 Aug 2016 12:01:49 +0000 (20:01 +0800)
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
UefiCpuPkg/Library/MpInitLib/MpLib.c

index d84dfec5066119c6fafbb3e14d4d950987e3725a..d6eef138ac13f0ff82a0452385be564e78602a5b 100644 (file)
@@ -216,6 +216,73 @@ GetApLoopMode (
   return ApLoopMode;\r
 }\r
 \r
+/**\r
+  Sort the APIC ID of all processors.\r
+\r
+  This function sorts the APIC ID of all processors so that processor number is\r
+  assigned in the ascending order of APIC ID which eases MP debugging.\r
+\r
+  @param[in] CpuMpData        Pointer to PEI CPU MP Data\r
+**/\r
+VOID\r
+SortApicId (\r
+  IN CPU_MP_DATA   *CpuMpData\r
+  )\r
+{\r
+  UINTN             Index1;\r
+  UINTN             Index2;\r
+  UINTN             Index3;\r
+  UINT32            ApicId;\r
+  CPU_AP_DATA       CpuData;\r
+  UINT32            ApCount;\r
+  CPU_INFO_IN_HOB   *CpuInfoInHob;\r
+\r
+  ApCount = CpuMpData->CpuCount - 1;\r
+\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
+      for (Index2 = Index1 + 1; Index2 <= ApCount; Index2++) {\r
+        if (ApicId > CpuMpData->CpuData[Index2].ApicId) {\r
+          Index3 = Index2;\r
+          ApicId = CpuMpData->CpuData[Index2].ApicId;\r
+        }\r
+      }\r
+      if (Index3 != Index1) {\r
+        CopyMem (&CpuData, &CpuMpData->CpuData[Index3], sizeof (CPU_AP_DATA));\r
+        CopyMem (\r
+          &CpuMpData->CpuData[Index3],\r
+          &CpuMpData->CpuData[Index1],\r
+          sizeof (CPU_AP_DATA)\r
+          );\r
+        CopyMem (&CpuMpData->CpuData[Index1], &CpuData, sizeof (CPU_AP_DATA));\r
+      }\r
+    }\r
+\r
+    //\r
+    // Get the processor number for the BSP\r
+    //\r
+    ApicId = GetInitialApicId ();\r
+    for (Index1 = 0; Index1 < CpuMpData->CpuCount; Index1++) {\r
+      if (CpuMpData->CpuData[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
 /**\r
   Enable x2APIC mode on APs.\r
 \r
@@ -331,6 +398,11 @@ CollectProcessorCount (
     SetApicMode (LOCAL_APIC_MODE_X2APIC);\r
   }\r
   DEBUG ((DEBUG_INFO, "APIC MODE is %d\n", GetApicMode ()));\r
+  //\r
+  // Sort BSP/Aps by CPU APIC ID in ascending order\r
+  //\r
+  SortApicId (CpuMpData);\r
+\r
   DEBUG ((DEBUG_INFO, "MpInitLib: Find %d processors in system.\n", CpuMpData->CpuCount));\r
 \r
   return CpuMpData->CpuCount;\r