]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuCacheInfoLib: Sort CpuCacheInfo array
authorLou, Yun <Yun.Lou@intel.com>
Fri, 6 Aug 2021 14:37:13 +0000 (22:37 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 9 Aug 2021 03:01:17 +0000 (03:01 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3508

Sort the CpuCacheInfo array by CPU package ID, core type, cache level
and cache type.

Signed-off-by: Jason Lou <yun.lou@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
UefiCpuPkg/Include/Library/CpuCacheInfoLib.h
UefiCpuPkg/Library/CpuCacheInfoLib/CpuCacheInfoLib.c
UefiCpuPkg/Library/CpuCacheInfoLib/DxeCpuCacheInfoLib.inf
UefiCpuPkg/Library/CpuCacheInfoLib/InternalCpuCacheInfoLib.h
UefiCpuPkg/Library/CpuCacheInfoLib/PeiCpuCacheInfoLib.inf

index a66152bce009e4ecc45b5f2cf222166494ef4830..3422997f54fcb87c0be2e03c0d2bf1d05e4408e4 100644 (file)
@@ -59,7 +59,7 @@ typedef struct {
 } CPU_CACHE_INFO;\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
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
index c481080e49d8a340131a69ce2bff619d9feb781e..c3d3f1e799ccad946c4df7e85a0e0908d6d94e60 100644 (file)
@@ -3,7 +3,7 @@
 #\r
 #  Provides cache info for each package, core type, cache level and cache type.\r
 #\r
-#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
@@ -25,6 +25,7 @@
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
   UefiCpuPkg/UefiCpuPkg.dec\r
 \r
 [LibraryClasses]\r
@@ -33,6 +34,7 @@
   BaseMemoryLib\r
   MemoryAllocationLib\r
   UefiBootServicesTableLib\r
+  SortLib\r
 \r
 [Protocols]\r
   gEfiMpServiceProtocolGuid\r
index b6e6ae5bc50a2ae1399b3edbd499001c0fc188e8..26e1f46516de4e0d3e4ea4d4deab33e5d7f5c1a1 100644 (file)
 #include <Library/DebugLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
+#include <Library/SortLib.h>\r
 #include <Library/CpuCacheInfoLib.h>\r
 \r
+typedef union {\r
+  struct {\r
+    //\r
+    // Type of the cache that this package's this type of logical processor corresponds to.\r
+    // Value = CPUID.04h:EAX[04:00]\r
+    //\r
+    UINT32        CacheType : 5;\r
+    //\r
+    // Level of the cache that this package's this type of logical processor corresponds to.\r
+    // Value = CPUID.04h:EAX[07:05]\r
+    //\r
+    UINT32        CacheLevel : 3;\r
+    //\r
+    // Core type of logical processor.\r
+    // Value = CPUID.1Ah:EAX[31:24]\r
+    //\r
+    UINT32        CoreType : 8;\r
+    UINT32        Reserved : 16;\r
+    //\r
+    // Package number.\r
+    //\r
+    UINT32        Package;\r
+  } Bits;\r
+  UINT64        Uint64;\r
+} CPU_CACHE_INFO_COMPARATOR;\r
+\r
 typedef struct {\r
   //\r
   // Package ID, the information comes from\r
index 0c73015cac8becd569e3fa8ff1e6af58b1edd9c8..0864497849e54437178246f0786b80c3f203886a 100644 (file)
@@ -3,7 +3,7 @@
 #\r
 #  Provides cache info for each package, core type, cache level and cache type.\r
 #\r
-#  Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
@@ -25,6 +25,7 @@
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
   UefiCpuPkg/UefiCpuPkg.dec\r
 \r
 [LibraryClasses]\r
@@ -33,6 +34,7 @@
   BaseMemoryLib\r
   MemoryAllocationLib\r
   PeiServicesTablePointerLib\r
+  SortLib\r
 \r
 [Ppis]\r
   gEdkiiPeiMpServices2PpiGuid\r