mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 07:24:37 +00:00
Add Get() function for every cpuid struct
This commit is contained in:
parent
9b84d0147d
commit
76239ec4ad
@ -258,35 +258,19 @@ namespace APIC
|
||||
bool x2APICSupported = false;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
#endif
|
||||
if (cpuid1amd.ECX.x2APIC)
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
if (cpuid.ECX.x2APIC)
|
||||
{
|
||||
// x2APICSupported = cpuid1amd.ECX.x2APIC;
|
||||
// x2APICSupported = cpuid.ECX.x2APIC;
|
||||
fixme("x2APIC is supported");
|
||||
}
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
#endif
|
||||
x2APICSupported = cpuid1intel.ECX.x2APIC;
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
x2APICSupported = cpuid.ECX.x2APIC;
|
||||
}
|
||||
|
||||
if (x2APICSupported)
|
||||
|
124
Core/CPU.cpp
124
Core/CPU.cpp
@ -204,36 +204,20 @@ namespace CPU
|
||||
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
#endif
|
||||
if (cpuid1amd.EDX.PGE)
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
if (cpuid.EDX.PGE)
|
||||
PGESupport = true;
|
||||
if (cpuid1amd.EDX.SSE)
|
||||
if (cpuid.EDX.SSE)
|
||||
SSESupport = true;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
#endif
|
||||
if (cpuid1intel.EDX.PGE)
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
if (cpuid.EDX.PGE)
|
||||
PGESupport = true;
|
||||
if (cpuid1intel.EDX.SSE)
|
||||
if (cpuid.EDX.SSE)
|
||||
SSESupport = true;
|
||||
}
|
||||
|
||||
@ -376,36 +360,32 @@ namespace CPU
|
||||
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "=a"(cpuid.EAX.raw), "=b"(cpuid.EBX.raw), "=c"(cpuid.ECX.raw), "=d"(cpuid.EDX.raw)
|
||||
: "a"(0x1));
|
||||
|
||||
if (cpuid1amd.ECX.SSE42)
|
||||
if (cpuid.ECX.SSE42)
|
||||
SIMDType |= SIMD_SSE42;
|
||||
else if (cpuid1amd.ECX.SSE41)
|
||||
else if (cpuid.ECX.SSE41)
|
||||
SIMDType |= SIMD_SSE41;
|
||||
else if (cpuid1amd.ECX.SSE3)
|
||||
else if (cpuid.ECX.SSE3)
|
||||
SIMDType |= SIMD_SSE3;
|
||||
else if (cpuid1amd.EDX.SSE2)
|
||||
else if (cpuid.EDX.SSE2)
|
||||
SIMDType |= SIMD_SSE2;
|
||||
else if (cpuid1amd.EDX.SSE)
|
||||
else if (cpuid.EDX.SSE)
|
||||
SIMDType |= SIMD_SSE;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (cpuid1amd.ECX.SSE42)
|
||||
if (cpuid.ECX.SSE42)
|
||||
debug("SSE4.2 is supported.");
|
||||
if (cpuid1amd.ECX.SSE41)
|
||||
if (cpuid.ECX.SSE41)
|
||||
debug("SSE4.1 is supported.");
|
||||
if (cpuid1amd.ECX.SSE3)
|
||||
if (cpuid.ECX.SSE3)
|
||||
debug("SSE3 is supported.");
|
||||
if (cpuid1amd.EDX.SSE2)
|
||||
if (cpuid.EDX.SSE2)
|
||||
debug("SSE2 is supported.");
|
||||
if (cpuid1amd.EDX.SSE)
|
||||
if (cpuid.EDX.SSE)
|
||||
debug("SSE is supported.");
|
||||
#endif
|
||||
|
||||
@ -413,36 +393,32 @@ namespace CPU
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "=a"(cpuid.EAX.raw), "=b"(cpuid.EBX.raw), "=c"(cpuid.ECX.raw), "=d"(cpuid.EDX.raw)
|
||||
: "a"(0x1));
|
||||
|
||||
if (cpuid1intel.ECX.SSE4_2)
|
||||
if (cpuid.ECX.SSE4_2)
|
||||
SIMDType |= SIMD_SSE42;
|
||||
else if (cpuid1intel.ECX.SSE4_1)
|
||||
else if (cpuid.ECX.SSE4_1)
|
||||
SIMDType |= SIMD_SSE41;
|
||||
else if (cpuid1intel.ECX.SSE3)
|
||||
else if (cpuid.ECX.SSE3)
|
||||
SIMDType |= SIMD_SSE3;
|
||||
else if (cpuid1intel.EDX.SSE2)
|
||||
else if (cpuid.EDX.SSE2)
|
||||
SIMDType |= SIMD_SSE2;
|
||||
else if (cpuid1intel.EDX.SSE)
|
||||
else if (cpuid.EDX.SSE)
|
||||
SIMDType |= SIMD_SSE;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (cpuid1intel.ECX.SSE4_2)
|
||||
if (cpuid.ECX.SSE4_2)
|
||||
debug("SSE4.2 is supported.");
|
||||
if (cpuid1intel.ECX.SSE4_1)
|
||||
if (cpuid.ECX.SSE4_1)
|
||||
debug("SSE4.1 is supported.");
|
||||
if (cpuid1intel.ECX.SSE3)
|
||||
if (cpuid.ECX.SSE3)
|
||||
debug("SSE3 is supported.");
|
||||
if (cpuid1intel.EDX.SSE2)
|
||||
if (cpuid.EDX.SSE2)
|
||||
debug("SSE2 is supported.");
|
||||
if (cpuid1intel.EDX.SSE)
|
||||
if (cpuid.EDX.SSE)
|
||||
debug("SSE is supported.");
|
||||
#endif
|
||||
return SIMDType;
|
||||
@ -461,47 +437,39 @@ namespace CPU
|
||||
#if defined(a64) || defined(a32)
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "=a"(cpuid.EAX.raw), "=b"(cpuid.EBX.raw), "=c"(cpuid.ECX.raw), "=d"(cpuid.EDX.raw)
|
||||
: "a"(0x1));
|
||||
|
||||
if (Type == SIMD_SSE42)
|
||||
return cpuid1amd.ECX.SSE42;
|
||||
return cpuid.ECX.SSE42;
|
||||
else if (Type == SIMD_SSE41)
|
||||
return cpuid1amd.ECX.SSE41;
|
||||
return cpuid.ECX.SSE41;
|
||||
else if (Type == SIMD_SSE3)
|
||||
return cpuid1amd.ECX.SSE3;
|
||||
return cpuid.ECX.SSE3;
|
||||
else if (Type == SIMD_SSE2)
|
||||
return cpuid1amd.EDX.SSE2;
|
||||
return cpuid.EDX.SSE2;
|
||||
else if (Type == SIMD_SSE)
|
||||
return cpuid1amd.EDX.SSE;
|
||||
return cpuid.EDX.SSE;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "=a"(cpuid.EAX.raw), "=b"(cpuid.EBX.raw), "=c"(cpuid.ECX.raw), "=d"(cpuid.EDX.raw)
|
||||
: "a"(0x1));
|
||||
|
||||
if (Type == SIMD_SSE42)
|
||||
return cpuid1intel.ECX.SSE4_2;
|
||||
return cpuid.ECX.SSE4_2;
|
||||
else if (Type == SIMD_SSE41)
|
||||
return cpuid1intel.ECX.SSE4_1;
|
||||
return cpuid.ECX.SSE4_1;
|
||||
else if (Type == SIMD_SSE3)
|
||||
return cpuid1intel.ECX.SSE3;
|
||||
return cpuid.ECX.SSE3;
|
||||
else if (Type == SIMD_SSE2)
|
||||
return cpuid1intel.EDX.SSE2;
|
||||
return cpuid.EDX.SSE2;
|
||||
else if (Type == SIMD_SSE)
|
||||
return cpuid1intel.EDX.SSE;
|
||||
return cpuid.EDX.SSE;
|
||||
}
|
||||
#endif // a64 || a32
|
||||
return false;
|
||||
|
@ -27,31 +27,15 @@ namespace Random
|
||||
int RDRANDFlag = 0;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1amd.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1intel.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
|
||||
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
|
||||
@ -76,31 +60,15 @@ namespace Random
|
||||
int RDRANDFlag = 0;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1amd.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1intel.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
|
||||
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
|
||||
@ -125,31 +93,15 @@ namespace Random
|
||||
int RDRANDFlag = 0;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1amd.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1intel.ECX.RDRAND;
|
||||
#endif // a64 || a32
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
|
||||
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
|
||||
|
@ -803,31 +803,15 @@ namespace Tasking
|
||||
bool MONITORSupported = false;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
MONITORSupported = cpuid1amd.ECX.MONITOR;
|
||||
#endif
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
MONITORSupported = cpuid.ECX.MONITOR;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
MONITORSupported = cpuid1intel.ECX.MONITOR;
|
||||
#endif
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
MONITORSupported = cpuid.ECX.MONITOR;
|
||||
}
|
||||
|
||||
if (MONITORSupported)
|
||||
|
@ -26,31 +26,15 @@ __constructor void TestRandom()
|
||||
int RDRANDFlag = 0;
|
||||
if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_AMD) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#elif defined(a32)
|
||||
CPU::x32::AMD::CPUID0x00000001 cpuid1amd;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1amd.EAX.raw), "=b"(cpuid1amd.EBX.raw), "=c"(cpuid1amd.ECX.raw), "=d"(cpuid1amd.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1amd.ECX.RDRAND;
|
||||
#endif
|
||||
CPU::x86::AMD::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
else if (strcmp(CPU::Vendor(), x86_CPUID_VENDOR_INTEL) == 0)
|
||||
{
|
||||
#if defined(a64)
|
||||
CPU::x64::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#elif defined(a32)
|
||||
CPU::x32::Intel::CPUID0x00000001 cpuid1intel;
|
||||
#endif
|
||||
#if defined(a64) || defined(a32)
|
||||
asmv("cpuid"
|
||||
: "=a"(cpuid1intel.EAX.raw), "=b"(cpuid1intel.EBX.raw), "=c"(cpuid1intel.ECX.raw), "=d"(cpuid1intel.EDX.raw)
|
||||
: "a"(0x1));
|
||||
RDRANDFlag = cpuid1intel.ECX.RDRAND;
|
||||
#endif
|
||||
CPU::x86::Intel::CPUID0x00000001 cpuid;
|
||||
cpuid.Get();
|
||||
RDRANDFlag = cpuid.ECX.RDRAND;
|
||||
}
|
||||
|
||||
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) == 0)
|
||||
|
@ -20,19 +20,17 @@
|
||||
|
||||
#include <types.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <cpu/x86/x32/cpuid_amd.hpp>
|
||||
#include <cpu/x86/x32/cpuid_intel.hpp>
|
||||
#include <cpu/x86/cpuid_intel.hpp>
|
||||
#include <cpu/x86/cpuid_amd.hpp>
|
||||
#include <cpu/x86/x32/cr.hpp>
|
||||
#include <cpu/x86/x32/msr.hpp>
|
||||
#include <cpu/x86/x64/cpuid_amd.hpp>
|
||||
#include <cpu/x86/x64/cpuid_intel.hpp>
|
||||
#include <cpu/x86/x64/cr.hpp>
|
||||
#include <cpu/x86/x64/msr.hpp>
|
||||
#include <cpu/x86/exceptions.hpp>
|
||||
#include <cpu/x86/interrupts.hpp>
|
||||
#include <cpu/signatures.hpp>
|
||||
#include <cpu/membar.hpp>
|
||||
#include <cstring>
|
||||
|
||||
/**
|
||||
* @brief CPU related functions.
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,627 +0,0 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __FENNIX_KERNEL_CPU_x32_CPUID_AMD_H__
|
||||
#define __FENNIX_KERNEL_CPU_x32_CPUID_AMD_H__
|
||||
|
||||
#include <types.h>
|
||||
|
||||
namespace CPU
|
||||
{
|
||||
namespace x32
|
||||
{
|
||||
/** @brief EXPERIMENTAL IMPLEMENTATION */
|
||||
namespace AMD
|
||||
{
|
||||
/** @brief Basic CPU information */
|
||||
struct CPUID0x0
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t HighestFunctionSupported : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Vendor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Vendor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Vendor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Additional CPU information */
|
||||
struct CPUID0x1
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SteppingID : 4;
|
||||
uint32_t ModelID : 4;
|
||||
uint32_t FamilyID : 4;
|
||||
uint32_t Reserved0 : 4;
|
||||
uint32_t ExtendedModel : 4;
|
||||
uint32_t ExtendedFamily : 8;
|
||||
uint32_t Reserved1 : 4;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t BrandIndex : 8;
|
||||
uint32_t CLFLUSHLineSize : 8;
|
||||
uint32_t LogicalProcessorsPerPackage : 8;
|
||||
uint32_t LocalAPICID : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SSE3 : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t MONITOR : 1;
|
||||
uint32_t Reserved1 : 1;
|
||||
uint32_t DS_CPL : 1;
|
||||
uint32_t Reserved2 : 1;
|
||||
uint32_t SMX : 1;
|
||||
uint32_t Reserved3 : 1;
|
||||
uint32_t TM2 : 1;
|
||||
uint32_t Reserved4 : 1;
|
||||
uint32_t CNXT_ID : 1;
|
||||
uint32_t Reserved5 : 1;
|
||||
uint32_t CMPXCHG16B : 1;
|
||||
uint32_t Reserved6 : 1;
|
||||
uint32_t xTPRUpdateControl : 1;
|
||||
uint32_t Reserved7 : 1;
|
||||
uint32_t Reserved8 : 1;
|
||||
uint32_t DCA : 1;
|
||||
uint32_t Reserved9 : 1;
|
||||
uint32_t SSE4_1 : 1;
|
||||
uint32_t SSE4_2 : 1;
|
||||
uint32_t Reserved10 : 1;
|
||||
uint32_t MOVBE : 1;
|
||||
uint32_t POPCNT : 1;
|
||||
uint32_t Reserved11 : 1;
|
||||
uint32_t AES : 1;
|
||||
uint32_t Reserved12 : 1;
|
||||
uint32_t XSAVE : 1;
|
||||
uint32_t OSXSAVE : 1;
|
||||
uint32_t AVX : 1;
|
||||
uint32_t Reserved13 : 1;
|
||||
uint32_t RDRAND : 1;
|
||||
uint32_t Reserved14 : 1;
|
||||
uint32_t Hypervisor : 1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t FPU : 1;
|
||||
uint32_t VME : 1;
|
||||
uint32_t DE : 1;
|
||||
uint32_t PSE : 1;
|
||||
uint32_t TSC : 1;
|
||||
uint32_t MSR : 1;
|
||||
uint32_t PAE : 1;
|
||||
uint32_t MCE : 1;
|
||||
uint32_t CX8 : 1;
|
||||
uint32_t APIC : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t SEP : 1;
|
||||
uint32_t MTRR : 1;
|
||||
uint32_t PGE : 1;
|
||||
uint32_t MCA : 1;
|
||||
uint32_t CMOV : 1;
|
||||
uint32_t PAT : 1;
|
||||
uint32_t PSE36 : 1;
|
||||
uint32_t PSN : 1;
|
||||
uint32_t CLFSH : 1;
|
||||
uint32_t Reserved1 : 1;
|
||||
uint32_t DS : 1;
|
||||
uint32_t ACPI : 1;
|
||||
uint32_t MMX : 1;
|
||||
uint32_t FXSR : 1;
|
||||
uint32_t SSE : 1;
|
||||
uint32_t SSE2 : 1;
|
||||
uint32_t SS : 1;
|
||||
uint32_t HTT : 1;
|
||||
uint32_t TM : 1;
|
||||
uint32_t Reserved2 : 1;
|
||||
uint32_t PBE : 1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU cache and TLB */
|
||||
struct CPUID0x2
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t L1DataCacheSize : 8;
|
||||
uint32_t L1DataCacheAssociativity : 8;
|
||||
uint32_t L1DataCacheLineSize : 8;
|
||||
uint32_t L1DataCachePartitions : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t L1InstructionCacheSize : 8;
|
||||
uint32_t L1InstructionCacheAssociativity : 8;
|
||||
uint32_t L1InstructionCacheLineSize : 8;
|
||||
uint32_t L1InstructionCachePartitions : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t L2UnifiedCacheSize : 16;
|
||||
uint32_t L2UnifiedCacheAssociativity : 8;
|
||||
uint32_t L2UnifiedCacheLineSize : 8;
|
||||
uint32_t L2UnifiedCachePartitions : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t L3UnifiedCacheSize : 18;
|
||||
uint32_t L3UnifiedCacheAssociativity : 8;
|
||||
uint32_t L3UnifiedCacheLineSize : 8;
|
||||
uint32_t L3UnifiedCachePartitions : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Get CPU hypervisor information */
|
||||
struct CPUID0x40000000
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* @brief Maximum input value for hypervisor CPUID information.
|
||||
* @note Can be from 0x40000001 to 0x400000FF
|
||||
*/
|
||||
uint32_t MaximumInputValue : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Extended CPU information */
|
||||
struct CPUID0x80000001
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SteppingID : 4;
|
||||
uint32_t ModelID : 4;
|
||||
uint32_t FamilyID : 4;
|
||||
uint32_t Reserved0 : 4;
|
||||
uint32_t ExtendedModel : 4;
|
||||
uint32_t ExtendedFamily : 8;
|
||||
uint32_t Reserved1 : 4;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t BranchID : 16;
|
||||
uint32_t Reserved0 : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LAHF_SAHF : 1;
|
||||
uint32_t CmpLegacy : 1;
|
||||
uint32_t SVM : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t AltMovCr8 : 1;
|
||||
uint32_t Reserved1 : 26;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t FPU : 1;
|
||||
uint32_t VME : 1;
|
||||
uint32_t DE : 1;
|
||||
uint32_t PSE : 1;
|
||||
uint32_t TSC : 1;
|
||||
uint32_t MSR : 1;
|
||||
uint32_t PAE : 1;
|
||||
uint32_t MCE : 1;
|
||||
uint32_t CMPXCHG8B : 1;
|
||||
uint32_t APIC : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t SYSCALL : 1;
|
||||
uint32_t MTRR : 1;
|
||||
uint32_t PGE : 1;
|
||||
uint32_t MCA : 1;
|
||||
uint32_t CMOV : 1;
|
||||
uint32_t PAT : 1;
|
||||
uint32_t PSE36 : 1;
|
||||
uint32_t Reserved1 : 1;
|
||||
uint32_t ExeDisable : 1;
|
||||
uint32_t Reserved2 : 1;
|
||||
uint32_t MMXExtended : 1;
|
||||
uint32_t MMX : 1;
|
||||
uint32_t FXSR : 1;
|
||||
uint32_t FFXSR : 1;
|
||||
uint32_t Reserved3 : 1;
|
||||
uint32_t RDTSCP : 1;
|
||||
uint32_t Reserved4 : 1;
|
||||
uint32_t LongMode : 1;
|
||||
uint32_t ThreeDNowExtended : 1;
|
||||
uint32_t ThreeDNow : 1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000002
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000003
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000004
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Cache and TLB information */
|
||||
struct CPUID0x80000005
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t InstructionCount : 8;
|
||||
uint32_t InstructionAssociativity : 8;
|
||||
uint32_t DataCount : 8;
|
||||
uint32_t DataAssociativity : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t InstructionCount : 8;
|
||||
uint32_t InstructionAssociativity : 8;
|
||||
uint32_t DataCount : 8;
|
||||
uint32_t DataAssociativity : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LineSize : 8;
|
||||
uint32_t LinePerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LineSize : 8;
|
||||
uint32_t LinePerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU cache line information */
|
||||
struct CPUID0x80000006
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LineSize : 8;
|
||||
uint32_t LinePerTag : 4;
|
||||
uint32_t Associativity : 4;
|
||||
uint32_t CacheSize : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief APM */
|
||||
struct CPUID0x80000007
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t TemperatureSensor : 1;
|
||||
uint32_t FrequencyID : 1;
|
||||
uint32_t VoltageID : 1;
|
||||
uint32_t ThermaTrip : 1;
|
||||
uint32_t HarwareThermalControl : 1;
|
||||
uint32_t SoftwareThermalControl : 1;
|
||||
uint32_t Reserved0 : 2;
|
||||
uint32_t TSCInvariant : 1;
|
||||
uint32_t Reserved1 : 23;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // !__FENNIX_KERNEL_CPU_x32_CPUID_AMD_H__
|
@ -1,965 +0,0 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __FENNIX_KERNEL_CPU_x32_CPUID_INTEL_H__
|
||||
#define __FENNIX_KERNEL_CPU_x32_CPUID_INTEL_H__
|
||||
|
||||
#include <types.h>
|
||||
|
||||
namespace CPU
|
||||
{
|
||||
namespace x32
|
||||
{
|
||||
/** @brief EXPERIMENTAL IMPLEMENTATION */
|
||||
namespace Intel
|
||||
{
|
||||
/** @brief Basic CPU information */
|
||||
struct CPUID0x0
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t HighestFunctionSupported : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char rbx[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char rcx[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char rdx[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Additional CPU information */
|
||||
struct CPUID0x1
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SteppingID : 4;
|
||||
uint32_t ModelID : 4;
|
||||
uint32_t FamilyID : 4;
|
||||
uint32_t Type : 2;
|
||||
uint32_t Reserved0 : 2;
|
||||
uint32_t ExtendedModel : 4;
|
||||
uint32_t ExtendedFamily : 8;
|
||||
uint32_t Reserved1 : 4;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t BrandIndex : 8;
|
||||
uint32_t CLFLUSHLineSize : 8;
|
||||
uint32_t LogicalProcessorsPerPackage : 8;
|
||||
uint32_t LocalAPICID : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SSE3 : 1;
|
||||
uint32_t PCLMULQDQ : 1;
|
||||
uint32_t DTES64 : 1;
|
||||
uint32_t MONITOR : 1;
|
||||
uint32_t DS_CPL : 1;
|
||||
uint32_t VMX : 1;
|
||||
uint32_t SMX : 1;
|
||||
uint32_t EIST : 1;
|
||||
uint32_t TM2 : 1;
|
||||
uint32_t SSSE3 : 1;
|
||||
uint32_t CNXT_ID : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t FMA : 1;
|
||||
uint32_t CMPXCHG16B : 1;
|
||||
uint32_t xTPRUpdateControl : 1;
|
||||
uint32_t PDCM : 1;
|
||||
uint32_t Reserved1 : 1;
|
||||
uint32_t PCID : 1;
|
||||
uint32_t DCA : 1;
|
||||
uint32_t SSE4_1 : 1;
|
||||
uint32_t SSE4_2 : 1;
|
||||
uint32_t x2APIC : 1;
|
||||
uint32_t MOVBE : 1;
|
||||
uint32_t POPCNT : 1;
|
||||
uint32_t TSCDeadline : 1;
|
||||
uint32_t AES : 1;
|
||||
uint32_t XSAVE : 1;
|
||||
uint32_t OSXSAVE : 1;
|
||||
uint32_t AVX : 1;
|
||||
uint32_t F16C : 1;
|
||||
uint32_t RDRAND : 1;
|
||||
uint32_t Reserved2 : 1;
|
||||
uint32_t Hypervisor : 1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t FPU : 1;
|
||||
uint32_t VME : 1;
|
||||
uint32_t DE : 1;
|
||||
uint32_t PSE : 1;
|
||||
uint32_t TSC : 1;
|
||||
uint32_t MSR : 1;
|
||||
uint32_t PAE : 1;
|
||||
uint32_t MCE : 1;
|
||||
uint32_t CX8 : 1;
|
||||
uint32_t APIC : 1;
|
||||
uint32_t Reserved0 : 1;
|
||||
uint32_t SEP : 1;
|
||||
uint32_t MTRR : 1;
|
||||
uint32_t PGE : 1;
|
||||
uint32_t MCA : 1;
|
||||
uint32_t CMOV : 1;
|
||||
uint32_t PAT : 1;
|
||||
uint32_t PSE36 : 1;
|
||||
uint32_t PSN : 1;
|
||||
uint32_t CLFSH : 1;
|
||||
uint32_t Reserved1 : 1;
|
||||
uint32_t DS : 1;
|
||||
uint32_t ACPI : 1;
|
||||
uint32_t MMX : 1;
|
||||
uint32_t FXSR : 1;
|
||||
uint32_t SSE : 1;
|
||||
uint32_t SSE2 : 1;
|
||||
uint32_t SS : 1;
|
||||
uint32_t HTT : 1;
|
||||
uint32_t TM : 1;
|
||||
uint32_t Reserved2 : 1;
|
||||
uint32_t PBE : 1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU cache and TLB */
|
||||
struct CPUID0x2
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CacheLineSize : 8;
|
||||
uint32_t CacheLinesPerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CacheLineSize : 8;
|
||||
uint32_t CacheLinesPerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CacheLineSize : 8;
|
||||
uint32_t CacheLinesPerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CacheLineSize : 8;
|
||||
uint32_t CacheLinesPerTag : 8;
|
||||
uint32_t Associativity : 8;
|
||||
uint32_t CacheSize : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief CPU serial number */
|
||||
struct CPUID0x3
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t ProcessorSerialNumber : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t ProcessorSerialNumber : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Cache information */
|
||||
struct CPUID0x4_1
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Type : 5;
|
||||
uint32_t Level : 3;
|
||||
uint32_t SelfInitializing : 1;
|
||||
uint32_t FullyAssociative : 1;
|
||||
uint32_t Reserved : 4;
|
||||
uint32_t MaxAddressableIdsForLogicalProcessors : 12;
|
||||
uint32_t CoresPerPackage : 6;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SystemCoherencyLineSize : 12;
|
||||
uint32_t PhysicalLinePartitions : 10;
|
||||
uint32_t WaysOfAssociativity : 10;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief MONITOR information */
|
||||
struct CPUID0x5
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SmallestMonitorLineSize : 16;
|
||||
uint32_t Reserved : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LargestMonitorLineSize : 16;
|
||||
uint32_t Reserved : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t MWAITEnumerationSupported : 1;
|
||||
uint32_t InterruptsAsBreakEvent : 1;
|
||||
uint32_t Reserved : 30;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t C0 : 4;
|
||||
uint32_t C1 : 4;
|
||||
uint32_t C2 : 4;
|
||||
uint32_t C3 : 4;
|
||||
uint32_t C4 : 4;
|
||||
uint32_t Reserved : 12;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Thermal and power management information */
|
||||
struct CPUID0x6
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SensorSupported : 1;
|
||||
uint32_t Reserved : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t InterruptThreshold : 4;
|
||||
uint32_t Reserved : 26;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t ACNT_MCNT : 1;
|
||||
uint32_t Reserved : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Performance monitors */
|
||||
struct CPUID0xA
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t VersionID : 8;
|
||||
uint32_t NumberCounters : 8;
|
||||
uint32_t BitWidthOfCounters : 8;
|
||||
uint32_t LengthOfEBXBitVector : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CoreCycles : 1;
|
||||
uint32_t InstructionsRetired : 1;
|
||||
uint32_t ReferenceCycles : 1;
|
||||
uint32_t CacheReferences : 1;
|
||||
uint32_t CacheMisses : 1;
|
||||
uint32_t BranchInstructionsRetired : 1;
|
||||
uint32_t BranchMissesRetired : 1;
|
||||
uint32_t Reserved : 25;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t FixedFunctionCounters : 5;
|
||||
uint32_t CounterWidth : 8;
|
||||
uint32_t Reserved : 19;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Get CPU frequency information */
|
||||
struct CPUID0x15
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t VersionID : 8;
|
||||
uint32_t NumberCounters : 8;
|
||||
uint32_t BitWidthOfCounters : 8;
|
||||
uint32_t LengthOfEBXBitVector : 8;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t CoreCycles : 1;
|
||||
uint32_t InstructionsRetired : 1;
|
||||
uint32_t ReferenceCycles : 1;
|
||||
uint32_t CacheReferences : 1;
|
||||
uint32_t CacheMisses : 1;
|
||||
uint32_t BranchInstructionsRetired : 1;
|
||||
uint32_t BranchMissesRetired : 1;
|
||||
uint32_t Reserved : 25;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t FixedFunctionCounters : 5;
|
||||
uint32_t CounterWidth : 8;
|
||||
uint32_t Reserved : 19;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Get CPU frequency information */
|
||||
struct CPUID0x16
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* @brief Denominator of the TSC frequency
|
||||
*
|
||||
* @note TSC frequency = core crystal clock frequency * EBX/EAX
|
||||
*/
|
||||
uint32_t Denominator : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* @brief Numerator of the TSC frequency
|
||||
*
|
||||
* @note TSC frequency = core crystal clock frequency * EBX/EAX
|
||||
*/
|
||||
uint32_t Numerator : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Core crystal clock frequency in Hz */
|
||||
uint32_t CoreCrystalClock : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Reserved */
|
||||
uint32_t Reserved : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Get CPU hypervisor information */
|
||||
struct CPUID0x40000000
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* @brief Maximum input value for hypervisor CPUID information.
|
||||
* @note Can be from 0x40000001 to 0x400000FF
|
||||
*/
|
||||
uint32_t MaximumInputValue : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
/** @brief Hypervisor vendor signature */
|
||||
char Hypervisor[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
};
|
||||
|
||||
/** @brief Extended CPU information */
|
||||
struct CPUID0x80000000
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t HighestExtendedFunctionSupported : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief Extended CPU information */
|
||||
struct CPUID0x80000001
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Unknown : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LAHF_SAHF : 1;
|
||||
uint32_t Reserved : 31;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved0 : 11;
|
||||
uint32_t SYSCALL : 1;
|
||||
uint32_t Reserved1 : 8;
|
||||
uint32_t ExecuteDisable : 1;
|
||||
uint32_t Reserved2 : 8;
|
||||
uint32_t EMT64T : 1;
|
||||
uint32_t Reserved3 : 2;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000002
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000003
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief CPU brand string */
|
||||
struct CPUID0x80000004
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char Brand[4];
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief CPU cache line information */
|
||||
struct CPUID0x80000006
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t InstructionCount : 12;
|
||||
uint32_t InstructionAssociativity : 4;
|
||||
uint32_t DataCount : 12;
|
||||
uint32_t DataAssociativity : 4;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t InstructionCount : 12;
|
||||
uint32_t InstructionAssociativity : 4;
|
||||
uint32_t DataCount : 12;
|
||||
uint32_t DataAssociativity : 4;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t LineSize : 8;
|
||||
uint32_t LinePerTag : 4;
|
||||
uint32_t Associativity : 4;
|
||||
uint32_t CacheSize : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief Virtual and physical memory size */
|
||||
struct CPUID0x80000008
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t PhysicalAddressBits : 8;
|
||||
uint32_t LinearAddressBits : 8;
|
||||
uint32_t Reserved : 16;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
|
||||
/** @brief Secure virtual machine parameters */
|
||||
struct CPUID0x8000000A
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t SVMRevision : 8;
|
||||
uint32_t Reserved : 24;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EAX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EBX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} ECX;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint32_t Reserved : 32;
|
||||
};
|
||||
uint32_t raw;
|
||||
} EDX;
|
||||
uint32_t raw;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // !__FENNIX_KERNEL_CPU_x32_CPUID_INTEL_H__
|
Loading…
x
Reference in New Issue
Block a user