177 if (DescriptorCode < CacheDesc->
Code)
181 else if (DescriptorCode > CacheDesc->Code)
232 if (CpuidReg->
Bits.NotValid)
240 if (DescriptorCode == 0)
244 if (IntelCacheDesc !=
NULL)
247 if (
Count >= MaxCount)
252 CacheDescriptors[
Count].Level = IntelCacheDesc->
Level;
255 CacheDescriptors[
Count].Size = IntelCacheDesc->
SizeinKB * 1024;
256 CacheDescriptors[
Count].Type = IntelCacheDesc->
Type;
288 static const UCHAR AssocMap[16] =
290 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, 0xFF
296 if ((L1TlbInfo.
Amd.Ecx.Bits.L1DcSize != 0) && (
Count < MaxCount))
298 CacheDescriptors[
Count].Level = 1;
300 CacheDescriptors[
Count].Size = L1TlbInfo.
Amd.Ecx.Bits.L1DcSize * 1024;
301 CacheDescriptors[
Count].Associativity = L1TlbInfo.
Amd.Ecx.Bits.L1DcAssoc;
302 CacheDescriptors[
Count].LineSize = L1TlbInfo.
Amd.Ecx.Bits.L1DcLineSize;
307 if ((L1TlbInfo.
Amd.Edx.Bits.L1IcSize != 0) && (
Count < MaxCount))
309 CacheDescriptors[
Count].Level = 1;
311 CacheDescriptors[
Count].Size = L1TlbInfo.
Amd.Edx.Bits.L1IcSize * 1024;
312 CacheDescriptors[
Count].Associativity = L1TlbInfo.
Amd.Edx.Bits.L1IcAssoc;
313 CacheDescriptors[
Count].LineSize = L1TlbInfo.
Amd.Edx.Bits.L1IcLineSize;
320 if ((CacheInfoRegs.
Ecx.
Bits.L2Size != 0) && (CacheInfoRegs.
Ecx.
Bits.L2Assoc != 9) && (
Count < MaxCount))
322 CacheDescriptors[
Count].Level = 2;
324 CacheDescriptors[
Count].Size = CacheInfoRegs.
Ecx.
Bits.L2Size * 1024;
325 CacheDescriptors[
Count].Associativity = AssocMap[CacheInfoRegs.
Ecx.
Bits.L2Assoc];
326 CacheDescriptors[
Count].LineSize = CacheInfoRegs.
Ecx.
Bits.L2LineSize;
331 if ((CacheInfoRegs.
Edx.
Bits.L3Size != 0) && (CacheInfoRegs.
Edx.
Bits.L3Assoc != 9) && (
Count < MaxCount))
333 CacheDescriptors[
Count].Level = 3;
335 CacheDescriptors[
Count].Size = CacheInfoRegs.
Edx.
Bits.L3Size * 512 * 1024;
336 CacheDescriptors[
Count].Associativity = AssocMap[CacheInfoRegs.
Edx.
Bits.L3Assoc];
337 CacheDescriptors[
Count].LineSize = CacheInfoRegs.
Edx.
Bits.L3LineSize;
367 for (Subleaf = 0; (Subleaf < 32) && (
Count < MaxCount); Subleaf++)
371 switch (Regs.
Eax.
Bits.CacheType)
392 if (Regs.
Eax.
Bits.FullyAssociativeCache)
394 CacheDescriptors[
Count].Associativity = 0xFF;
399 CacheDescriptors[
Count].Associativity = (Ways > 0xFE) ? 0xFE : (
UCHAR)Ways;
404 CacheDescriptors[
Count].Size = (Regs.
Ebx.
Bits.Ways + 1) *
405 (Regs.
Ebx.
Bits.LinePartitions + 1) *
434 for (
l = 0;
l < CacheCount;
l++)
436 for (
r =
l + 1;
r < CacheCount;
r++)
439 if ((CacheDescriptors[
l].
Level > CacheDescriptors[
r].
Level) ||
440 ((CacheDescriptors[
l].
Level == CacheDescriptors[
r].
Level) &&
441 (CacheDescriptors[
l].
Type < CacheDescriptors[
r].
Type)))
444 CacheDescriptors[
l] = CacheDescriptors[
r];
445 CacheDescriptors[
r] = Temp;
453 CacheDescriptors[0] = CacheDescriptors[0];
455 for (
i = 1;
i < CacheCount;
i++)
457 if ((CacheDescriptors[
i].
Level != CacheDescriptors[
i - 1].
Level) ||
458 (CacheDescriptors[
i].
Type != CacheDescriptors[
i - 1].
Type))
460 CacheDescriptors[NewCount] = CacheDescriptors[
i];
#define CPUID_L1_TLB_INFO
#define CPUID_CACHE_PARAMS_AMD
#define CPUID_CACHE_PARAMS_CACHE_TYPE_UNIFIED
#define CPUID_EXTENDED_FUNCTION
#define CPUID_CACHE_PARAMS_CACHE_TYPE_NULL
#define CPUID_CACHE_PARAMS
#define CPUID_CACHE_PARAMS_CACHE_TYPE_INSTRUCTION
#define CPUID_CACHE_PARAMS_CACHE_TYPE_DATA
#define CPUID_EXTENDED_CACHE_INFO
static const INTEL_CACHE_DESCRIPTOR * FindIntelCacheDescriptor(_In_ UCHAR DescriptorCode)
Finds the cache descriptor for the given descriptor value.
ULONG NTAPI KiGetCpuCacheDescriptors(_Out_writes_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount, _In_ CPU_VENDORS Vendor)
Retrieves cache descriptors for the current CPU.
static const INTEL_CACHE_DESCRIPTOR IntelCacheDescriptors[]
Table of known Intel cache descriptors, as defined in the Intel SDM.
static ULONG NormalizeCacheDescriptors(_Inout_updates_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG CacheCount, _In_ ULONG MaxCount)
Normalizes the cache descriptors by removing duplicates and sorting them.
static ULONG GetCacheInfoIntelLeaf2(_Out_cap_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount)
Retrieves cache information using CPUID leaf 2 for Intel processors.
static ULONG KiGetCacheInfoModern(_Out_cap_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount, _In_ ULONG CpuIdLeaf)
Retrieves cache information for modern Intel/AMD processors.
static ULONG GetCacheInfoAmdLegacy(_Out_cap_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount)
Retrieves cache information for legacy AMD processors.
_In_ ULONG _In_ UCHAR Level
static const WCHAR Signature[]
GLdouble GLdouble GLdouble r
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
static struct proto Pass[]
#define _Inout_updates_(s)
#define RtlZeroMemory(Destination, Length)
struct CPUID_AMD_EXTENDED_CACHE_INFO_ECX::@4435 Bits
struct CPUID_AMD_EXTENDED_CACHE_INFO_EDX::@4436 Bits
CPUID_AMD_EXTENDED_CACHE_INFO_EDX Edx
CPUID_AMD_EXTENDED_CACHE_INFO_ECX Ecx
struct CPUID_CACHE_INFO_CACHE_TLB::@4514 Bits
CPUID_CACHE_INFO_CACHE_TLB Eax
CPUID_CACHE_INFO_CACHE_TLB Regs[4]
struct CPUID_CACHE_PARAMS_EAX::@4515 Bits
struct CPUID_CACHE_PARAMS_EBX::@4516 Bits
CPUID_CACHE_PARAMS_EBX Ebx
CPUID_CACHE_PARAMS_EAX Eax
struct CPUID_L1_TLB_INFO_REGS::@4431 Amd
_In_ UCHAR _In_ UCHAR _In_ ULONG Code