82 DPRINT1(
"VIA CPUs not fully supported\n");
108 KiCpuId(&CpuInfo, 1);
117 Stepping = CpuSignature.
Model;
118 ExtendModel = (CpuSignature.
Family == 15);
119#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
120 if (CpuSignature.
Family == 6)
123#if (NTDDI_VERSION >= NTDDI_WIN8)
133 Stepping = (Stepping << 8) | CpuSignature.
Step;
161 if (!Vendor)
return FeatureBits;
164 KiCpuId(&CpuInfo, 1);
211 KiCpuId(&CpuInfo, 0x80000000);
212 if ((CpuInfo.
Eax & 0xffffff00) == 0x80000000)
215 if (CpuInfo.
Eax >= 0x80000001)
218 KiCpuId(&CpuInfo, 0x80000001);
227 if (CpuInfo.
Edx & 0x80000000) FeatureBits |=
KF_3DNOW;
241 ULONG CpuFeatures = 0;
246 KiCpuId(&CpuInfo, 1);
247 CpuFeatures = CpuInfo.
Edx;
250 DPRINT1(
"Supported CPU features: ");
252#define print_kf_bit(kf_value) if (Prcb->FeatureBits & kf_value) DbgPrint(#kf_value " ")
282#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(#cpu_flag " ")
297 ULONG CacheRequests = 0,
i;
298 ULONG CurrentRegister;
317 KiCpuId(&CpuInfo, 0);
318 if (CpuInfo.
Eax >= 2)
324 KiCpuId(&CpuInfo, 2);
333 CacheRequests = CpuInfo.
Eax & 0xFF;
334 CpuInfo.
Eax &= 0xFFFFFF00;
341 for (
i = 0;
i < 4;
i++)
350 if (CurrentRegister & 0x80000000)
continue;
353 while (CurrentRegister)
356 RegisterByte = (
UCHAR)(CurrentRegister & 0xFF);
357 CurrentRegister >>= 8;
358 if (!RegisterByte)
continue;
365 if (((RegisterByte > 0x40) &&
366 (RegisterByte <= 0x49)) ||
367 ((RegisterByte > 0x80) &&
368 (RegisterByte <= 0x89)))
371 RegisterByte &= 0x0F;
379 }
while (--CacheRequests);
386 KiCpuId(&CpuInfo, 0x80000000);
387 if (CpuInfo.
Eax >= 6)
390 KiCpuId(&CpuInfo, 0x80000006);
454 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
455 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
456 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
457 ProcessorState->SpecialRegisters.Cr4 =
__readcr4();
458 ProcessorState->SpecialRegisters.Cr8 = __readcr8();
461 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
462 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
463 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
464 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
465 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
466 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
469 __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
470 __sldt(&ProcessorState->SpecialRegisters.Ldtr);
471 __str(&ProcessorState->SpecialRegisters.Tr);
472 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
474 ProcessorState->SpecialRegisters.MxCsr =
_mm_getcsr();
int strcmp(const char *String1, const char *String2)
#define KeLowerIrql(oldIrql)
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
KIRQL NTAPI KeRaiseIrqlToSynchLevel(VOID)
#define InterlockedExchangeAdd
PPC_QUAL void __writemsr(const unsigned long Value)
PPC_QUAL unsigned long long __readmsr()
PPC_QUAL void __wbinvd(void)
__INTRIN_INLINE unsigned long __readcr3(void)
__INTRIN_INLINE void __lidt(void *Source)
__INTRIN_INLINE unsigned int __readdr(unsigned int reg)
__INTRIN_INLINE unsigned long __readcr4(void)
__INTRIN_INLINE unsigned long __readcr0(void)
__INTRIN_INLINE void __writecr3(unsigned int Data)
__INTRIN_INLINE unsigned long __readcr2(void)
__INTRIN_INLINE void __writecr0(unsigned int Data)
__INTRIN_INLINE void __sidt(void *Destination)
__INTRIN_INLINE void __writecr4(unsigned int Data)
__INTRIN_INLINE void __writedr(unsigned reg, unsigned int value)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
NTSYSAPI VOID NTAPI RtlCaptureContext(_Out_ PCONTEXT ContextRecord)
#define UNREFERENCED_PARAMETER(P)
#define X86_FEATURE_XSAVE
#define X86_FEATURE_SYSCALL
#define X86_MSR_KERNEL_GSBASE
KAFFINITY KeActiveProcessors
ULONG NTAPI KeGetRecommendedSharedDataAlignment(VOID)
VOID NTAPI KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState)
VOID NTAPI KeFlushCurrentTb(VOID)
VOID NTAPI KiSetProcessorType(VOID)
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
VOID __cdecl KeSaveStateForHibernate(IN PKPROCESSOR_STATE State)
BOOLEAN KiSMTProcessorsPresent
BOOLEAN NTAPI KeInvalidateAllCaches(VOID)
NTSTATUS NTAPI KxRestoreFloatingPointState(IN PKFLOATING_SAVE FloatingState)
ULONG NTAPI KiGetCpuVendor(VOID)
volatile LONG KiTbFlushTimeStamp
VOID NTAPI KeSetDmaIoCoherency(IN ULONG Coherency)
NTSTATUS NTAPI KxSaveFloatingPointState(OUT PKFLOATING_SAVE FloatingState)
VOID NTAPI KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
static const CHAR CmpIntelID[]
static const CHAR CmpAmdID[]
ULONG NTAPI KiGetFeatureBits(VOID)
static const CHAR CmpCentaurID[]
VOID NTAPI KiGetCacheInformation(VOID)
union _CPU_SIGNATURE CPU_SIGNATURE
KAFFINITY NTAPI KeQueryActiveProcessors(VOID)
ULONG SecondLevelCacheSize
UCHAR LogicalProcessorsPerPhysicalProcessor
KSPECIAL_REGISTERS SpecialRegisters
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
void _mm_setcsr(unsigned int a)
unsigned int _mm_getcsr(void)