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)
373 CpuFeatures = CpuInfo.
Edx;
412 KiCpuId(&CpuInfo, 0x80000000);
413 if ((CpuInfo.
Eax & 0xffffff00) == 0x80000000)
416 if (CpuInfo.
Eax >= 0x80000001)
419 KiCpuId(&CpuInfo, 0x80000001);
429 if (CpuInfo.
Edx & 0x80000000) FeatureBits |=
KF_3DNOW;
443KiReportCpuFeatures(
VOID)
445 ULONG CpuFeatures = 0;
450 KiCpuId(&CpuInfo, 1);
451 CpuFeatures = CpuInfo.
Edx;
454 DPRINT1(
"Supported CPU features: ");
456#define print_kf_bit(kf_value) if (KeFeatureBits & kf_value) DbgPrint(#kf_value " ")
480#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(#cpu_flag " ")
497 ULONG CacheRequests = 0,
i;
498 ULONG CurrentRegister;
499 UCHAR RegisterByte, Associativity = 0;
500 ULONG Size, CacheLine = 64, CurrentSize = 0;
513 KiCpuId(&CpuInfo, 0);
514 if (CpuInfo.
Eax >= 2)
520 KiCpuId(&CpuInfo, 2);
529 CacheRequests = CpuInfo.
Eax & 0xFF;
530 CpuInfo.
Eax &= 0xFFFFFF00;
537 for (
i = 0;
i < 4;
i++)
546 if (CurrentRegister & 0x80000000)
continue;
549 while (CurrentRegister)
552 RegisterByte = (
UCHAR)(CurrentRegister & 0xFF);
553 CurrentRegister >>= 8;
554 if (!RegisterByte)
continue;
557 switch (RegisterByte)
595 Size = (1 << (RegisterByte - 0x41)) * 128 * 1024;
599 Size = 3 * 1024 * 1024;
603 Size = 4 * 1024 * 1024;
607 Size = 6 * 1024 * 1024;
625 Size = (1 << (RegisterByte - 0x79)) * 128 * 1024;
640 Size = (1 << (RegisterByte - 0x82)) * 256 * 1024;
658 if (
Size && (
Size / Associativity) > CurrentSize)
661 CurrentSize =
Size / Associativity;
667 }
while (--CacheRequests);
674 KiCpuId(&CpuInfo, 0x80000000);
675 if (CpuInfo.
Eax >= 0x80000005)
678 KiCpuId(&CpuInfo, 0x80000005);
682 KiCpuId(&CpuInfo, 0x80000000);
683 if (CpuInfo.
Eax >= 0x80000006)
686 KiCpuId(&CpuInfo, 0x80000006);
689 CacheLine = CpuInfo.
Ecx & 0xFF;
692 RegisterByte = (CpuInfo.
Ecx >> 12) & 0xFF;
693 switch (RegisterByte)
718 Size = (CpuInfo.
Ecx >> 16) << 10;
746 DPRINT1(
"Prefetch Cache: %lu bytes\tL2 Cache: %lu bytes\tL2 Cache Line: %lu bytes\tL2 Cache Associativity: %lu\n",
782 TssEntry->LimitLow =
sizeof(
KTSS) - 1;
783 TssEntry->HighWord.Bits.LimitHi = 0;
791 p = (
PUCHAR)(Tss->IoMaps[0].DirectionMap);
800 p = Tss->IntDirectionMap;
860 Tss->Ss = Ke386GetSs();
890 Tss->Ss = Ke386GetSs();
910#if !defined(_GLOBAL_PAGES_ARE_AWESOME_)
991 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
992 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
993 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
998 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
999 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
1000 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
1001 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
1002 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
1003 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
1008 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
1009 ProcessorState->SpecialRegisters.Tr = Ke386GetTr();
1050 DPRINT1(
"Support for SYSENTER disabled.\n");
1059 DPRINT(
"Support for SYSENTER detected.\n");
1066 DPRINT1(
"No support for SYSENTER detected.\n");
1135 IdtDescriptor.
Limit + 1);
1189 static double Value1 = 4195835.0, Value2 = 3145727.0;
1213 :
"=m" (ErrataPresent)
1233 return ErrataPresent != 0;
1279 Ke386FxSave(FxSaveArea);
1287 Ke386FxStore(FxSaveArea);
1308 if (SaveArea) Ke386FnSave(SaveArea);
1366#if defined(__clang__)
1445 Ke386SaveFpuState(FxSaveAreaFrame);
1457 Ke386SaveFpuState(
FsContext->PfxSaveArea);
1492#if defined(__clang__)
1550 Ke386ClearFpExceptions();
1553 Ke386RestoreFpuState(
FsContext->PfxSaveArea);
1615 TargetAffinity &= ~Prcb->SetMember;
#define EFLAGS_INTERRUPT_MASK
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 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)
#define X86_FEATURE_XSAVE
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
#define X86_FEATURE_SYSCALL
#define X86_FEATURE_SSSE3
#define X86_FEATURE_RDRAND
VOID __cdecl KiTrap13(VOID)
VOID __cdecl KiTrap02(VOID)
VOID __cdecl KiTrap08(VOID)
VOID __cdecl KiFastCallEntry(VOID)
#define X86_FEATURE_SSE4_2
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea(IN PKTHREAD Thread)
#define X86_FEATURE_SSE4_1
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 KiSaveProcessorState(_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
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
ULONG_PTR NTAPI KeIpiGenericCall(_In_ PKIPI_BROADCAST_WORKER Function, _In_ ULONG_PTR Argument)
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 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 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" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\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
union _KGDTENTRY::@2464 HighWord
struct _KGDTENTRY::@2464::@2466 Bits
struct _KGDTENTRY::@2464::@2465 Bytes
ULONG SecondLevelCacheSize
UCHAR SecondLevelCacheAssociativity
UCHAR LogicalProcessorsPerPhysicalProcessor
struct _KTHREAD * NpxThread
LARGE_INTEGER UpdateSignature
KPROCESSOR_STATE ProcessorState
KSPECIAL_REGISTERS SpecialRegisters
union _LOADER_PARAMETER_BLOCK::@3390 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