81#define FXSAVE_ALIGN 15
116 KiCpuId(&CpuInfo, 0);
135 DPRINT1(
"Cyrix CPU support not fully tested!\n");
140 DPRINT1(
"Transmeta CPU support not fully tested!\n");
145 DPRINT1(
"Centaur CPU support not fully tested!\n");
150 DPRINT1(
"Rise CPU support not fully tested!\n");
170 KiCpuId(&CpuInfo, 1);
179 Stepping = CpuSignature.
Model;
180 ExtendModel = (CpuSignature.
Family == 15);
181#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
182 if (CpuSignature.
Family == 6)
186#if (NTDDI_VERSION >= NTDDI_WIN8)
196 Stepping = (Stepping << 8) | CpuSignature.
Step;
222 ULONG CpuFeatures = 0;
228 if (!Vendor)
return FeatureBits;
231 KiCpuId(&CpuInfo, 1);
246 KiCpuId(&DummyCpuInfo, 1);
256 if (((CpuInfo.
Eax & 0x0FF0) == 0x0610 && (CpuInfo.
Eax & 0x000F) <= 0x9) ||
257 ((CpuInfo.
Eax & 0x0FF0) == 0x0630 && (CpuInfo.
Eax & 0x000F) <= 0x4))
260 FeatureBits &= ~KF_WORKING_PTE;
268 CpuInfo.
Edx &= ~0x800;
277 if ((CpuInfo.
Eax & 0x0F00) == 0x0500)
280 switch (CpuInfo.
Eax & 0x00F0)
286 if ((CpuInfo.
Eax & 0x000F) > 0x03)
break;
292 CpuInfo.
Edx &= ~0x2000;
311 else if((CpuInfo.
Eax & 0x0F00) < 0x0500)
314 CpuInfo.
Edx &= ~(0x08 | 0x2000 | 0x8000);
317 ExtendedCPUID =
FALSE;
345 if ((CpuInfo.
Eax & 0x0FFF) >= 0x0542)
365 CpuFeatures = CpuInfo.
Edx;
370 if (CpuFeatures & 0x00000010) FeatureBits |=
KF_RDTSC;
371 if (CpuFeatures & 0x00000100) FeatureBits |=
KF_CMPXCHG8B;
373 if (CpuFeatures & 0x00001000) FeatureBits |=
KF_MTRR;
375 if (CpuFeatures & 0x00008000) FeatureBits |=
KF_CMOV;
376 if (CpuFeatures & 0x00010000) FeatureBits |=
KF_PAT;
377 if (CpuFeatures & 0x00200000) FeatureBits |=
KF_DTS;
378 if (CpuFeatures & 0x00800000) FeatureBits |=
KF_MMX;
379 if (CpuFeatures & 0x01000000) FeatureBits |=
KF_FXSR;
380 if (CpuFeatures & 0x02000000) FeatureBits |=
KF_XMMI;
381 if (CpuFeatures & 0x04000000) FeatureBits |=
KF_XMMI64;
383 if (CpuFeatures & 0x00000040)
389 if (CpuFeatures & 0x10000000)
409 KiCpuId(&CpuInfo, 0x80000000);
410 if ((CpuInfo.
Eax & 0xffffff00) == 0x80000000)
413 if (CpuInfo.
Eax >= 0x80000001)
416 KiCpuId(&CpuInfo, 0x80000001);
426 if (CpuInfo.
Edx & 0x80000000) FeatureBits |=
KF_3DNOW;
433#define print_supported(kf_value) ((FeatureBits & kf_value) ? #kf_value : "")
434 DPRINT1(
"Supported CPU features : %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",
456#undef print_supported
469 ULONG CacheRequests = 0,
i;
470 ULONG CurrentRegister;
471 UCHAR RegisterByte, Associativity = 0;
472 ULONG Size, CacheLine = 64, CurrentSize = 0;
485 KiCpuId(&CpuInfo, 0);
486 if (CpuInfo.
Eax >= 2)
492 KiCpuId(&CpuInfo, 2);
501 CacheRequests = CpuInfo.
Eax & 0xFF;
502 CpuInfo.
Eax &= 0xFFFFFF00;
509 for (
i = 0;
i < 4;
i++)
518 if (CurrentRegister & 0x80000000)
continue;
521 while (CurrentRegister)
524 RegisterByte = (
UCHAR)(CurrentRegister & 0xFF);
525 CurrentRegister >>= 8;
526 if (!RegisterByte)
continue;
529 switch (RegisterByte)
567 Size = (1 << (RegisterByte - 0x41)) * 128 * 1024;
571 Size = 3 * 1024 * 1024;
575 Size = 4 * 1024 * 1024;
579 Size = 6 * 1024 * 1024;
597 Size = (1 << (RegisterByte - 0x79)) * 128 * 1024;
612 Size = (1 << (RegisterByte - 0x82)) * 256 * 1024;
630 if (
Size && (
Size / Associativity) > CurrentSize)
633 CurrentSize =
Size / Associativity;
639 }
while (--CacheRequests);
646 KiCpuId(&CpuInfo, 0x80000000);
647 if (CpuInfo.
Eax >= 0x80000005)
650 KiCpuId(&CpuInfo, 0x80000005);
654 KiCpuId(&CpuInfo, 0x80000000);
655 if (CpuInfo.
Eax >= 0x80000006)
658 KiCpuId(&CpuInfo, 0x80000006);
661 CacheLine = CpuInfo.
Ecx & 0xFF;
664 RegisterByte = (CpuInfo.
Ecx >> 12) & 0xFF;
665 switch (RegisterByte)
690 Size = (CpuInfo.
Ecx >> 16) << 10;
718 DPRINT1(
"Prefetch Cache: %lu bytes\tL2 Cache: %lu bytes\tL2 Cache Line: %lu bytes\tL2 Cache Associativity: %lu\n",
754 TssEntry->LimitLow =
sizeof(
KTSS) - 1;
755 TssEntry->HighWord.Bits.LimitHi = 0;
763 p = (
PUCHAR)(Tss->IoMaps[0].DirectionMap);
772 p = Tss->IntDirectionMap;
832 Tss->Ss = Ke386GetSs();
862 Tss->Ss = Ke386GetSs();
882#if !defined(_GLOBAL_PAGES_ARE_AWESOME_)
963 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
964 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
965 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
970 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
971 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
972 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
973 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
974 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
975 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
980 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
981 ProcessorState->SpecialRegisters.Tr = Ke386GetTr();
1022 DPRINT1(
"Support for SYSENTER disabled.\n");
1031 DPRINT(
"Support for SYSENTER detected.\n");
1038 DPRINT1(
"No support for SYSENTER detected.\n");
1107 IdtDescriptor.
Limit + 1);
1161 static double Value1 = 4195835.0, Value2 = 3145727.0;
1185 :
"=m" (ErrataPresent)
1205 return ErrataPresent != 0;
1251 Ke386FxSave(FxSaveArea);
1259 Ke386FxStore(FxSaveArea);
1280 if (SaveArea) Ke386FnSave(SaveArea);
1338#if defined(__clang__)
1417 Ke386SaveFpuState(FxSaveAreaFrame);
1429 Ke386SaveFpuState(
FsContext->PfxSaveArea);
1464#if defined(__clang__)
1522 Ke386ClearFpExceptions();
1525 Ke386RestoreFpuState(
FsContext->PfxSaveArea);
1587 TargetAffinity &= ~Prcb->SetMember;
int strcmp(const char *String1, const char *String2)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeLowerIrql(oldIrql)
#define KeGetCurrentIrql()
#define ExAllocatePool(type, size)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
_Inout_ PLIST_ENTRY _In_ PVOID FsContext
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
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 KeGetCurrentThread
#define Ke386GetGlobalDescriptorTable
#define Ke386GetLocalDescriptorTable
#define Ke386SetGlobalDescriptorTable
#define RtlFillMemory(Dest, Length, Fill)
#define InterlockedExchangeAdd
void __cdecl _disable(void)
void __cdecl _enable(void)
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 __writeeflags(uintptr_t Value)
__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 uintptr_t __readeflags(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)
ULONG_PTR NTAPI KeIpiGenericCall(IN PKIPI_BROADCAST_WORKER Function, IN ULONG_PTR Argument)
#define KeSaveFloatingPointState(x)
#define KeRestoreFloatingPointState(x)
PLOADER_PARAMETER_BLOCK KeLoaderBlock
#define MiAddressToPte(x)
#define ExFreePoolWithTag(_P, _T)
#define EFLAGS_INTERRUPT_MASK
#define KiComputeIopmOffset(MapNumber)
#define IO_ACCESS_MAP_NONE
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
#define I386_INTERRUPT_GATE
struct _KIDT_ACCESS * PKIDT_ACCESS
#define NPX_STATE_NOT_LOADED
#define IOPM_DIRECTION_MAP_SIZE
NTSYSAPI VOID NTAPI RtlCaptureContext(_Out_ PCONTEXT ContextRecord)
#define CONTEXT_DEBUG_REGISTERS
#define ASSERTMSG(msg, exp)
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
VOID __cdecl KiTrap13(VOID)
VOID __cdecl KiTrap02(VOID)
VOID __cdecl KiTrap08(VOID)
VOID __cdecl KiFastCallEntry(VOID)
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea(IN PKTHREAD Thread)
VOID NTAPI KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN OUT PCONTEXT Context)
KAFFINITY KeActiveProcessors
VOID FASTCALL KiIpiSignalPacketDone(IN PKIPI_CONTEXT PacketContext)
VOID NTAPI KiIpiSendPacket(IN KAFFINITY TargetProcessors, IN PKIPI_WORKER WorkerFunction, IN PKIPI_BROADCAST_WORKER BroadcastFunction, IN ULONG_PTR Context, IN PULONG Count)
ULONG_PTR KiDoubleFaultStack
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)
ULONG NTAPI KiGetCpuVendor(VOID)
volatile LONG KiTbFlushTimeStamp
VOID NTAPI KeSetDmaIoCoherency(IN ULONG Coherency)
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)
UCHAR KiDoubleFaultTSS[KTSS_IO_MAPS]
VOID NTAPI KiInitializeMachineType(VOID)
VOID FASTCALL Ki386InitializeTss(IN PKTSS Tss, IN PKIDTENTRY Idt, IN PKGDTENTRY Gdt)
static const CHAR CmpTransmetaID[]
ULONG KiFastSystemCallDisable
VOID NTAPI KiInitializeTSS(IN PKTSS Tss)
VOID NTAPI KiInitializeTSS2(IN PKTSS Tss, IN PKGDTENTRY TssEntry OPTIONAL)
ULONG KePrefetchNTAGranularity
VOID NTAPI KiCoprocessorError(VOID)
VOID NTAPI KiSaveProcessorState(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
VOID NTAPI KiI386PentiumLockErrataFixup(VOID)
static __inline void setCx86(UCHAR reg, UCHAR data)
BOOLEAN NTAPI KiIsNpxErrataPresent(VOID)
ULONG_PTR NTAPI Ki386EnableXMMIExceptions(IN ULONG_PTR Context)
ULONG_PTR NTAPI KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context)
ULONG_PTR NTAPI Ki386EnableFxsr(IN ULONG_PTR Context)
VOID NTAPI KiFlushNPXState(IN PFLOATING_SAVE_AREA SaveArea)
VOID NTAPI KiRestoreFastSyscallReturnState(VOID)
static __inline UCHAR getCx86(UCHAR reg)
BOOLEAN KiI386PentiumLockErrataPresent
VOID NTAPI KiSetCR0Bits(VOID)
static const CHAR CmpRiseID[]
BOOLEAN KiFastCallCopyDoneOnce
VOID NTAPI KiFlushTargetEntireTb(IN PKIPI_CONTEXT PacketContext, IN PVOID Ignored1, IN PVOID Ignored2, IN PVOID Ignored3)
static const CHAR CmpCyrixID[]
UCHAR KiSystemCallExitAdjusted
UCHAR KiSystemCallExitAdjust
ULONG_PTR NTAPI Ki386EnableDE(IN ULONG_PTR Context)
UCHAR KiNMITSS[KTSS_IO_MAPS]
#define print_supported(kf_value)
#define READ_PORT_UCHAR(p)
#define WRITE_PORT_UCHAR(p, d)
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tmov %rdx, %rbp\n" "\tjmp *%rax\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
PULONG MinorVersion OPTIONAL
struct _KGDTENTRY::@2424::@2425 Bytes
union _KGDTENTRY::@2424 HighWord
struct _KGDTENTRY::@2424::@2426 Bits
ULONG SecondLevelCacheSize
UCHAR SecondLevelCacheAssociativity
UCHAR LogicalProcessorsPerPhysicalProcessor
LARGE_INTEGER UpdateSignature
KPROCESSOR_STATE ProcessorState
struct _KTHREAD * NpxThread
KSPECIAL_REGISTERS SpecialRegisters
union _LOADER_PARAMETER_BLOCK::@3346 u
#define TAG_FLOATING_POINT_CONTEXT
#define TAG_FLOATING_POINT_FX
DECLSPEC_NORETURN VOID FASTCALL KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
DECLSPEC_NORETURN VOID FASTCALL KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INSUFFICIENT_RESOURCES
#define ALIGN_UP_POINTER_BY(ptr, align)
static int Save(const char **args)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql