58#define FXSAVE_ALIGN 15
110 Prcb->
CpuStep = ((Model << 8) | Stepping);
124 ULONG CpuFeatures = 0;
130 if (!Vendor)
return FeatureBits;
133 KiCpuId(&CpuInfo, 1);
148 KiCpuId(&DummyCpuInfo, 1);
158 if (((CpuInfo.
Eax & 0x0FF0) == 0x0610 && (CpuInfo.
Eax & 0x000F) <= 0x9) ||
159 ((CpuInfo.
Eax & 0x0FF0) == 0x0630 && (CpuInfo.
Eax & 0x000F) <= 0x4))
162 FeatureBits &= ~KF_WORKING_PTE;
170 CpuInfo.
Edx &= ~0x800;
179 if ((CpuInfo.
Eax & 0x0F00) == 0x0500)
182 switch (CpuInfo.
Eax & 0x00F0)
188 if ((CpuInfo.
Eax & 0x000F) > 0x03)
break;
194 CpuInfo.
Edx &= ~0x2000;
213 else if((CpuInfo.
Eax & 0x0F00) < 0x0500)
216 CpuInfo.
Edx &= ~(0x08 | 0x2000 | 0x8000);
219 ExtendedCPUID =
FALSE;
247 if ((CpuInfo.
Eax & 0x0FFF) >= 0x0542)
275 CpuFeatures = CpuInfo.
Edx;
314 KiCpuId(&CpuInfo, 0x80000000);
315 if ((CpuInfo.
Eax & 0xffffff00) == 0x80000000)
318 if (CpuInfo.
Eax >= 0x80000001)
321 KiCpuId(&CpuInfo, 0x80000001);
331 if (CpuInfo.
Edx & 0x80000000) FeatureBits |=
KF_3DNOW;
345KiReportCpuFeatures(
VOID)
347 ULONG CpuFeatures = 0;
352 KiCpuId(&CpuInfo, 1);
353 CpuFeatures = CpuInfo.
Edx;
356 DPRINT1(
"Supported CPU features:");
358#define print_kf_bit(kf_value) if (KeFeatureBits & kf_value) DbgPrint(" " #kf_value)
382#define print_cf(cpu_flag) if (CpuFeatures & cpu_flag) DbgPrint(" " #cpu_flag)
399 ULONG CacheRequests = 0,
i;
400 ULONG CurrentRegister;
401 UCHAR RegisterByte, Associativity = 0;
402 ULONG Size, CacheLine = 64, CurrentSize = 0;
415 KiCpuId(&CpuInfo, 0);
416 if (CpuInfo.
Eax >= 2)
422 KiCpuId(&CpuInfo, 2);
431 CacheRequests = CpuInfo.
Eax & 0xFF;
432 CpuInfo.
Eax &= 0xFFFFFF00;
439 for (
i = 0;
i < 4;
i++)
448 if (CurrentRegister & 0x80000000)
continue;
451 while (CurrentRegister)
454 RegisterByte = (
UCHAR)(CurrentRegister & 0xFF);
455 CurrentRegister >>= 8;
456 if (!RegisterByte)
continue;
459 switch (RegisterByte)
497 Size = (1 << (RegisterByte - 0x41)) * 128 * 1024;
501 Size = 3 * 1024 * 1024;
505 Size = 4 * 1024 * 1024;
509 Size = 6 * 1024 * 1024;
527 Size = (1 << (RegisterByte - 0x79)) * 128 * 1024;
542 Size = (1 << (RegisterByte - 0x82)) * 256 * 1024;
560 if (
Size && (
Size / Associativity) > CurrentSize)
563 CurrentSize =
Size / Associativity;
569 }
while (--CacheRequests);
576 KiCpuId(&CpuInfo, 0x80000000);
577 if (CpuInfo.
Eax >= 0x80000005)
580 KiCpuId(&CpuInfo, 0x80000005);
584 KiCpuId(&CpuInfo, 0x80000000);
585 if (CpuInfo.
Eax >= 0x80000006)
588 KiCpuId(&CpuInfo, 0x80000006);
591 CacheLine = CpuInfo.
Ecx & 0xFF;
594 RegisterByte = (CpuInfo.
Ecx >> 12) & 0xFF;
595 switch (RegisterByte)
620 Size = (CpuInfo.
Ecx >> 16) << 10;
648 DPRINT1(
"Prefetch Cache: %lu bytes\tL2 Cache: %lu bytes\tL2 Cache Line: %lu bytes\tL2 Cache Associativity: %lu\n",
684 TssEntry->LimitLow =
sizeof(
KTSS) - 1;
685 TssEntry->HighWord.Bits.LimitHi = 0;
693 p = (
PUCHAR)(Tss->IoMaps[0].DirectionMap);
702 p = Tss->IntDirectionMap;
762 Tss->Ss = Ke386GetSs();
792 Tss->Ss = Ke386GetSs();
812#if !defined(_GLOBAL_PAGES_ARE_AWESOME_)
893 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
894 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
895 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
900 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
901 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
902 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
903 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
904 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
905 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
910 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
911 ProcessorState->SpecialRegisters.Tr = Ke386GetTr();
952 DPRINT1(
"Support for SYSENTER disabled.\n");
961 DPRINT(
"Support for SYSENTER detected.\n");
968 DPRINT1(
"No support for SYSENTER detected.\n");
1037 IdtDescriptor.
Limit + 1);
1091 static double Value1 = 4195835.0, Value2 = 3145727.0;
1115 :
"=m" (ErrataPresent)
1135 return ErrataPresent != 0;
1181 Ke386FxSave(FxSaveArea);
1189 Ke386FxStore(FxSaveArea);
1210 if (SaveArea) Ke386FnSave(SaveArea);
1268#if defined(__clang__)
1347 Ke386SaveFpuState(FxSaveAreaFrame);
1359 Ke386SaveFpuState(
FsContext->PfxSaveArea);
1394#if defined(__clang__)
1452 Ke386ClearFpExceptions();
1455 Ke386RestoreFpuState(
FsContext->PfxSaveArea);
1517 TargetAffinity &= ~Prcb->SetMember;
#define EFLAGS_INTERRUPT_MASK
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
#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 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 __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)
#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 MiAddressToPte(x)
#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
VOID NTAPI KiGetCpuSignature(_Out_ PUSHORT Family, _Out_ PUSHORT Model, _Out_ PUSHORT Stepping)
Get the CPU signature.
VOID NTAPI KiGetCpuVendorString(_Out_writes_z_(CPU_VENDOR_STR_LEN) CHAR VendorString[CPU_VENDOR_STR_LEN])
Get the CPUID information for a given CPU.
CPU_VENDORS NTAPI KiIdentifyCpuVendor(_In_reads_z_(CPU_VENDOR_STR_LEN) const CHAR VendorString[CPU_VENDOR_STR_LEN])
Identify the CPU vendor by the vendor string.
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)
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)
VOID NTAPI KiGetCacheInformation(VOID)
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)
ULONG KiFastSystemCallDisable
VOID NTAPI KiInitializeTSS(IN PKTSS Tss)
VOID NTAPI KiInitializeTSS2(IN PKTSS Tss, IN PKGDTENTRY TssEntry OPTIONAL)
ULONG KePrefetchNTAGranularity
VOID NTAPI KiCoprocessorError(VOID)
static ULONG KiGetCpuVendor(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)
BOOLEAN KiFastCallCopyDoneOnce
VOID NTAPI KiFlushTargetEntireTb(IN PKIPI_CONTEXT PacketContext, IN PVOID Ignored1, IN PVOID Ignored2, IN PVOID Ignored3)
UCHAR KiSystemCallExitAdjusted
UCHAR KiSystemCallExitAdjust
ULONG_PTR NTAPI Ki386EnableDE(IN ULONG_PTR Context)
UCHAR KiNMITSS[KTSS_IO_MAPS]
NTSYSAPI PLOADER_PARAMETER_BLOCK KeLoaderBlock
#define READ_PORT_UCHAR(p)
#define WRITE_PORT_UCHAR(p, d)
#define RtlFillMemory(Dest, Length, Fill)
__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" "\tpush %rbx\n" "\t.seh_pushreg %rbx\n" "\tpush %rdi\n" "\t.seh_pushreg %rdi\n" "\tpush %rsi\n" "\t.seh_pushreg %rsi\n" "\tpush %r12\n" "\t.seh_pushreg %r12\n" "\tpush %r13\n" "\t.seh_pushreg %r13\n" "\tpush %r14\n" "\t.seh_pushreg %r14\n" "\tpush %r15\n" "\t.seh_pushreg %r15\n" "\tsub $40, %rsp\n" "\t.seh_stackalloc 40\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 $40, %rsp\n" "\tpop %r15\n" "\tpop %r14\n" "\tpop %r13\n" "\tpop %r12\n" "\tpop %rsi\n" "\tpop %rdi\n" "\tpop %rbx\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
void __cdecl _disable(void)
void __cdecl _enable(void)
PULONG MinorVersion OPTIONAL
struct _KGDTENTRY::@2708::@2710 Bits
struct _KGDTENTRY::@2708::@2709 Bytes
union _KGDTENTRY::@2708 HighWord
ULONG SecondLevelCacheSize
UCHAR SecondLevelCacheAssociativity
UCHAR LogicalProcessorsPerPhysicalProcessor
struct _KTHREAD * NpxThread
LARGE_INTEGER UpdateSignature
KPROCESSOR_STATE ProcessorState
KSPECIAL_REGISTERS SpecialRegisters
union _LOADER_PARAMETER_BLOCK::@3668 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