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
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
}\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
#\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
\r
[Packages]\r
MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
UefiCpuPkg/UefiCpuPkg.dec\r
\r
[LibraryClasses]\r
BaseMemoryLib\r
MemoryAllocationLib\r
UefiBootServicesTableLib\r
+ SortLib\r
\r
[Protocols]\r
gEfiMpServiceProtocolGuid\r
#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
#\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
\r
[Packages]\r
MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
UefiCpuPkg/UefiCpuPkg.dec\r
\r
[LibraryClasses]\r
BaseMemoryLib\r
MemoryAllocationLib\r
PeiServicesTablePointerLib\r
+ SortLib\r
\r
[Ppis]\r
gEdkiiPeiMpServices2PpiGuid\r