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;
404 KiCpuId(&CpuInfo, 0x80000000);
405 if ((CpuInfo.
Eax & 0xffffff00) == 0x80000000)
408 if (CpuInfo.
Eax >= 0x80000001)
411 KiCpuId(&CpuInfo, 0x80000001);
421 if (CpuInfo.
Edx & 0x80000000) FeatureBits |=
KF_3DNOW;
435KiReportCpuFeatures(
VOID)
437 ULONG CpuFeatures = 0;
442 KiCpuId(&CpuInfo, 1);
443 CpuFeatures = CpuInfo.
Edx;
446 DPRINT1(
"Supported CPU features: ");
448#define print_kf_bit(kf_value) if (KeFeatureBits & kf_value) DbgPrint(#kf_value " ")
472#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(#cpu_flag " ")
489 ULONG CacheRequests = 0,
i;
490 ULONG CurrentRegister;
491 UCHAR RegisterByte, Associativity = 0;
492 ULONG Size, CacheLine = 64, CurrentSize = 0;
505 KiCpuId(&CpuInfo, 0);
506 if (CpuInfo.
Eax >= 2)
512 KiCpuId(&CpuInfo, 2);
521 CacheRequests = CpuInfo.
Eax & 0xFF;
522 CpuInfo.
Eax &= 0xFFFFFF00;
529 for (
i = 0;
i < 4;
i++)
538 if (CurrentRegister & 0x80000000)
continue;
541 while (CurrentRegister)
544 RegisterByte = (
UCHAR)(CurrentRegister & 0xFF);
545 CurrentRegister >>= 8;
546 if (!RegisterByte)
continue;
549 switch (RegisterByte)
587 Size = (1 << (RegisterByte - 0x41)) * 128 * 1024;
591 Size = 3 * 1024 * 1024;
595 Size = 4 * 1024 * 1024;
599 Size = 6 * 1024 * 1024;
617 Size = (1 << (RegisterByte - 0x79)) * 128 * 1024;
632 Size = (1 << (RegisterByte - 0x82)) * 256 * 1024;
650 if (
Size && (
Size / Associativity) > CurrentSize)
653 CurrentSize =
Size / Associativity;
659 }
while (--CacheRequests);
666 KiCpuId(&CpuInfo, 0x80000000);
667 if (CpuInfo.
Eax >= 0x80000005)
670 KiCpuId(&CpuInfo, 0x80000005);
674 KiCpuId(&CpuInfo, 0x80000000);
675 if (CpuInfo.
Eax >= 0x80000006)
678 KiCpuId(&CpuInfo, 0x80000006);
681 CacheLine = CpuInfo.
Ecx & 0xFF;
684 RegisterByte = (CpuInfo.
Ecx >> 12) & 0xFF;
685 switch (RegisterByte)
710 Size = (CpuInfo.
Ecx >> 16) << 10;
738 DPRINT1(
"Prefetch Cache: %lu bytes\tL2 Cache: %lu bytes\tL2 Cache Line: %lu bytes\tL2 Cache Associativity: %lu\n",
774 TssEntry->LimitLow =
sizeof(
KTSS) - 1;
775 TssEntry->HighWord.Bits.LimitHi = 0;
783 p = (
PUCHAR)(Tss->IoMaps[0].DirectionMap);
792 p = Tss->IntDirectionMap;
852 Tss->Ss = Ke386GetSs();
882 Tss->Ss = Ke386GetSs();
902#if !defined(_GLOBAL_PAGES_ARE_AWESOME_)
983 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
984 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
985 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
990 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
991 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
992 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
993 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
994 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
995 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
1000 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
1001 ProcessorState->SpecialRegisters.Tr = Ke386GetTr();
1042 DPRINT1(
"Support for SYSENTER disabled.\n");
1051 DPRINT(
"Support for SYSENTER detected.\n");
1058 DPRINT1(
"No support for SYSENTER detected.\n");
1127 IdtDescriptor.
Limit + 1);
1181 static double Value1 = 4195835.0, Value2 = 3145727.0;
1205 :
"=m" (ErrataPresent)
1225 return ErrataPresent != 0;
1271 Ke386FxSave(FxSaveArea);
1279 Ke386FxStore(FxSaveArea);
1300 if (SaveArea) Ke386FnSave(SaveArea);
1358#if defined(__clang__)
1437 Ke386SaveFpuState(FxSaveAreaFrame);
1449 Ke386SaveFpuState(
FsContext->PfxSaveArea);
1484#if defined(__clang__)
1542 Ke386ClearFpExceptions();
1545 Ke386RestoreFpuState(
FsContext->PfxSaveArea);
1607 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)
#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)
#define X86_FEATURE_SYSCALL
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
ULONG64 NTAPI KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
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[]
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]
ULONG_PTR NTAPI KeIpiGenericCall(IN PKIPI_BROADCAST_WORKER Function, IN ULONG_PTR Argument)
#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::@2434::@2435 Bytes
union _KGDTENTRY::@2434 HighWord
struct _KGDTENTRY::@2434::@2436 Bits
ULONG SecondLevelCacheSize
UCHAR SecondLevelCacheAssociativity
UCHAR LogicalProcessorsPerPhysicalProcessor
LARGE_INTEGER UpdateSignature
KPROCESSOR_STATE ProcessorState
struct _KTHREAD * NpxThread
KSPECIAL_REGISTERS SpecialRegisters
union _LOADER_PARAMETER_BLOCK::@3364 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