]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c
UefiCpuPkg/CpuCacheInfoLib: Sort CpuCacheInfo array
[mirror_edk2.git] / UefiCpuPkg / Library / CpuCacheInfoLib / CpuCacheInfoLib.c
index 126ee0da86fc60f05b1566700b11339a25a7fad3..ae81ea9ce24d9ef923021bd48d25f0122b83591d 100644 (file)
@@ -37,6 +37,47 @@ CpuCacheInfoPrintCpuCacheInfoTable (
   DEBUG ((DEBUG_INFO, "+-------+--------------------------------------------------------------------------------------+\n"));\r
 }\r
 \r
+/**\r
+  Function to compare CPU package ID, core type, cache level and cache type for use in QuickSort.\r
+\r
+  @param[in]  Buffer1             pointer to CPU_CACHE_INFO poiner to compare\r
+  @param[in]  Buffer2             pointer to second CPU_CACHE_INFO pointer to compare\r
+\r
+  @retval  0                      Buffer1 equal to Buffer2\r
+  @retval  1                      Buffer1 is greater than Buffer2\r
+  @retval  -1                     Buffer1 is less than Buffer2\r
+**/\r
+INTN\r
+EFIAPI\r
+CpuCacheInfoCompare (\r
+  IN CONST VOID             *Buffer1,\r
+  IN CONST VOID             *Buffer2\r
+  )\r
+{\r
+  CPU_CACHE_INFO_COMPARATOR Comparator1, Comparator2;\r
+\r
+  ZeroMem (&Comparator1, sizeof (Comparator1));\r
+  ZeroMem (&Comparator2, sizeof (Comparator2));\r
+\r
+  Comparator1.Bits.Package    = ((CPU_CACHE_INFO*)Buffer1)->Package;\r
+  Comparator1.Bits.CoreType   = ((CPU_CACHE_INFO*)Buffer1)->CoreType;\r
+  Comparator1.Bits.CacheLevel = ((CPU_CACHE_INFO*)Buffer1)->CacheLevel;\r
+  Comparator1.Bits.CacheType  = ((CPU_CACHE_INFO*)Buffer1)->CacheType;\r
+\r
+  Comparator2.Bits.Package    = ((CPU_CACHE_INFO*)Buffer2)->Package;\r
+  Comparator2.Bits.CoreType   = ((CPU_CACHE_INFO*)Buffer2)->CoreType;\r
+  Comparator2.Bits.CacheLevel = ((CPU_CACHE_INFO*)Buffer2)->CacheLevel;\r
+  Comparator2.Bits.CacheType  = ((CPU_CACHE_INFO*)Buffer2)->CacheType;\r
+\r
+  if (Comparator1.Uint64 == Comparator2.Uint64) {\r
+    return 0;\r
+  } else if (Comparator1.Uint64 > Comparator2.Uint64) {\r
+    return 1;\r
+  } else {\r
+    return -1;\r
+  }\r
+}\r
+\r
 /**\r
   Get the total number of package and package ID in the platform.\r
 \r
@@ -325,6 +366,10 @@ CpuCacheInfoCollectCpuCacheInfoData (
   if (*CacheInfoCount < LocalCacheInfoCount) {\r
     Status = EFI_BUFFER_TOO_SMALL;\r
   } else {\r
+    //\r
+    // Sort LocalCacheInfo array by CPU package ID, core type, cache level and cache type.\r
+    //\r
+    PerformQuickSort (LocalCacheInfo, LocalCacheInfoCount, sizeof (*LocalCacheInfo), (SORT_COMPARE) CpuCacheInfoCompare);\r
     CopyMem (CacheInfo, LocalCacheInfo, sizeof (*CacheInfo) * LocalCacheInfoCount);\r
     DEBUG_CODE (\r
       CpuCacheInfoPrintCpuCacheInfoTable (CacheInfo, LocalCacheInfoCount);\r
@@ -340,7 +385,7 @@ CpuCacheInfoCollectCpuCacheInfoData (
 }\r
 \r
 /**\r
-  Get CpuCacheInfo data array.\r
+  Get CpuCacheInfo data array. The array is sorted by CPU package ID, core type, cache level and cache type.\r
 \r
   @param[in, out] CpuCacheInfo        Pointer to the CpuCacheInfo array.\r
   @param[in, out] CpuCacheInfoCount   As input, point to the length of response CpuCacheInfo array.\r