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)
403#if (NTDDI_VERSION >= NTDDI_VISTA)
419 for (
ULONG i = 0;
i < CacheCount;
i++)
426 else if (CacheDescriptors[
i].
Level == 2)
434 DPRINT1(
"Prefetch Cache: %lu bytes\tL2 Cache: %lu bytes\tL2 Cache Line: %lu bytes\tL2 Cache Associativity: %lu\n",
470 TssEntry->LimitLow =
sizeof(
KTSS) - 1;
471 TssEntry->HighWord.Bits.LimitHi = 0;
479 p = (
PUCHAR)(Tss->IoMaps[0].DirectionMap);
488 p = Tss->IntDirectionMap;
548 Tss->Ss = Ke386GetSs();
578 Tss->Ss = Ke386GetSs();
598#if !defined(_GLOBAL_PAGES_ARE_AWESOME_)
679 ProcessorState->SpecialRegisters.Cr0 =
__readcr0();
680 ProcessorState->SpecialRegisters.Cr2 =
__readcr2();
681 ProcessorState->SpecialRegisters.Cr3 =
__readcr3();
686 ProcessorState->SpecialRegisters.KernelDr0 =
__readdr(0);
687 ProcessorState->SpecialRegisters.KernelDr1 =
__readdr(1);
688 ProcessorState->SpecialRegisters.KernelDr2 =
__readdr(2);
689 ProcessorState->SpecialRegisters.KernelDr3 =
__readdr(3);
690 ProcessorState->SpecialRegisters.KernelDr6 =
__readdr(6);
691 ProcessorState->SpecialRegisters.KernelDr7 =
__readdr(7);
696 __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
697 ProcessorState->SpecialRegisters.Tr = Ke386GetTr();
738 DPRINT1(
"Support for SYSENTER disabled.\n");
747 DPRINT(
"Support for SYSENTER detected.\n");
754 DPRINT1(
"No support for SYSENTER detected.\n");
823 IdtDescriptor.
Limit + 1);
877 static double Value1 = 4195835.0, Value2 = 3145727.0;
901 :
"=m" (ErrataPresent)
921 return ErrataPresent != 0;
967 Ke386FxSave(FxSaveArea);
975 Ke386FxStore(FxSaveArea);
996 if (SaveArea) Ke386FnSave(SaveArea);
1054#if defined(__clang__)
1133 Ke386SaveFpuState(FxSaveAreaFrame);
1145 Ke386SaveFpuState(
FsContext->PfxSaveArea);
1180#if defined(__clang__)
1238 Ke386ClearFpExceptions();
1241 Ke386RestoreFpuState(
FsContext->PfxSaveArea);
1303 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)
_In_ ULONG _In_ UCHAR Level
#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)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#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
ULONG NTAPI KiGetCpuCacheDescriptors(_Out_writes_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount, _In_ CPU_VENDORS Vendor)
Retrieves cache descriptors for the current CPU.
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::@2942::@2944 Bits
struct _KGDTENTRY::@2942::@2943 Bytes
union _KGDTENTRY::@2942 HighWord
ULONG SecondLevelCacheSize
UCHAR SecondLevelCacheAssociativity
CACHE_DESCRIPTOR Cache[5]
UCHAR LogicalProcessorsPerPhysicalProcessor
struct _KTHREAD * NpxThread
LARGE_INTEGER UpdateSignature
KPROCESSOR_STATE ProcessorState
KSPECIAL_REGISTERS SpecialRegisters
union _LOADER_PARAMETER_BLOCK::@4172 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)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql