ReactOS 0.4.17-dev-1190-g4c812f4
ke.h File Reference
#include "intrin_i.h"
#include "trap_x.h"
Include dependency graph for ke.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

union  _KTRAP_EXIT_SKIP_BITS
 
struct  _KV86_FRAME
 
struct  _KV8086_STACK_FRAME
 
struct  _LARGE_IDENTITY_MAP
 
struct  _FLOATING_SAVE_CONTEXT
 

Macros

#define DR_MASK(x)   (1 << (x))
 
#define DR_REG_MASK   0x4F
 
#define KD_BREAKPOINT_TYPE   UCHAR
 
#define KD_BREAKPOINT_SIZE   sizeof(UCHAR)
 
#define KD_BREAKPOINT_VALUE   0xCC
 
#define X86_FEATURE_SSE3   0x00000001
 
#define X86_FEATURE_SSSE3   0x00000200
 
#define X86_FEATURE_SSE4_1   0x00080000
 
#define X86_FEATURE_SSE4_2   0x00100000
 
#define X86_FEATURE_XSAVE   0x04000000
 
#define X86_FEATURE_RDRAND   0x40000000
 
#define X86_FEATURE_FPU   0x00000001 /* x87 FPU is present */
 
#define X86_FEATURE_VME   0x00000002 /* Virtual 8086 Extensions are present */
 
#define X86_FEATURE_DBG   0x00000004 /* Debugging extensions are present */
 
#define X86_FEATURE_PSE   0x00000008 /* Page Size Extension is present */
 
#define X86_FEATURE_TSC   0x00000010 /* Time Stamp Counters are present */
 
#define X86_FEATURE_PAE   0x00000040 /* Physical Address Extension is present */
 
#define X86_FEATURE_CX8   0x00000100 /* CMPXCHG8B instruction present */
 
#define X86_FEATURE_APIC   0x00000200 /* APIC is present */
 
#define X86_FEATURE_SYSCALL   0x00000800 /* SYSCALL/SYSRET support present */
 
#define X86_FEATURE_MTRR   0x00001000 /* Memory type range registers are present */
 
#define X86_FEATURE_PGE   0x00002000 /* Page Global Enable */
 
#define X86_FEATURE_CMOV   0x00008000 /* "Conditional move" instruction supported */
 
#define X86_FEATURE_PAT   0x00010000 /* Page Attribute Table is supported */
 
#define X86_FEATURE_DS   0x00200000 /* Debug Store is present */
 
#define X86_FEATURE_MMX   0x00800000 /* MMX extension present */
 
#define X86_FEATURE_FXSR   0x01000000 /* FXSAVE/FXRSTOR instructions present */
 
#define X86_FEATURE_SSE   0x02000000 /* SSE extension present */
 
#define X86_FEATURE_SSE2   0x04000000 /* SSE2 extension present */
 
#define X86_FEATURE_HT   0x10000000 /* Hyper-Threading present */
 
#define X86_FEATURE_NX   0x00100000 /* NX support present */
 
#define KeGetTrapFrame(Thread)
 
#define KeGetExceptionFrame(Thread)    NULL
 
#define KeGetContextSwitches(Prcb)    CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
 
#define KiGetSecondLevelDCacheSize()   ((PKIPCR)KeGetPcr())->SecondLevelCacheSize
 
#define KeGetTrapFrameInterruptState(TrapFrame)    BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
 
#define KTE_SKIP_PM_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipPreviousMode = TRUE } }).Bits)
 
#define KTE_SKIP_SEG_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipSegments = TRUE } }).Bits)
 
#define KTE_SKIP_VOL_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipVolatiles = TRUE } }).Bits)
 
#define PFX_FLAG_ES   0x00000100
 
#define PFX_FLAG_CS   0x00000200
 
#define PFX_FLAG_SS   0x00000400
 
#define PFX_FLAG_DS   0x00000800
 
#define PFX_FLAG_FS   0x00001000
 
#define PFX_FLAG_GS   0x00002000
 
#define PFX_FLAG_OPER32   0x00004000
 
#define PFX_FLAG_ADDR32   0x00008000
 
#define PFX_FLAG_LOCK   0x00010000
 
#define PFX_FLAG_REPNE   0x00020000
 
#define PFX_FLAG_REP   0x00040000
 
#define KiCallVdmHandler(x)   KiVdmOpcode##x(TrapFrame, Flags)
 
#define KiCallVdmPrefixHandler(x)   KiVdmOpcodePrefix(TrapFrame, Flags | x)
 
#define KiVdmUnhandledOpcode(x)
 

Typedefs

typedef union _KTRAP_EXIT_SKIP_BITS KTRAP_EXIT_SKIP_BITS
 
typedef union _KTRAP_EXIT_SKIP_BITS * PKTRAP_EXIT_SKIP_BITS
 
typedef struct _KV86_FRAME KV86_FRAME
 
typedef struct _KV86_FRAME * PKV86_FRAME
 
typedef struct _KV8086_STACK_FRAME KV8086_STACK_FRAME
 
typedef struct _KV8086_STACK_FRAME * PKV8086_STACK_FRAME
 
typedef struct _LARGE_IDENTITY_MAP LARGE_IDENTITY_MAP
 
typedef struct _LARGE_IDENTITY_MAP * PLARGE_IDENTITY_MAP
 
typedef struct _FLOATING_SAVE_CONTEXT FLOATING_SAVE_CONTEXT
 
typedef struct _FLOATING_SAVE_CONTEXT * PFLOATING_SAVE_CONTEXT
 

Functions

FORCEINLINE ULONG_PTR KeGetContextPc (PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextPc (PCONTEXT Context, ULONG_PTR ProgramCounter)
 
FORCEINLINE ULONG_PTR KeGetContextReturnRegister (PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextReturnRegister (PCONTEXT Context, ULONG_PTR ReturnValue)
 
FORCEINLINE ULONG_PTR KeGetContextFrameRegister (PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextFrameRegister (PCONTEXT Context, ULONG_PTR Frame)
 
FORCEINLINE ULONG_PTR KeGetTrapFramePc (PKTRAP_FRAME TrapFrame)
 
FORCEINLINE PKTRAP_FRAME KiGetLinkedTrapFrame (PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister (PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG_PTR KeGetTrapFrameFrameRegister (PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG64 KxQueryProcessorCycleTime (VOID)
 
FORCEINLINE ULONG KiVdmSetVdmEFlags (ULONG EFlags)
 
FORCEINLINE ULONG KiVdmClearVdmEFlags (ULONG EFlags)
 
 C_ASSERT (NPX_FRAME_LENGTH==sizeof(FX_SAVE_AREA))
 
FORCEINLINE BOOLEAN KeDisableInterrupts (VOID)
 
FORCEINLINE VOID KeRestoreInterrupts (BOOLEAN WereEnabled)
 
FORCEINLINE VOID KeRegisterInterruptHandler (IN ULONG Vector, IN PVOID Handler)
 
FORCEINLINE PVOID KeQueryInterruptHandler (IN ULONG Vector)
 
FORCEINLINE VOID KeInvalidateTlbEntry (IN PVOID Address)
 
FORCEINLINE VOID KeFlushProcessTb (VOID)
 
FORCEINLINE VOID KeSweepICache (IN PVOID BaseAddress, IN SIZE_T FlushSize)
 
FORCEINLINE PRKTHREAD KeGetCurrentThread (VOID)
 
FORCEINLINE VOID KiRundownThread (IN PKTHREAD Thread)
 
VOID NTAPI KiInitializePcr (IN ULONG ProcessorNumber, IN PKIPCR Pcr, IN PKIDTENTRY Idt, IN PKGDTENTRY Gdt, IN PKTSS Tss, IN PKTHREAD IdleThread, IN PVOID DpcStack)
 
FORCEINLINE VOID Ke386SetGdtEntryBase (PKGDTENTRY GdtEntry, PVOID BaseAddress)
 
FORCEINLINE VOID KiSetTebBase (PKPCR Pcr, PNT_TIB TebAddress)
 
VOID FASTCALL Ki386InitializeTss (IN PKTSS Tss, IN PKIDTENTRY Idt, IN PKGDTENTRY Gdt)
 
VOID NTAPI KiSetCR0Bits (VOID)
 
VOID NTAPI KiGetCacheInformation (VOID)
 
BOOLEAN NTAPI KiIsNpxPresent (VOID)
 
BOOLEAN NTAPI KiIsNpxErrataPresent (VOID)
 
VOID NTAPI KiSetProcessorType (VOID)
 
ULONG64 NTAPI KiGetFeatureBits (VOID)
 Evaluates the KeFeatureFlag bits for the current CPU.
 
VOID NTAPI KiThreadStartup (VOID)
 
NTSTATUS NTAPI Ke386GetGdtEntryThread (IN PKTHREAD Thread, IN ULONG Offset, IN PKGDTENTRY Descriptor)
 
VOID NTAPI KiFlushNPXState (IN FLOATING_SAVE_AREA *SaveArea)
 
VOID NTAPI Ki386AdjustEsp0 (IN PKTRAP_FRAME TrapFrame)
 
VOID NTAPI Ki386SetupAndExitToV86Mode (OUT PTEB VdmTeb)
 
VOID NTAPI KeI386VdmInitialize (VOID)
 
ULONG_PTR NTAPI Ki386EnableGlobalPage (IN ULONG_PTR Context)
 
ULONG_PTR NTAPI Ki386EnableTargetLargePage (IN ULONG_PTR Context)
 
BOOLEAN NTAPI Ki386CreateIdentityMap (IN PLARGE_IDENTITY_MAP IdentityMap, IN PVOID StartPtr, IN ULONG Length)
 
VOID NTAPI Ki386FreeIdentityMap (IN PLARGE_IDENTITY_MAP IdentityMap)
 
VOID NTAPI Ki386EnableCurrentLargePage (IN ULONG_PTR StartAddress, IN ULONG Cr3)
 
VOID NTAPI KiI386PentiumLockErrataFixup (VOID)
 
VOID NTAPI KiInitializePAT (VOID)
 
VOID NTAPI KiInitializeMTRR (IN BOOLEAN FinalCpu)
 
VOID NTAPI KiAmdK6InitializeMTRR (VOID)
 
VOID NTAPI KiRestoreFastSyscallReturnState (VOID)
 
ULONG_PTR NTAPI Ki386EnableDE (IN ULONG_PTR Context)
 
ULONG_PTR NTAPI Ki386EnableFxsr (IN ULONG_PTR Context)
 
ULONG_PTR NTAPI Ki386EnableXMMIExceptions (IN ULONG_PTR Context)
 
BOOLEAN NTAPI VdmDispatchBop (IN PKTRAP_FRAME TrapFrame)
 
BOOLEAN NTAPI VdmDispatchPageFault (_In_ PKTRAP_FRAME TrapFrame)
 
BOOLEAN FASTCALL KiVdmOpcodePrefix (IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
 
BOOLEAN FASTCALL Ki386HandleOpcodeV86 (IN PKTRAP_FRAME TrapFrame)
 
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper (IN PKTRAP_FRAME TrapFrame)
 
VOID FASTCALL Ki386BiosCallReturnAddress (IN PKTRAP_FRAME TrapFrame)
 
ULONG_PTR FASTCALL KiExitV86Mode (IN PKTRAP_FRAME TrapFrame)
 
DECLSPEC_NORETURN VOID NTAPI KiDispatchExceptionFromTrapFrame (IN NTSTATUS Code, IN ULONG Flags, IN ULONG_PTR Address, IN ULONG ParameterCount, IN ULONG_PTR Parameter1, IN ULONG_PTR Parameter2, IN ULONG_PTR Parameter3, IN PKTRAP_FRAME TrapFrame)
 
NTSTATUS NTAPI KiConvertToGuiThread (VOID)
 
DECLSPEC_NORETURN VOID FASTCALL KiServiceExit (IN PKTRAP_FRAME TrapFrame, IN NTSTATUS Status)
 
DECLSPEC_NORETURN VOID FASTCALL KiServiceExit2 (IN PKTRAP_FRAME TrapFrame)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiExceptionExit (_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
 
VOID __cdecl KiTrap02 (VOID)
 
VOID __cdecl KiTrap08 (VOID)
 
VOID __cdecl KiTrap13 (VOID)
 
VOID __cdecl KiFastCallEntry (VOID)
 
VOID NTAPI ExpInterlockedPopEntrySListFault (VOID)
 
VOID NTAPI ExpInterlockedPopEntrySListResume (VOID)
 
VOID __cdecl CopyParams (VOID)
 
VOID __cdecl ReadBatch (VOID)
 
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea (IN PKTHREAD Thread)
 
FORCEINLINE ULONG Ke386SanitizeSeg (IN ULONG Cs, IN KPROCESSOR_MODE Mode)
 
FORCEINLINE ULONG Ke386SanitizeFlags (IN ULONG Eflags, IN KPROCESSOR_MODE Mode)
 
FORCEINLINE PVOID Ke386SanitizeDr (IN PVOID DrAddress, IN KPROCESSOR_MODE Mode)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException0Args (IN NTSTATUS Code, IN ULONG_PTR Address, IN PKTRAP_FRAME TrapFrame)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException1Args (IN NTSTATUS Code, IN ULONG_PTR Address, IN ULONG P1, IN PKTRAP_FRAME TrapFrame)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException2Args (IN NTSTATUS Code, IN ULONG_PTR Address, IN ULONG P1, IN ULONG P2, IN PKTRAP_FRAME TrapFrame)
 
NTSTATUS NTAPI KiSystemCallTrampoline (_In_ PVOID Handler, _In_ PVOID Arguments, _In_ ULONG StackBytes)
 
FORCEINLINE VOID KiCheckForApcDelivery (IN PKTRAP_FRAME TrapFrame)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiSwitchToBootStack (IN ULONG_PTR InitialStack)
 
FORCEINLINE DECLSPEC_NORETURN VOID KiIret (VOID)
 
FORCEINLINE VOID KiEndInterrupt (IN KIRQL Irql, IN PKTRAP_FRAME TrapFrame)
 
FORCEINLINE VOID Ki386PerfEnd (VOID)
 
FORCEINLINE PULONG KiGetUserModeStackAddress (void)
 

Variables

const PULONG KiNtVdmState
 
PVOID Ki386IopmSaveArea
 
ULONG KeI386EFlagsAndMaskV86
 
ULONG KeI386EFlagsOrMaskV86
 
BOOLEAN KeI386VirtualIntExtensions
 
KIDTENTRY KiIdt [MAXIMUM_IDTVECTOR+1]
 
KDESCRIPTOR KiIdtDescriptor
 
BOOLEAN KiI386PentiumLockErrataPresent
 
ULONG KeI386NpxPresent
 
ULONG KeI386XMMIPresent
 
ULONG KeI386FxsrPresent
 
ULONG KiMXCsrMask
 
ULONG KeI386CpuType
 
ULONG KeI386CpuStep
 
ULONG KeI386MachineType
 
ULONG KiFastSystemCallDisable
 
UCHAR KiDebugRegisterTrapOffsets [9]
 
UCHAR KiDebugRegisterContextOffsets [9]
 
CHAR KiSystemCallExitBranch []
 
CHAR KiSystemCallExit []
 
CHAR KiSystemCallExit2 []
 

Macro Definition Documentation

◆ DR_MASK

#define DR_MASK (   x)    (1 << (x))

Definition at line 15 of file ke.h.

◆ DR_REG_MASK

#define DR_REG_MASK   0x4F

Definition at line 16 of file ke.h.

◆ KD_BREAKPOINT_SIZE

#define KD_BREAKPOINT_SIZE   sizeof(UCHAR)

Definition at line 22 of file ke.h.

◆ KD_BREAKPOINT_TYPE

#define KD_BREAKPOINT_TYPE   UCHAR

Definition at line 21 of file ke.h.

◆ KD_BREAKPOINT_VALUE

#define KD_BREAKPOINT_VALUE   0xCC

Definition at line 23 of file ke.h.

◆ KeGetContextSwitches

#define KeGetContextSwitches (   Prcb)     CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches

Definition at line 156 of file ke.h.

◆ KeGetExceptionFrame

#define KeGetExceptionFrame (   Thread)     NULL

Definition at line 149 of file ke.h.

◆ KeGetTrapFrame

#define KeGetTrapFrame (   Thread)
Value:
(PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \
sizeof(KTRAP_FRAME) - \
sizeof(FX_SAVE_AREA))
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
struct _KTRAP_FRAME * PKTRAP_FRAME
uint32_t ULONG_PTR
Definition: typedefs.h:65

Definition at line 144 of file ke.h.

◆ KeGetTrapFrameInterruptState

#define KeGetTrapFrameInterruptState (   TrapFrame)     BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)

Definition at line 169 of file ke.h.

◆ KiCallVdmHandler

#define KiCallVdmHandler (   x)    KiVdmOpcode##x(TrapFrame, Flags)

Definition at line 250 of file ke.h.

◆ KiCallVdmPrefixHandler

#define KiCallVdmPrefixHandler (   x)    KiVdmOpcodePrefix(TrapFrame, Flags | x)

Definition at line 251 of file ke.h.

◆ KiGetSecondLevelDCacheSize

#define KiGetSecondLevelDCacheSize ( )    ((PKIPCR)KeGetPcr())->SecondLevelCacheSize

Definition at line 163 of file ke.h.

◆ KiVdmUnhandledOpcode

#define KiVdmUnhandledOpcode (   x)
Value:
BOOLEAN \
FASTCALL \
KiVdmOpcode##x(IN PKTRAP_FRAME TrapFrame, \
{ \
/* Not yet handled */ \
UNIMPLEMENTED_DBGBREAK(); \
return FALSE; \
}
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define FALSE
Definition: types.h:117
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59

Definition at line 252 of file ke.h.

◆ KTE_SKIP_PM_BIT

#define KTE_SKIP_PM_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipPreviousMode = TRUE } }).Bits)

Definition at line 175 of file ke.h.

◆ KTE_SKIP_SEG_BIT

#define KTE_SKIP_SEG_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipSegments = TRUE } }).Bits)

Definition at line 176 of file ke.h.

◆ KTE_SKIP_VOL_BIT

#define KTE_SKIP_VOL_BIT   (((KTRAP_EXIT_SKIP_BITS) { { .SkipVolatiles = TRUE } }).Bits)

Definition at line 177 of file ke.h.

◆ PFX_FLAG_ADDR32

#define PFX_FLAG_ADDR32   0x00008000

Definition at line 202 of file ke.h.

◆ PFX_FLAG_CS

#define PFX_FLAG_CS   0x00000200

Definition at line 196 of file ke.h.

◆ PFX_FLAG_DS

#define PFX_FLAG_DS   0x00000800

Definition at line 198 of file ke.h.

◆ PFX_FLAG_ES

#define PFX_FLAG_ES   0x00000100

Definition at line 195 of file ke.h.

◆ PFX_FLAG_FS

#define PFX_FLAG_FS   0x00001000

Definition at line 199 of file ke.h.

◆ PFX_FLAG_GS

#define PFX_FLAG_GS   0x00002000

Definition at line 200 of file ke.h.

◆ PFX_FLAG_LOCK

#define PFX_FLAG_LOCK   0x00010000

Definition at line 203 of file ke.h.

◆ PFX_FLAG_OPER32

#define PFX_FLAG_OPER32   0x00004000

Definition at line 201 of file ke.h.

◆ PFX_FLAG_REP

#define PFX_FLAG_REP   0x00040000

Definition at line 205 of file ke.h.

◆ PFX_FLAG_REPNE

#define PFX_FLAG_REPNE   0x00020000

Definition at line 204 of file ke.h.

◆ PFX_FLAG_SS

#define PFX_FLAG_SS   0x00000400

Definition at line 197 of file ke.h.

◆ X86_FEATURE_APIC

#define X86_FEATURE_APIC   0x00000200 /* APIC is present */

Definition at line 41 of file ke.h.

◆ X86_FEATURE_CMOV

#define X86_FEATURE_CMOV   0x00008000 /* "Conditional move" instruction supported */

Definition at line 45 of file ke.h.

◆ X86_FEATURE_CX8

#define X86_FEATURE_CX8   0x00000100 /* CMPXCHG8B instruction present */

Definition at line 40 of file ke.h.

◆ X86_FEATURE_DBG

#define X86_FEATURE_DBG   0x00000004 /* Debugging extensions are present */

Definition at line 36 of file ke.h.

◆ X86_FEATURE_DS

#define X86_FEATURE_DS   0x00200000 /* Debug Store is present */

Definition at line 47 of file ke.h.

◆ X86_FEATURE_FPU

#define X86_FEATURE_FPU   0x00000001 /* x87 FPU is present */

Definition at line 34 of file ke.h.

◆ X86_FEATURE_FXSR

#define X86_FEATURE_FXSR   0x01000000 /* FXSAVE/FXRSTOR instructions present */

Definition at line 49 of file ke.h.

◆ X86_FEATURE_HT

#define X86_FEATURE_HT   0x10000000 /* Hyper-Threading present */

Definition at line 52 of file ke.h.

◆ X86_FEATURE_MMX

#define X86_FEATURE_MMX   0x00800000 /* MMX extension present */

Definition at line 48 of file ke.h.

◆ X86_FEATURE_MTRR

#define X86_FEATURE_MTRR   0x00001000 /* Memory type range registers are present */

Definition at line 43 of file ke.h.

◆ X86_FEATURE_NX

#define X86_FEATURE_NX   0x00100000 /* NX support present */

Definition at line 55 of file ke.h.

◆ X86_FEATURE_PAE

#define X86_FEATURE_PAE   0x00000040 /* Physical Address Extension is present */

Definition at line 39 of file ke.h.

◆ X86_FEATURE_PAT

#define X86_FEATURE_PAT   0x00010000 /* Page Attribute Table is supported */

Definition at line 46 of file ke.h.

◆ X86_FEATURE_PGE

#define X86_FEATURE_PGE   0x00002000 /* Page Global Enable */

Definition at line 44 of file ke.h.

◆ X86_FEATURE_PSE

#define X86_FEATURE_PSE   0x00000008 /* Page Size Extension is present */

Definition at line 37 of file ke.h.

◆ X86_FEATURE_RDRAND

#define X86_FEATURE_RDRAND   0x40000000

Definition at line 31 of file ke.h.

◆ X86_FEATURE_SSE

#define X86_FEATURE_SSE   0x02000000 /* SSE extension present */

Definition at line 50 of file ke.h.

◆ X86_FEATURE_SSE2

#define X86_FEATURE_SSE2   0x04000000 /* SSE2 extension present */

Definition at line 51 of file ke.h.

◆ X86_FEATURE_SSE3

#define X86_FEATURE_SSE3   0x00000001

Definition at line 26 of file ke.h.

◆ X86_FEATURE_SSE4_1

#define X86_FEATURE_SSE4_1   0x00080000

Definition at line 28 of file ke.h.

◆ X86_FEATURE_SSE4_2

#define X86_FEATURE_SSE4_2   0x00100000

Definition at line 29 of file ke.h.

◆ X86_FEATURE_SSSE3

#define X86_FEATURE_SSSE3   0x00000200

Definition at line 27 of file ke.h.

◆ X86_FEATURE_SYSCALL

#define X86_FEATURE_SYSCALL   0x00000800 /* SYSCALL/SYSRET support present */

Definition at line 42 of file ke.h.

◆ X86_FEATURE_TSC

#define X86_FEATURE_TSC   0x00000010 /* Time Stamp Counters are present */

Definition at line 38 of file ke.h.

◆ X86_FEATURE_VME

#define X86_FEATURE_VME   0x00000002 /* Virtual 8086 Extensions are present */

Definition at line 35 of file ke.h.

◆ X86_FEATURE_XSAVE

#define X86_FEATURE_XSAVE   0x04000000

Definition at line 30 of file ke.h.

Typedef Documentation

◆ FLOATING_SAVE_CONTEXT

◆ KTRAP_EXIT_SKIP_BITS

◆ KV8086_STACK_FRAME

◆ KV86_FRAME

◆ LARGE_IDENTITY_MAP

◆ PFLOATING_SAVE_CONTEXT

◆ PKTRAP_EXIT_SKIP_BITS

◆ PKV8086_STACK_FRAME

◆ PKV86_FRAME

◆ PLARGE_IDENTITY_MAP

Function Documentation

◆ C_ASSERT()

◆ CopyParams()

VOID __cdecl CopyParams ( VOID  )

Referenced by KiTrap0EHandler().

◆ ExpInterlockedPopEntrySListFault()

VOID NTAPI ExpInterlockedPopEntrySListFault ( VOID  )

◆ ExpInterlockedPopEntrySListResume()

VOID NTAPI ExpInterlockedPopEntrySListResume ( VOID  )

Referenced by KiCheckForSListFault().

◆ Ke386GetGdtEntryThread()

NTSTATUS NTAPI Ke386GetGdtEntryThread ( IN PKTHREAD  Thread,
IN ULONG  Offset,
IN PKGDTENTRY  Descriptor 
)

Definition at line 26 of file ldt.c.

29{
30 /* Make sure the offset isn't outside the allowed range */
31 if (Offset >= (KGDT_NUMBER * sizeof(KGDTENTRY)))
32 {
33 /* It is, fail */
35 }
36
37 /* Check if this is the LDT selector */
38 if (Offset == KGDT_LDT)
39 {
40 /* Get it from the thread's process */
42 &Thread->Process->LdtDescriptor,
43 sizeof(KGDTENTRY));
44 }
45 else
46 {
47 /* Get the descriptor entry from the GDT */
49 (PVOID)(((ULONG_PTR)KeGetPcr()->GDT) + Offset),
50 sizeof(KGDTENTRY));
51
52 /* Check if this is the TEB selector */
53 if (Offset == KGDT_R3_TEB)
54 {
55 /*
56 * Make sure we set the correct base for this thread. This is per
57 * process and is set in the GDT on context switch, so it might not
58 * be correct for the thread specified.
59 */
60 Descriptor->BaseLow =
61 (USHORT)((ULONG_PTR)(Thread->Teb) & 0xFFFF);
62 Descriptor->HighWord.Bytes.BaseMid =
63 (UCHAR)((ULONG_PTR)(Thread->Teb) >> 16);
64 Descriptor->HighWord.Bytes.BaseHi =
65 (UCHAR)((ULONG_PTR)(Thread->Teb) >> 24);
66 }
67 }
68
69 /* Success */
70 return STATUS_SUCCESS;
71}
#define KGDT_R3_TEB
#define STATUS_ACCESS_VIOLATION
#define KeGetPcr()
Definition: ketypes.h:81
#define KGDT_NUMBER
Definition: ketypes.h:138
#define KGDT_LDT
Definition: ketypes.h:131
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
unsigned short USHORT
Definition: pedump.c:61
#define STATUS_SUCCESS
Definition: shellext.h:65
unsigned char UCHAR
Definition: typedefs.h:53
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342

Referenced by PspQueryDescriptorThread().

◆ Ke386SanitizeDr()

FORCEINLINE PVOID Ke386SanitizeDr ( IN PVOID  DrAddress,
IN KPROCESSOR_MODE  Mode 
)

Definition at line 814 of file ke.h.

816{
817 //
818 // Check if we're in kernel-mode, and return the address directly if so.
819 // Otherwise, make sure it's not inside the kernel-mode address space.
820 // If it is, then clear the address.
821 //
822 return ((Mode == KernelMode) ? DrAddress :
823 (DrAddress <= MM_HIGHEST_USER_ADDRESS) ? DrAddress : 0);
824}
#define MM_HIGHEST_USER_ADDRESS
Definition: armddk.h:17
_In_ ULONG Mode
Definition: hubbusif.h:303
#define KernelMode
Definition: asm.h:38

◆ Ke386SanitizeFlags()

FORCEINLINE ULONG Ke386SanitizeFlags ( IN ULONG  Eflags,
IN KPROCESSOR_MODE  Mode 
)

Definition at line 797 of file ke.h.

799{
800 //
801 // Check if we're in kernel-mode, and sanitize EFLAGS if so.
802 // Otherwise, also force interrupt mask on.
803 //
804 return ((Mode == KernelMode) ?
807}
#define EFLAGS_INTERRUPT_MASK
#define EFLAGS_USER_SANITIZE
Definition: ketypes.h:212

Referenced by KeContextToTrapFrame(), and KiInitializeUserApc().

◆ Ke386SanitizeSeg()

FORCEINLINE ULONG Ke386SanitizeSeg ( IN ULONG  Cs,
IN KPROCESSOR_MODE  Mode 
)

Definition at line 780 of file ke.h.

782{
783 //
784 // Check if we're in kernel-mode, and force CPL 0 if so.
785 // Otherwise, force CPL 3.
786 //
787 return ((Mode == KernelMode) ?
788 (Cs & (0xFFFF & ~RPL_MASK)) :
789 (RPL_MASK | (Cs & 0xFFFF)));
790}
#define RPL_MASK

Referenced by KeContextToTrapFrame(), KiDispatchException(), and KiInitializeUserApc().

◆ Ke386SetGdtEntryBase()

FORCEINLINE VOID Ke386SetGdtEntryBase ( PKGDTENTRY  GdtEntry,
PVOID  BaseAddress 
)

Definition at line 446 of file ke.h.

447{
448 GdtEntry->BaseLow = (USHORT)((ULONG_PTR)BaseAddress & 0xFFFF);
449 GdtEntry->HighWord.Bytes.BaseMid = (UCHAR)((ULONG_PTR)BaseAddress >> 16);
450 GdtEntry->HighWord.Bytes.BaseHi = (UCHAR)((ULONG_PTR)BaseAddress >> 24);
451}
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize _Pre_valid_ PVOID * BaseAddress
Definition: mmfuncs.h:408
USHORT BaseLow
Definition: ketypes.h:401
struct _KGDTENTRY::@2942::@2943 Bytes
union _KGDTENTRY::@2942 HighWord

Referenced by KiSetTebBase().

◆ KeDisableInterrupts()

FORCEINLINE BOOLEAN KeDisableInterrupts ( VOID  )

Definition at line 311 of file ke.h.

312{
313 ULONG Flags;
314 BOOLEAN Return;
315
316 /* Get EFLAGS and check if the interrupt bit is set */
318 Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
319
320 /* Disable interrupts */
321 _disable();
322 return Return;
323}
unsigned char BOOLEAN
Definition: actypes.h:127
#define TRUE
Definition: types.h:120
__INTRIN_INLINE uintptr_t __readeflags(void)
Definition: intrin_x86.h:1706
void __cdecl _disable(void)
Definition: intrin_arm.h:365

◆ KeFlushProcessTb()

FORCEINLINE VOID KeFlushProcessTb ( VOID  )

Definition at line 393 of file ke.h.

394{
395 /* Flush the TLB by resetting CR3 */
397}
__INTRIN_INLINE unsigned long __readcr3(void)
Definition: intrin_x86.h:1850
__INTRIN_INLINE void __writecr3(unsigned int Data)
Definition: intrin_x86.h:1826

◆ KeGetContextFrameRegister()

FORCEINLINE ULONG_PTR KeGetContextFrameRegister ( PCONTEXT  Context)

Definition at line 90 of file ke.h.

91{
92 return Context->Ebp;
93}
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81

◆ KeGetContextPc()

FORCEINLINE ULONG_PTR KeGetContextPc ( PCONTEXT  Context)

Definition at line 62 of file ke.h.

63{
64 return Context->Eip;
65}

◆ KeGetContextReturnRegister()

FORCEINLINE ULONG_PTR KeGetContextReturnRegister ( PCONTEXT  Context)

Definition at line 76 of file ke.h.

77{
78 return Context->Eax;
79}

◆ KeGetCurrentThread()

FORCEINLINE PRKTHREAD KeGetCurrentThread ( VOID  )

Definition at line 414 of file ke.h.

415{
416 /* Return the current thread */
417 return ((PKIPCR)KeGetPcr())->PrcbData.CurrentThread;
418}

◆ KeGetTrapFrameFrameRegister()

FORCEINLINE ULONG_PTR KeGetTrapFrameFrameRegister ( PKTRAP_FRAME  TrapFrame)

Definition at line 128 of file ke.h.

129{
130 return TrapFrame->Ebp;
131}
ULONG Ebp
Definition: ketypes.h:330

◆ KeGetTrapFramePc()

FORCEINLINE ULONG_PTR KeGetTrapFramePc ( PKTRAP_FRAME  TrapFrame)

Definition at line 104 of file ke.h.

105{
106 return TrapFrame->Eip;
107}
ULONG Eip
Definition: ketypes.h:332

◆ KeGetTrapFrameStackRegister()

FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister ( PKTRAP_FRAME  TrapFrame)

Definition at line 119 of file ke.h.

120{
121 if (TrapFrame->PreviousPreviousMode == KernelMode)
122 return TrapFrame->TempEsp;
123 return TrapFrame->HardwareEsp;
124}
ULONG TempEsp
Definition: ketypes.h:311
ULONG PreviousPreviousMode
Definition: ketypes.h:324
ULONG HardwareEsp
Definition: ketypes.h:335

◆ KeI386VdmInitialize()

VOID NTAPI KeI386VdmInitialize ( VOID  )

Definition at line 42 of file vdmmain.c.

43{
48 UCHAR KeyValueInfo[sizeof(KEY_VALUE_BASIC_INFORMATION) + 30];
50
51 /* Make sure that there is a WOW key */
53 L"\\Registry\\Machine\\System\\CurrentControlSet\\"
54 L"Control\\Wow");
56 &Name,
58 NULL,
59 NULL);
61 if (!NT_SUCCESS(Status)) return;
62
63 /* Check if VME is enabled */
64 RtlInitUnicodeString(&Name, L"DisableVme");
65 Status = ZwQueryValueKey(RegHandle,
66 &Name,
68 &KeyValueInfo,
69 sizeof(KeyValueInfo),
71 if (!NT_SUCCESS(Status))
72 {
73 /* Not present, so check if the CPU supports VME */
74 if (KeGetPcr()->Prcb->FeatureBits & KF_V86_VIS)
75 {
76 /* Enable them. FIXME: Use IPI */
79 }
80 }
81
82 /* Close the key */
84}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
LONG NTSTATUS
Definition: precomp.h:26
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
Status
Definition: gdiplustypes.h:24
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
#define KF_V86_VIS
Definition: ketypes.h:30
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
struct _KEY_VALUE_BASIC_INFORMATION KEY_VALUE_BASIC_INFORMATION
@ KeyValueBasicInformation
Definition: nt_native.h:1183
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
BOOLEAN KeI386VirtualIntExtensions
Definition: v86vdm.c:24
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
VOID NTAPI Ki386VdmEnablePentiumExtentions(IN BOOLEAN Enable)
Definition: vdmmain.c:23
_In_opt_ PETWENABLECALLBACK _In_opt_ PVOID _Out_ PREGHANDLE RegHandle
Definition: wmifuncs.h:78

Referenced by Phase1InitializationDiscard().

◆ KeInvalidateTlbEntry()

FORCEINLINE VOID KeInvalidateTlbEntry ( IN PVOID  Address)

Definition at line 385 of file ke.h.

386{
387 /* Invalidate the TLB entry for this address */
389}
__INTRIN_INLINE void __invlpg(void *Address)
Definition: intrin_x86.h:2000
static WCHAR Address[46]
Definition: ping.c:68

◆ KeQueryInterruptHandler()

FORCEINLINE PVOID KeQueryInterruptHandler ( IN ULONG  Vector)

Definition at line 363 of file ke.h.

364{
365 PKIPCR Pcr = (PKIPCR)KeGetPcr();
366 UCHAR Entry;
367
368 //
369 // Get the entry from the HAL
370 //
372
373 //
374 // Read the entry from the IDT
375 //
376 return (PVOID)(((Pcr->IDT[Entry].ExtendedOffset << 16) & 0xFFFF0000) |
377 (Pcr->IDT[Entry].Offset & 0xFFFF));
378}
struct _KIPCR * PKIPCR
#define HalVectorToIDTEntry
Definition: halfuncs.h:54
Entry
Definition: section.c:5216
USHORT Offset
Definition: ketypes.h:451
USHORT ExtendedOffset
Definition: ketypes.h:454
PKIDTENTRY IDT
Definition: ketypes.h:833

◆ KeRegisterInterruptHandler()

FORCEINLINE VOID KeRegisterInterruptHandler ( IN ULONG  Vector,
IN PVOID  Handler 
)

Definition at line 338 of file ke.h.

340{
341 UCHAR Entry;
343 PKIPCR Pcr = (PKIPCR)KeGetPcr();
344
345 //
346 // Get the entry from the HAL
347 //
350
351 //
352 // Now set the data
353 //
354 Pcr->IDT[Entry].ExtendedOffset = (USHORT)(Address >> 16);
355 Pcr->IDT[Entry].Offset = (USHORT)Address;
356}
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER Handler
Definition: acpixf.h:672
#define PtrToUlong(u)
Definition: config.h:107

◆ KeRestoreInterrupts()

FORCEINLINE VOID KeRestoreInterrupts ( BOOLEAN  WereEnabled)

Definition at line 328 of file ke.h.

329{
330 if (WereEnabled) _enable();
331}
void __cdecl _enable(void)
Definition: intrin_arm.h:373

◆ KeSetContextFrameRegister()

FORCEINLINE VOID KeSetContextFrameRegister ( PCONTEXT  Context,
ULONG_PTR  Frame 
)

Definition at line 97 of file ke.h.

98{
99 Context->Ebp = Frame;
100}

◆ KeSetContextPc()

FORCEINLINE VOID KeSetContextPc ( PCONTEXT  Context,
ULONG_PTR  ProgramCounter 
)

Definition at line 69 of file ke.h.

70{
71 Context->Eip = ProgramCounter;
72}

◆ KeSetContextReturnRegister()

FORCEINLINE VOID KeSetContextReturnRegister ( PCONTEXT  Context,
ULONG_PTR  ReturnValue 
)

Definition at line 83 of file ke.h.

84{
85 Context->Eax = ReturnValue;
86}
UINT32 void void ** ReturnValue
Definition: acevents.h:216

◆ KeSweepICache()

FORCEINLINE VOID KeSweepICache ( IN PVOID  BaseAddress,
IN SIZE_T  FlushSize 
)

Definition at line 401 of file ke.h.

403{
404 //
405 // Always sweep the whole cache
406 //
408 UNREFERENCED_PARAMETER(FlushSize);
409 __wbinvd();
410}
PPC_QUAL void __wbinvd(void)
Definition: intrin_ppc.h:759
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329

◆ Ki386AdjustEsp0()

VOID NTAPI Ki386AdjustEsp0 ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 280 of file exp.c.

281{
284 ULONG EFlags;
285
286 /* Get the current thread's stack */
288 Stack = (ULONG_PTR)Thread->InitialStack;
289
290 /* Check if we are in V8086 mode */
291 if (!(TrapFrame->EFlags & EFLAGS_V86_MASK))
292 {
293 /* Bias the stack for the V86 segments */
294 Stack -= sizeof(KTRAP_FRAME) -
296 }
297
298 /* Bias the stack for the FPU area */
299 Stack -= sizeof(FX_SAVE_AREA);
300
301 /* Disable interrupts */
302 EFlags = __readeflags();
303 _disable();
304
305 /* Set new ESP0 value in the TSS */
306 KeGetPcr()->TSS->Esp0 = Stack;
307
308 /* Restore old interrupt state */
309 __writeeflags(EFlags);
310}
#define ULONG_PTR
Definition: config.h:101
#define KeGetCurrentThread
Definition: hal.h:55
__INTRIN_INLINE void __writeeflags(uintptr_t Value)
Definition: intrin_x86.h:1701
if(dx< 0)
Definition: linetemp.h:194
struct _KTRAP_FRAME KTRAP_FRAME
#define EFLAGS_V86_MASK
Definition: ketypes.h:207
struct _FX_SAVE_AREA FX_SAVE_AREA
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639

Referenced by KeContextToTrapFrame(), KiVdmOpcodeIRET(), KiVdmOpcodePOPF(), and VdmSwapContext().

◆ Ki386BiosCallReturnAddress()

VOID FASTCALL Ki386BiosCallReturnAddress ( IN PKTRAP_FRAME  TrapFrame)

Referenced by KiEnterV86Mode(), and KiTrap0DHandler().

◆ Ki386CreateIdentityMap()

BOOLEAN NTAPI Ki386CreateIdentityMap ( IN PLARGE_IDENTITY_MAP  IdentityMap,
IN PVOID  StartPtr,
IN ULONG  Length 
)

Referenced by KiInitMachineDependent().

◆ Ki386EnableCurrentLargePage()

VOID NTAPI Ki386EnableCurrentLargePage ( IN ULONG_PTR  StartAddress,
IN ULONG  Cr3 
)

◆ Ki386EnableDE()

ULONG_PTR NTAPI Ki386EnableDE ( IN ULONG_PTR  Context)

Definition at line 761 of file cpu.c.

762{
763 /* Enable DE */
765 return 0;
766}
__INTRIN_INLINE unsigned long __readcr4(void)
Definition: intrin_x86.h:1857
__INTRIN_INLINE void __writecr4(unsigned int Data)
Definition: intrin_x86.h:1831
#define CR4_DE
Definition: ketypes.h:157

Referenced by KiInitMachineDependent().

◆ Ki386EnableFxsr()

ULONG_PTR NTAPI Ki386EnableFxsr ( IN ULONG_PTR  Context)

Definition at line 771 of file cpu.c.

772{
773 /* Enable FXSR */
775 return 0;
776}
#define CR4_FXSR
Definition: ketypes.h:162

Referenced by KiInitMachineDependent().

◆ Ki386EnableGlobalPage()

ULONG_PTR NTAPI Ki386EnableGlobalPage ( IN ULONG_PTR  Context)

Definition at line 23 of file patpge.c.

24{
25 //PLONG Count;
26#if defined(_GLOBAL_PAGES_ARE_AWESOME_)
27 ULONG Cr4;
28#endif
30
31 /* Disable interrupts */
33
34 /* Spin until other processors are ready */
35 //Count = (PLONG)Context;
36 //InterlockedDecrement(Count);
37 //while (*Count) YieldProcessor();
38
39#if defined(_GLOBAL_PAGES_ARE_AWESOME_)
40
41 /* Get CR4 and ensure global pages are disabled */
42 Cr4 = __readcr4();
43 ASSERT(!(Cr4 & CR4_PGE));
44
45 /* Reset CR3 to flush the TLB */
47
48 /* Now enable PGE */
49 __writecr4(Cr4 | CR4_PGE);
50
51#endif
52
53 /* Restore interrupts and return */
55 return 0;
56}
#define ASSERT(a)
Definition: mode.c:44
#define CR4_PGE
Definition: ketypes.h:161
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
FORCEINLINE BOOLEAN KeDisableInterrupts(VOID)
Definition: ke.h:249
FORCEINLINE VOID KeRestoreInterrupts(BOOLEAN WereEnabled)
Definition: ke.h:264

Referenced by KiInitMachineDependent().

◆ Ki386EnableTargetLargePage()

ULONG_PTR NTAPI Ki386EnableTargetLargePage ( IN ULONG_PTR  Context)

Definition at line 96 of file patpge.c.

97{
99
100 /* Call helper function with the start address and temporary page table pointer */
101 Ki386EnableCurrentLargePage(IdentityMap->StartAddress, IdentityMap->Cr3);
102
103 return 0;
104}
struct _LARGE_IDENTITY_MAP * PLARGE_IDENTITY_MAP
VOID NTAPI Ki386EnableCurrentLargePage(IN ULONG_PTR StartAddress, IN ULONG Cr3)
ULONG_PTR StartAddress
Definition: ke.h:292

Referenced by KiInitMachineDependent().

◆ Ki386EnableXMMIExceptions()

ULONG_PTR NTAPI Ki386EnableXMMIExceptions ( IN ULONG_PTR  Context)

Definition at line 781 of file cpu.c.

782{
783 PKIDTENTRY IdtEntry;
784
785 /* Get the IDT Entry for Interrupt 0x13 */
786 IdtEntry = &((PKIPCR)KeGetPcr())->IDT[0x13];
787
788 /* Set it up */
789 IdtEntry->Selector = KGDT_R0_CODE;
790 IdtEntry->Offset = ((ULONG_PTR)KiTrap13 & 0xFFFF);
791 IdtEntry->ExtendedOffset = ((ULONG_PTR)KiTrap13 >> 16) & 0xFFFF;
792 ((PKIDT_ACCESS)&IdtEntry->Access)->Dpl = 0;
793 ((PKIDT_ACCESS)&IdtEntry->Access)->Present = 1;
794 ((PKIDT_ACCESS)&IdtEntry->Access)->SegmentType = I386_INTERRUPT_GATE;
795
796 /* Enable XMMI exceptions */
798 return 0;
799}
#define CR4_XMMEXCPT
Definition: ketypes.h:163
#define I386_INTERRUPT_GATE
Definition: ketypes.h:118
struct _KIDT_ACCESS * PKIDT_ACCESS
#define KGDT_R0_CODE
Definition: ketypes.h:123
VOID __cdecl KiTrap13(VOID)
USHORT Selector
Definition: ketypes.h:452
USHORT Access
Definition: ketypes.h:453

Referenced by KiInitMachineDependent().

◆ Ki386FreeIdentityMap()

VOID NTAPI Ki386FreeIdentityMap ( IN PLARGE_IDENTITY_MAP  IdentityMap)

Referenced by KiInitMachineDependent().

◆ Ki386HandleOpcodeV86()

BOOLEAN FASTCALL Ki386HandleOpcodeV86 ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 470 of file v86vdm.c.

471{
472 /* Clean up */
473 TrapFrame->Eip &= 0xFFFF;
474 TrapFrame->HardwareEsp &= 0xFFFF;
475
476 /* We start with only 1 byte per instruction */
477 return KiVdmHandleOpcode(TrapFrame, 1);
478}
BOOLEAN FASTCALL KiVdmHandleOpcode(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
Definition: v86vdm.c:393

Referenced by KiTrap0DHandler().

◆ Ki386InitializeTss()

VOID FASTCALL Ki386InitializeTss ( IN PKTSS  Tss,
IN PKIDTENTRY  Idt,
IN PKGDTENTRY  Gdt 
)

Definition at line 515 of file cpu.c.

518{
519 PKGDTENTRY TssEntry, TaskGateEntry;
520
521 /* Initialize the boot TSS. */
522 TssEntry = &Gdt[KGDT_TSS / sizeof(KGDTENTRY)];
523 TssEntry->HighWord.Bits.Type = I386_TSS;
524 TssEntry->HighWord.Bits.Pres = 1;
525 TssEntry->HighWord.Bits.Dpl = 0;
526 KiInitializeTSS2(Tss, TssEntry);
527 KiInitializeTSS(Tss);
528
529 /* Load the task register */
530 Ke386SetTr(KGDT_TSS);
531
532 /* Setup the Task Gate for Double Fault Traps */
533 TaskGateEntry = (PKGDTENTRY)&Idt[8];
534 TaskGateEntry->HighWord.Bits.Type = I386_TASK_GATE;
535 TaskGateEntry->HighWord.Bits.Pres = 1;
536 TaskGateEntry->HighWord.Bits.Dpl = 0;
537 ((PKIDTENTRY)TaskGateEntry)->Selector = KGDT_DF_TSS;
538
539 /* Initialize the TSS used for handling double faults. */
540 Tss = (PKTSS)KiDoubleFaultTSS;
541 KiInitializeTSS(Tss);
542 Tss->CR3 = __readcr3();
543 Tss->Esp0 = KiDoubleFaultStack;
544 Tss->Esp = KiDoubleFaultStack;
545 Tss->Eip = PtrToUlong(KiTrap08);
546 Tss->Cs = KGDT_R0_CODE;
547 Tss->Fs = KGDT_R0_PCR;
548 Tss->Ss = Ke386GetSs();
549 Tss->Es = KGDT_R3_DATA | RPL_MASK;
550 Tss->Ds = KGDT_R3_DATA | RPL_MASK;
551
552 /* Setup the Double Trap TSS entry in the GDT */
553 TssEntry = &Gdt[KGDT_DF_TSS / sizeof(KGDTENTRY)];
554 TssEntry->HighWord.Bits.Type = I386_TSS;
555 TssEntry->HighWord.Bits.Pres = 1;
556 TssEntry->HighWord.Bits.Dpl = 0;
557 TssEntry->BaseLow = (USHORT)((ULONG_PTR)Tss & 0xFFFF);
558 TssEntry->HighWord.Bytes.BaseMid = (UCHAR)((ULONG_PTR)Tss >> 16);
559 TssEntry->HighWord.Bytes.BaseHi = (UCHAR)((ULONG_PTR)Tss >> 24);
560 TssEntry->LimitLow = KTSS_IO_MAPS;
561
562 /* Now setup the NMI Task Gate */
563 TaskGateEntry = (PKGDTENTRY)&Idt[2];
564 TaskGateEntry->HighWord.Bits.Type = I386_TASK_GATE;
565 TaskGateEntry->HighWord.Bits.Pres = 1;
566 TaskGateEntry->HighWord.Bits.Dpl = 0;
567 ((PKIDTENTRY)TaskGateEntry)->Selector = KGDT_NMI_TSS;
568
569 /* Initialize the actual TSS */
570 Tss = (PKTSS)KiNMITSS;
571 KiInitializeTSS(Tss);
572 Tss->CR3 = __readcr3();
573 Tss->Esp0 = KiDoubleFaultStack;
574 Tss->Esp = KiDoubleFaultStack;
575 Tss->Eip = PtrToUlong(KiTrap02);
576 Tss->Cs = KGDT_R0_CODE;
577 Tss->Fs = KGDT_R0_PCR;
578 Tss->Ss = Ke386GetSs();
579 Tss->Es = KGDT_R3_DATA | RPL_MASK;
580 Tss->Ds = KGDT_R3_DATA | RPL_MASK;
581
582 /* And its associated TSS Entry */
583 TssEntry = &Gdt[KGDT_NMI_TSS / sizeof(KGDTENTRY)];
584 TssEntry->HighWord.Bits.Type = I386_TSS;
585 TssEntry->HighWord.Bits.Pres = 1;
586 TssEntry->HighWord.Bits.Dpl = 0;
587 TssEntry->BaseLow = (USHORT)((ULONG_PTR)Tss & 0xFFFF);
588 TssEntry->HighWord.Bytes.BaseMid = (UCHAR)((ULONG_PTR)Tss >> 16);
589 TssEntry->HighWord.Bytes.BaseHi = (UCHAR)((ULONG_PTR)Tss >> 24);
590 TssEntry->LimitLow = KTSS_IO_MAPS;
591}
#define KGDT_R3_DATA
#define PKIDTENTRY
Definition: ketypes.h:585
#define I386_TASK_GATE
Definition: ketypes.h:114
#define I386_TSS
Definition: ketypes.h:115
#define PKTSS
Definition: ketypes.h:1034
#define PKGDTENTRY
Definition: ketypes.h:543
#define KGDTENTRY
Definition: ketypes.h:542
#define KTSS_IO_MAPS
Definition: asm.h:84
#define KGDT_NMI_TSS
Definition: ketypes.h:133
#define KGDT_TSS
Definition: ketypes.h:127
#define KGDT_R0_PCR
Definition: ketypes.h:128
#define KGDT_DF_TSS
Definition: ketypes.h:132
VOID __cdecl KiTrap02(VOID)
VOID __cdecl KiTrap08(VOID)
ULONG_PTR KiDoubleFaultStack
Definition: kiinit.c:22
UCHAR KiDoubleFaultTSS[KTSS_IO_MAPS]
Definition: cpu.c:20
VOID NTAPI KiInitializeTSS(IN PKTSS Tss)
Definition: cpu.c:499
VOID NTAPI KiInitializeTSS2(IN PKTSS Tss, IN PKGDTENTRY TssEntry OPTIONAL)
Definition: cpu.c:461
UCHAR KiNMITSS[KTSS_IO_MAPS]
Definition: cpu.c:23
struct _KGDTENTRY::@2942::@2944 Bits
USHORT LimitLow
Definition: ketypes.h:400

Referenced by KiSystemStartup().

◆ Ki386PerfEnd()

FORCEINLINE VOID Ki386PerfEnd ( VOID  )

Definition at line 1005 of file ke.h.

1006{
1009 DbgPrint("Boot took %I64u cycles!\n", BootCyclesEnd - BootCycles);
1010 DbgPrint("Interrupts: %u System Calls: %u Context Switches: %u\n",
1011 KeGetCurrentPrcb()->InterruptCount,
1012 KeGetCurrentPrcb()->KeSystemCalls,
1014}
#define DbgPrint
Definition: hal.h:12
PPC_QUAL unsigned long long __rdtsc(void)
Definition: intrin_ppc.h:688
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1197
#define KeGetContextSwitches(Prcb)
Definition: ke.h:226
ULONGLONG BootCyclesEnd
Definition: ke.h:157
ULONGLONG BootCycles
Definition: kiinit.c:37
uint64_t ULONGLONG
Definition: typedefs.h:67

◆ Ki386SetupAndExitToV86Mode()

VOID NTAPI Ki386SetupAndExitToV86Mode ( OUT PTEB  VdmTeb)

Referenced by Ke386CallBios().

◆ KiAmdK6InitializeMTRR()

VOID NTAPI KiAmdK6InitializeMTRR ( VOID  )

Definition at line 31 of file mtrr.c.

32{
33 /* FIXME: Support this */
34 DPRINT("AMD MTRR support detected but not yet taken advantage of\n");
35}
#define DPRINT
Definition: sndvol32.h:73

Referenced by KiInitMachineDependent().

◆ KiCheckForApcDelivery()

FORCEINLINE VOID KiCheckForApcDelivery ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 886 of file ke.h.

887{
890
891 /* Check for V8086 or user-mode trap */
892 if ((TrapFrame->EFlags & EFLAGS_V86_MASK) || (KiUserTrap(TrapFrame)))
893 {
894 /* Get the thread */
896 while (TRUE)
897 {
898 /* Turn off the alerted state for kernel mode */
899 Thread->Alerted[KernelMode] = FALSE;
900
901 /* Are there pending user APCs? */
902 if (!Thread->ApcState.UserApcPending) break;
903
904 /* Raise to APC level and enable interrupts */
906 _enable();
907
908 /* Deliver APCs */
909 KiDeliverApc(UserMode, NULL, TrapFrame);
910
911 /* Restore IRQL and disable interrupts once again */
913 _disable();
914 }
915 }
916}
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define APC_LEVEL
Definition: env_spec_w32.h:695
VOID FASTCALL KfLowerIrql(IN KIRQL NewIrql)
Definition: pic.c:232
KIRQL FASTCALL KfRaiseIrql(IN KIRQL NewIrql)
Definition: pic.c:187
#define UserMode
Definition: asm.h:39
FORCEINLINE BOOLEAN KiUserTrap(IN PKTRAP_FRAME TrapFrame)
Definition: ke.h:377
VOID NTAPI KiDeliverApc(IN KPROCESSOR_MODE DeliveryMode, IN PKEXCEPTION_FRAME ExceptionFrame, IN PKTRAP_FRAME TrapFrame)
Definition: apc.c:302
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by KiCommonExit().

◆ KiConvertToGuiThread()

NTSTATUS NTAPI KiConvertToGuiThread ( VOID  )

Referenced by KiSystemServiceHandler().

◆ KiDispatchException0Args()

FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException0Args ( IN NTSTATUS  Code,
IN ULONG_PTR  Address,
IN PKTRAP_FRAME  TrapFrame 
)

Definition at line 832 of file ke.h.

835{
836 /* Helper for exceptions with no arguments */
837 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 0, 0, 0, 0, TrapFrame);
838}
DECLSPEC_NORETURN VOID NTAPI KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code, IN ULONG Flags, IN ULONG_PTR Address, IN ULONG ParameterCount, IN ULONG_PTR Parameter1, IN ULONG_PTR Parameter2, IN ULONG_PTR Parameter3, IN PKTRAP_FRAME TrapFrame)
Definition: exp.c:1055
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
Definition: wdfdevice.h:1707

Referenced by KiRaiseAssertionHandler(), KiTrap00Handler(), KiTrap01Handler(), KiTrap04Handler(), KiTrap05Handler(), KiTrap06Handler(), and KiTrap0DHandler().

◆ KiDispatchException1Args()

FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException1Args ( IN NTSTATUS  Code,
IN ULONG_PTR  Address,
IN ULONG  P1,
IN PKTRAP_FRAME  TrapFrame 
)

Definition at line 846 of file ke.h.

850{
851 /* Helper for exceptions with no arguments */
852 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 1, P1, 0, 0, TrapFrame);
853}

Referenced by KiNpxHandler(), and KiTrap13Handler().

◆ KiDispatchException2Args()

FORCEINLINE DECLSPEC_NORETURN VOID KiDispatchException2Args ( IN NTSTATUS  Code,
IN ULONG_PTR  Address,
IN ULONG  P1,
IN ULONG  P2,
IN PKTRAP_FRAME  TrapFrame 
)

Definition at line 861 of file ke.h.

866{
867 /* Helper for exceptions with no arguments */
868 KiDispatchExceptionFromTrapFrame(Code, 0, Address, 2, P1, P2, 0, TrapFrame);
869}

Referenced by KiNpxHandler(), KiTrap0DHandler(), and KiTrap0EHandler().

◆ KiDispatchExceptionFromTrapFrame()

DECLSPEC_NORETURN VOID NTAPI KiDispatchExceptionFromTrapFrame ( IN NTSTATUS  Code,
IN ULONG  Flags,
IN ULONG_PTR  Address,
IN ULONG  ParameterCount,
IN ULONG_PTR  Parameter1,
IN ULONG_PTR  Parameter2,
IN ULONG_PTR  Parameter3,
IN PKTRAP_FRAME  TrapFrame 
)

Definition at line 1055 of file exp.c.

1063{
1064 EXCEPTION_RECORD ExceptionRecord;
1065
1066 /* Build the exception record */
1067 ExceptionRecord.ExceptionCode = Code;
1068 ExceptionRecord.ExceptionFlags = Flags;
1069 ExceptionRecord.ExceptionRecord = NULL;
1070 ExceptionRecord.ExceptionAddress = (PVOID)Address;
1071 ExceptionRecord.NumberParameters = ParameterCount;
1072 if (ParameterCount)
1073 {
1074 /* Copy extra parameters */
1075 ExceptionRecord.ExceptionInformation[0] = Parameter1;
1076 ExceptionRecord.ExceptionInformation[1] = Parameter2;
1077 ExceptionRecord.ExceptionInformation[2] = Parameter3;
1078 }
1079
1080 /* Now go dispatch the exception */
1081 KiDispatchException(&ExceptionRecord,
1082 NULL,
1083 TrapFrame,
1084 TrapFrame->EFlags & EFLAGS_V86_MASK ?
1085 -1 : KiUserTrap(TrapFrame),
1086 TRUE);
1087
1088 /* Return from this trap */
1089 KiEoiHelper(TrapFrame);
1090}
#define Code
Definition: deflate.h:80
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
Definition: traphdlr.c:126
VOID NTAPI KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, IN PKEXCEPTION_FRAME ExceptionFrame, IN PKTRAP_FRAME TrapFrame, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN FirstChance)
Definition: exp.c:795
struct _EXCEPTION_RECORD * ExceptionRecord
Definition: compat.h:210
DWORD ExceptionCode
Definition: compat.h:208
DWORD NumberParameters
Definition: compat.h:212
DWORD ExceptionFlags
Definition: compat.h:209
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
Definition: compat.h:213
PVOID ExceptionAddress
Definition: compat.h:211
void * PVOID
Definition: typedefs.h:50

Referenced by KiDebugHandler(), KiDispatchException0Args(), KiDispatchException1Args(), KiDispatchException2Args(), KiRaiseSecurityCheckFailureHandler(), and KiTrap0EHandler().

◆ KiEndInterrupt()

FORCEINLINE VOID KiEndInterrupt ( IN KIRQL  Irql,
IN PKTRAP_FRAME  TrapFrame 
)

Definition at line 989 of file ke.h.

991{
992 /* Disable interrupts and end the interrupt */
993 _disable();
994 HalEndSystemInterrupt(Irql, TrapFrame);
995
996 /* Exit the interrupt */
997 KiEoiHelper(TrapFrame);
998}
_Out_ PKIRQL Irql
Definition: csq.h:179
VOID NTAPI HalEndSystemInterrupt(IN KIRQL OldIrql, IN PKTRAP_FRAME TrapFrame)
Definition: pic.c:335

◆ KiEoiHelper()

DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 126 of file traphdlr.c.

127{
128 /* Common trap exit code */
129 KiCommonExit(TrapFrame, TRUE);
130
131 /* Check if this was a V8086 trap */
132 if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame);
133
134 /* Check for user mode exit */
135 if (KiUserTrap(TrapFrame)) KiTrapReturn(TrapFrame);
136
137 /* Check for edited frame */
138 if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame);
139
140 /* Check if we have single stepping enabled */
141 if (TrapFrame->EFlags & EFLAGS_TF) KiTrapReturnNoSegments(TrapFrame);
142
143 /* Exit the trap to kernel mode */
145}
#define EFLAGS_TF
Definition: SystemCall.c:10
DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegmentsRet8(IN PKTRAP_FRAME TrapFrame)
DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame)
DECLSPEC_NORETURN VOID FASTCALL KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame)
DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame)
FORCEINLINE BOOLEAN KiIsFrameEdited(IN PKTRAP_FRAME TrapFrame)
Definition: traphdlr.c:87
FORCEINLINE VOID KiCommonExit(IN PKTRAP_FRAME TrapFrame, BOOLEAN SkipPreviousMode)
Definition: traphdlr.c:96

Referenced by _HalpApcInterruptHandler(), HalpApcInterruptHandler(), HalpClockInterruptHandler(), HalpClockIpiHandler(), HalpDispatchInterrupt2ndEntry(), HalpDispatchInterruptHandler(), HalpTrap0DHandler(), KiDispatchExceptionFromTrapFrame(), KiEndInterrupt(), KiEnterV86Mode(), KiExitInterrupt(), KiExitV86Trap(), KiGetTickCountHandler(), KiNpxHandler(), KiTrap01Handler(), KiTrap07Handler(), KiTrap0EHandler(), and KiTrap10Handler().

◆ KiExceptionExit()

FORCEINLINE DECLSPEC_NORETURN VOID KiExceptionExit ( _In_ PKTRAP_FRAME  TrapFrame,
_In_ PKEXCEPTION_FRAME  ExceptionFrame 
)

Definition at line 720 of file ke.h.

723{
724 KiServiceExit2(TrapFrame);
725}
#define KiServiceExit2
Definition: ke.h:5

Referenced by NtContinue(), and NtRaiseException().

◆ KiExitV86Mode()

ULONG_PTR FASTCALL KiExitV86Mode ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 482 of file v86vdm.c.

483{
484 PKPCR Pcr = KeGetPcr();
485 ULONG_PTR StackFrameUnaligned;
486 PKV8086_STACK_FRAME StackFrame;
488 PKV86_FRAME V86Frame;
489 PFX_SAVE_AREA NpxFrame;
490
491 /* Get the stack frame back */
492 StackFrameUnaligned = TrapFrame->Esi;
493 StackFrame = (PKV8086_STACK_FRAME)(ROUND_UP(StackFrameUnaligned - 4, 16) + 4);
494 V86Frame = &StackFrame->V86Frame;
495 NpxFrame = &StackFrame->NpxArea;
496 ASSERT((ULONG_PTR)NpxFrame % 16 == 0);
497
498 /* Copy the FPU frame back */
501
502 /* Set initial stack back */
503 Thread->InitialStack = (PVOID)((ULONG_PTR)V86Frame->ThreadStack + sizeof(FX_SAVE_AREA));
504
505 /* Set ESP0 back in the KTSS */
506 Pcr->TSS->Esp0 = (ULONG_PTR)Thread->InitialStack;
507 Pcr->TSS->Esp0 -= sizeof(KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, V86Es);
508 Pcr->TSS->Esp0 -= NPX_FRAME_LENGTH;
509
510 /* Restore TEB addresses */
511 Thread->Teb = V86Frame->ThreadTeb;
512 KiSetTebBase(KeGetPcr(), V86Frame->ThreadTeb);
513
514 /* Enable interrupts and return a pointer to the trap frame */
515 _enable();
516 return StackFrameUnaligned;
517}
#define ROUND_UP(n, align)
Definition: eventvwr.h:34
#define NPX_FRAME_LENGTH
Definition: asm.h:247
FORCEINLINE VOID KiSetTebBase(PKPCR Pcr, PNT_TIB TebAddress)
Definition: ke.h:455
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea(IN PKTHREAD Thread)
Definition: ke.h:769
struct _KV8086_STACK_FRAME * PKV8086_STACK_FRAME
Definition: ke.h:294
struct _KTSS * TSS
Definition: ke.h:55
KV86_FRAME V86Frame
Definition: ke.h:282
FX_SAVE_AREA NpxArea
Definition: ke.h:281
PVOID ThreadTeb
Definition: ke.h:271
PVOID ThreadStack
Definition: ke.h:270

◆ KiFastCallEntry()

VOID __cdecl KiFastCallEntry ( VOID  )

◆ KiFlushNPXState()

VOID NTAPI KiFlushNPXState ( IN FLOATING_SAVE_AREA *  SaveArea)

◆ KiGetCacheInformation()

VOID NTAPI KiGetCacheInformation ( VOID  )

Definition at line 334 of file cpu.c.

335{
336 PKPRCB Prcb = KeGetCurrentPrcb();
337 PKIPCR Pcr = (PKIPCR)KeGetPcr();
338
339 /* Set default L2 size */
340 Pcr->SecondLevelCacheSize = 0;
341
342 /* Retrieve the cache descriptors */
344 ARRAYSIZE(Prcb->Cache),
345 Pcr->Prcb.CpuVendor);
346
347 /* Loop the descriptors to find the L2 cache size */
348 for (ULONG i = 0; i < Prcb->CacheCount; i++)
349 {
350 if (Prcb->Cache[i].Level == 2)
351 {
352 Pcr->SecondLevelCacheSize = Prcb->Cache[i].Size;
354 break;
355 }
356 }
357}
#define ARRAYSIZE(a)
Definition: cat.c:25
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
Definition: glfuncs.h:248
ULONG NTAPI KiGetCpuCacheDescriptors(_Out_writes_(MaxCount) PCACHE_DESCRIPTOR CacheDescriptors, _In_ ULONG MaxCount, _In_ CPU_VENDORS Vendor)
Retrieves cache descriptors for the current CPU.
Definition: cacheinfo.c:484
UCHAR Associativity
Definition: ketypes.h:52
KPRCB Prcb
Definition: ketypes.h:1003
ULONG SecondLevelCacheSize
Definition: ketypes.h:995
UCHAR SecondLevelCacheAssociativity
Definition: ketypes.h:986
ULONG CacheCount
Definition: ketypes.h:908
CACHE_DESCRIPTOR Cache[5]
Definition: ketypes.h:907
UCHAR CpuVendor
Definition: ketypes.h:704

◆ KiGetFeatureBits()

ULONG64 NTAPI KiGetFeatureBits ( VOID  )

Evaluates the KeFeatureFlag bits for the current CPU.

Returns
The feature flags for this CPU.
See also
https://www.geoffchappell.com/studies/windows/km/ntoskrnl/structs/kprcb/featurebits.htm
Todo:
  • KF_VIRT_FIRMWARE_ENABLED 0x08000000 (see notes from Geoff Chappell)
  • KF_FPU_LEAKAGE 0x0000020000000000ULL
  • KF_CAT 0x0000100000000000ULL
  • KF_CET_SS 0x0000400000000000ULL

Definition at line 73 of file cpu.c.

74{
75 PKPRCB Prcb = KeGetCurrentPrcb();
76 ULONG Vendor;
77 ULONG64 FeatureBits = 0;
80 CPUID_EXTENDED_FUNCTION_REGS extendedFunction;
81
82 /* Get the Vendor ID */
83 Vendor = Prcb->CpuVendor;
84
85 /* Make sure we got a valid vendor ID at least. */
86 if (Vendor == CPU_UNKNOWN) return FeatureBits;
87
88 /* Get signature CPUID for the maximum function */
90
91 /* Get the CPUID Info. */
93
94 /* Set the initial APIC ID */
95 Prcb->InitialApicId = (UCHAR)VersionInfo.Ebx.Bits.InitialLocalApicId;
96
97 /* Convert all CPUID Feature bits into our format */
98 if (VersionInfo.Edx.Bits.VME) FeatureBits |= KF_CR4;
99 if (VersionInfo.Edx.Bits.PSE) FeatureBits |= KF_LARGE_PAGE | KF_CR4;
100 if (VersionInfo.Edx.Bits.TSC) FeatureBits |= KF_RDTSC;
101 if (VersionInfo.Edx.Bits.CX8) FeatureBits |= KF_CMPXCHG8B;
102 if (VersionInfo.Edx.Bits.SEP) FeatureBits |= KF_FAST_SYSCALL;
103 if (VersionInfo.Edx.Bits.MTRR) FeatureBits |= KF_MTRR;
104 if (VersionInfo.Edx.Bits.PGE) FeatureBits |= KF_GLOBAL_PAGE | KF_CR4;
105 if (VersionInfo.Edx.Bits.CMOV) FeatureBits |= KF_CMOV;
106 if (VersionInfo.Edx.Bits.PAT) FeatureBits |= KF_PAT;
107 if (VersionInfo.Edx.Bits.DS) FeatureBits |= KF_DTS;
108 if (VersionInfo.Edx.Bits.MMX) FeatureBits |= KF_MMX;
109 if (VersionInfo.Edx.Bits.FXSR) FeatureBits |= KF_FXSR;
110 if (VersionInfo.Edx.Bits.SSE) FeatureBits |= KF_XMMI;
111 if (VersionInfo.Edx.Bits.SSE2) FeatureBits |= KF_XMMI64;
112
113 if (VersionInfo.Ecx.Bits.SSE3) FeatureBits |= KF_SSE3;
114 if (VersionInfo.Ecx.Bits.SSSE3) FeatureBits |= KF_SSSE3;
115 if (VersionInfo.Ecx.Bits.CMPXCHG16B) FeatureBits |= KF_CMPXCHG16B;
116 if (VersionInfo.Ecx.Bits.SSE4_1) FeatureBits |= KF_SSE4_1;
117 if (VersionInfo.Ecx.Bits.SSE4_2) FeatureBits |= KF_SSE4_2;
118 if (VersionInfo.Ecx.Bits.XSAVE) FeatureBits |= KF_XSTATE;
119 if (VersionInfo.Ecx.Bits.RDRAND) FeatureBits |= KF_RDRAND;
120 if (VersionInfo.Ecx.Bits.AVX) FeatureBits |= KF_AVX;
121
122 /* Check if the CPU has hyper-threading */
123 if (VersionInfo.Edx.Bits.HTT)
124 {
125 /* Set the number of logical CPUs */
127 VersionInfo.Ebx.Bits.MaximumAddressableIdsForLogicalProcessors;
129 {
130 /* We're on dual-core */
132 }
133 }
134 else
135 {
136 /* We only have a single CPU */
138 }
139
140 /* Check if CPUID_THERMAL_POWER_MANAGEMENT (0x06) is supported */
142 {
143 /* Read CPUID_THERMAL_POWER_MANAGEMENT */
146
147 if (PowerInfo.Undoc.Ecx.ACNT2) FeatureBits |= KF_ACNT2;
148 }
149
150 /* Check if CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (0x07) is supported */
152 {
153 /* Read CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS */
155 __cpuidex(ExtFlags.AsInt32,
158
159 if (ExtFlags.Ebx.Bits.SMEP) FeatureBits |= KF_SMEP;
160 if (ExtFlags.Ebx.Bits.FSGSBASE) FeatureBits |= KF_RDWRFSGSBASE;
161 if (ExtFlags.Ebx.Bits.SMAP) FeatureBits |= KF_SMAP;
162 if (ExtFlags.Ebx.Bits.AVX2) FeatureBits |= KF_AVX2;
163 if (ExtFlags.Ebx.Bits.AVX512F) FeatureBits |= KF_AVX512F;
164 }
165
166 /* Check if CPUID_EXTENDED_STATE (0x0D) is supported */
167 if (signature.MaxLeaf >= CPUID_EXTENDED_STATE)
168 {
169 /* Read CPUID_EXTENDED_STATE */
171 __cpuidex(ExtStateSub.AsInt32,
174
175 if (ExtStateSub.Eax.Bits.XSAVEOPT) FeatureBits |= KF_XSAVEOPT;
176 if (ExtStateSub.Eax.Bits.XSAVES) FeatureBits |= KF_XSAVES;
177 }
178
179 /* Check extended cpuid features */
180 __cpuid(extendedFunction.AsInt32, CPUID_EXTENDED_FUNCTION);
181 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
182 {
183 /* Check if CPUID_EXTENDED_CPU_SIG (0x80000001) is supported */
184 if (extendedFunction.MaxLeaf >= CPUID_EXTENDED_CPU_SIG)
185 {
186 /* Read CPUID_EXTENDED_CPU_SIG */
189
190 /* Check if NX-bit is supported */
191 if (ExtSig.Intel.Edx.Bits.NX) FeatureBits |= KF_NX_BIT;
192 if (ExtSig.Intel.Edx.Bits.Page1GB) FeatureBits |= KF_HUGEPAGE;
193 if (ExtSig.Intel.Edx.Bits.RDTSCP) FeatureBits |= KF_RDTSCP;
194
195 /* AMD specific */
196 if (Vendor == CPU_AMD)
197 {
198 if (ExtSig.Amd.Edx.Bits.ThreeDNow) FeatureBits |= KF_3DNOW;
199 }
200 }
201 }
202
203 /* Vendor specific */
204 if (Vendor == CPU_INTEL)
205 {
206 FeatureBits |= KF_GENUINE_INTEL;
207
208 /* Check for models that support LBR */
209 if (VersionInfo.Eax.Bits.FamilyId == 6)
210 {
211 if ((VersionInfo.Eax.Bits.Model == 15) ||
212 (VersionInfo.Eax.Bits.Model == 22) ||
213 (VersionInfo.Eax.Bits.Model == 23) ||
214 (VersionInfo.Eax.Bits.Model == 26))
215 {
216 FeatureBits |= KF_BRANCH;
217 }
218 }
219
220 /* Check if VMX is available */
221 if (VersionInfo.Ecx.Bits.VMX)
222 {
223 /* Read PROCBASED ctls and check if secondary are allowed */
226 if (ProcBasedCtls.Bits.Allowed1.ActivateSecondaryControls)
227 {
228 /* Read secondary controls and check if EPT is allowed */
231 if (ProcBasedCtls2.Bits.Allowed1.EPT)
232 FeatureBits |= KF_SLAT;
233 }
234 }
235 }
236 else if (Vendor == CPU_AMD)
237 {
238 FeatureBits |= KF_AUTHENTICAMD;
239 FeatureBits |= KF_BRANCH;
240
241 /* Check extended cpuid features */
242 if ((extendedFunction.MaxLeaf & 0xffffff00) == 0x80000000)
243 {
244 /* Check if CPUID_AMD_SVM_FEATURES (0x8000000A) is supported */
245 if (extendedFunction.MaxLeaf >= CPUID_AMD_SVM_FEATURES)
246 {
247 /* Read CPUID_AMD_SVM_FEATURES and check if Nested Paging is available */
248 CPUID_AMD_SVM_FEATURES_REGS SvmFeatures;
250 if (SvmFeatures.Edx.Bits.NP) FeatureBits |= KF_SLAT;
251 }
252 }
253 }
254
255 /* Return the Feature Bits */
256 return FeatureBits;
257}
#define MSR_IA32_VMX_PROCBASED_CTLS
#define MSR_IA32_VMX_PROCBASED_CTLS2
#define CPUID_AMD_SVM_FEATURES
Definition: Cpuid.h:329
#define CPUID_EXTENDED_FUNCTION
Definition: Cpuid.h:3802
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS
Definition: Cpuid.h:1301
#define CPUID_SIGNATURE
Definition: Cpuid.h:45
#define CPUID_VERSION_INFO
Definition: Cpuid.h:81
#define CPUID_EXTENDED_STATE
Definition: Cpuid.h:1948
#define CPUID_THERMAL_POWER_MANAGEMENT
Definition: Cpuid.h:1114
#define CPUID_EXTENDED_STATE_SUB_LEAF
Definition: Cpuid.h:2063
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO
Definition: Cpuid.h:1306
#define CPUID_EXTENDED_CPU_SIG
Definition: Cpuid.h:3825
OSVERSIONINFOW VersionInfo
Definition: wkssvc.c:40
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
Definition: intrin_ppc.h:682
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
Definition: intrin_x86.h:1680
unsigned __int64 ULONG64
Definition: imports.h:198
#define KF_SSE4_2
Definition: ketypes.h:74
#define KF_SMEP
Definition: ketypes.h:31
#define KF_SSSE3
Definition: ketypes.h:72
#define KF_MTRR
Definition: ketypes.h:37
#define KF_HUGEPAGE
Definition: ketypes.h:67
#define KF_XSTATE
Definition: ketypes.h:55
#define KF_DTS
Definition: ketypes.h:40
#define KF_CMPXCHG16B
Definition: ketypes.h:52
#define KF_CR4
Definition: ketypes.h:33
#define KF_AUTHENTICAMD
Definition: ketypes.h:53
#define KF_XMMI64
Definition: ketypes.h:48
#define KF_CMOV
Definition: ketypes.h:34
#define KF_ACNT2
Definition: ketypes.h:54
#define KF_SSE4_1
Definition: ketypes.h:73
#define KF_RDWRFSGSBASE
Definition: ketypes.h:60
#define KF_CMPXCHG8B
Definition: ketypes.h:38
#define KF_RDTSC
Definition: ketypes.h:32
#define KF_FAST_SYSCALL
Definition: ketypes.h:43
#define KF_3DNOW
Definition: ketypes.h:45
#define KF_NX_BIT
Definition: ketypes.h:61
#define KF_FXSR
Definition: ketypes.h:42
#define KF_RDRAND
Definition: ketypes.h:64
@ CPU_INTEL
Definition: ketypes.h:100
@ CPU_UNKNOWN
Definition: ketypes.h:98
@ CPU_AMD
Definition: ketypes.h:99
#define KF_XSAVES
Definition: ketypes.h:68
#define KF_LARGE_PAGE
Definition: ketypes.h:36
#define KF_BRANCH
Definition: ketypes.h:49
#define KF_AVX
Definition: ketypes.h:77
#define KF_GENUINE_INTEL
Definition: ketypes.h:56
#define KF_XMMI
Definition: ketypes.h:44
#define KF_MMX
Definition: ketypes.h:39
#define KF_XSAVEOPT
Definition: ketypes.h:47
#define KF_SSE3
Definition: ketypes.h:51
#define KF_SLAT
Definition: ketypes.h:58
#define KF_PAT
Definition: ketypes.h:41
#define KF_AVX2
Definition: ketypes.h:78
#define KF_RDTSCP
Definition: ketypes.h:66
#define KF_GLOBAL_PAGE
Definition: ketypes.h:35
#define KF_SMAP
Definition: ketypes.h:65
#define KF_AVX512F
Definition: ketypes.h:79
BOOLEAN KiSMTProcessorsPresent
Definition: cpu.c:31
UCHAR LogicalProcessorsPerPhysicalProcessor
Definition: ketypes.h:770
ULONG InitialApicId
Definition: ketypes.h:721
struct CPUID_AMD_SVM_FEATURES_EDX::@4444 Bits
CPUID_AMD_SVM_FEATURES_EDX Edx
Definition: Cpuid.h:389
struct CPUID_EXTENDED_CPU_SIG_REGS::@4429 Amd
struct CPUID_EXTENDED_CPU_SIG_REGS::@4428 Intel
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@4539 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
Definition: Cpuid.h:121
struct CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX::@4529 Bits
CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx
Definition: Cpuid.h:94
struct CPUID_THERMAL_POWER_MANAGEMENT_REGS::@4415 Undoc
struct MSR_IA32_VMX_PROCBASED_CTLS2_REGISTER::@4576 Bits
struct MSR_IA32_VMX_PROCBASED_CTLS_REGISTER::@4575 Bits

◆ KiGetLinkedTrapFrame()

FORCEINLINE PKTRAP_FRAME KiGetLinkedTrapFrame ( PKTRAP_FRAME  TrapFrame)

Definition at line 111 of file ke.h.

112{
113 return (PKTRAP_FRAME)TrapFrame->Edx;
114}
ULONG Edx
Definition: ketypes.h:321

◆ KiGetThreadNpxArea()

◆ KiGetUserModeStackAddress()

FORCEINLINE PULONG KiGetUserModeStackAddress ( void  )

Definition at line 1018 of file ke.h.

1019{
1020 return &(KeGetCurrentThread()->TrapFrame->HardwareEsp);
1021}

◆ KiI386PentiumLockErrataFixup()

VOID NTAPI KiI386PentiumLockErrataFixup ( VOID  )

Definition at line 804 of file cpu.c.

805{
806 KDESCRIPTOR IdtDescriptor = {0, 0, 0};
807 PKIDTENTRY NewIdt, NewIdt2;
808 PMMPTE PointerPte;
809
810 /* Allocate memory for a new IDT */
812
813 /* Put everything after the first 7 entries on a new page */
814 NewIdt2 = (PVOID)((ULONG_PTR)NewIdt + PAGE_SIZE - (7 * sizeof(KIDTENTRY)));
815
816 /* Disable interrupts */
817 _disable();
818
819 /* Get the current IDT and copy it */
820 __sidt(&IdtDescriptor.Limit);
821 RtlCopyMemory(NewIdt2,
822 (PVOID)IdtDescriptor.Base,
823 IdtDescriptor.Limit + 1);
824 IdtDescriptor.Base = (ULONG)NewIdt2;
825
826 /* Set the new IDT */
827 __lidt(&IdtDescriptor.Limit);
828 ((PKIPCR)KeGetPcr())->IDT = NewIdt2;
829
830 /* Restore interrupts */
831 _enable();
832
833 /* Set the first 7 entries as read-only to produce a fault */
834 PointerPte = MiAddressToPte(NewIdt);
835 ASSERT(PointerPte->u.Hard.Write == 1);
836 PointerPte->u.Hard.Write = 0;
837 KeInvalidateTlbEntry(NewIdt);
838}
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
__INTRIN_INLINE void __lidt(void *Source)
Definition: intrin_x86.h:2059
__INTRIN_INLINE void __sidt(void *Destination)
Definition: intrin_x86.h:2064
#define KIDTENTRY
Definition: ketypes.h:584
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
Definition: ke.h:274
#define MiAddressToPte(x)
Definition: mm.h:144
PVOID Base
Definition: ketypes.h:591
USHORT Limit
Definition: ketypes.h:590
ULONG64 Write
Definition: mmtypes.h:170
union _MMPTE::@2788 u
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217

Referenced by KiInitMachineDependent().

◆ KiInitializeMTRR()

VOID NTAPI KiInitializeMTRR ( IN BOOLEAN  FinalCpu)

Definition at line 22 of file mtrr.c.

23{
24 /* FIXME: Support this */
25 DPRINT("MTRR support detected but not yet taken advantage of\n");
26}

Referenced by KiInitMachineDependent().

◆ KiInitializePAT()

VOID NTAPI KiInitializePAT ( VOID  )

Definition at line 87 of file patpge.c.

88{
89 /* PAT values must be identical on every processor. */
91}
ULONG_PTR NTAPI KeIpiGenericCall(_In_ PKIPI_BROADCAST_WORKER Function, _In_ ULONG_PTR Argument)
Definition: ipi.c:44
static ULONG_PTR NTAPI Ki386InitializePATTarget(IN ULONG_PTR Context)
Definition: patpge.c:61

Referenced by KiInitMachineDependent().

◆ KiInitializePcr()

VOID NTAPI KiInitializePcr ( IN ULONG  ProcessorNumber,
IN PKIPCR  Pcr,
IN PKIDTENTRY  Idt,
IN PKGDTENTRY  Gdt,
IN PKTSS  Tss,
IN PKTHREAD  IdleThread,
IN PVOID  DpcStack 
)

Definition at line 284 of file kiinit.c.

291{
292 /* Setup the TIB */
293 Pcr->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
294 Pcr->NtTib.StackBase = 0;
295 Pcr->NtTib.StackLimit = 0;
296 Pcr->NtTib.Self = NULL;
297
298 /* Set the Current Thread */
299 Pcr->PrcbData.CurrentThread = IdleThread;
300
301 /* Set pointers to ourselves */
302 Pcr->SelfPcr = (PKPCR)Pcr;
303 Pcr->Prcb = &Pcr->PrcbData;
304
305 /* Set the PCR Version */
306 Pcr->MajorVersion = PCR_MAJOR_VERSION;
307 Pcr->MinorVersion = PCR_MINOR_VERSION;
308
309 /* Set the PCRB Version */
310 Pcr->PrcbData.MajorVersion = PRCB_MAJOR_VERSION;
311 Pcr->PrcbData.MinorVersion = PRCB_MINOR_VERSION;
312
313 /* Set the Build Type */
314 Pcr->PrcbData.BuildType = 0;
315#ifndef CONFIG_SMP
316 Pcr->PrcbData.BuildType |= PRCB_BUILD_UNIPROCESSOR;
317#endif
318#if DBG
319 Pcr->PrcbData.BuildType |= PRCB_BUILD_DEBUG;
320#endif
321
322 /* Set the Processor Number and current Processor Mask */
323 Pcr->PrcbData.Number = (UCHAR)ProcessorNumber;
324 Pcr->PrcbData.SetMember = 1 << ProcessorNumber;
325
326 /* Set the PRCB for this Processor */
327 KiProcessorBlock[ProcessorNumber] = Pcr->Prcb;
328
329 /* Start us out at PASSIVE_LEVEL */
330 Pcr->Irql = PASSIVE_LEVEL;
331
332 /* Set the GDI, IDT, TSS and DPC Stack */
333 Pcr->GDT = (PVOID)Gdt;
334 Pcr->IDT = Idt;
335 Pcr->TSS = Tss;
336 Pcr->TssCopy = Tss;
337 Pcr->PrcbData.DpcStack = DpcStack;
338
339 /* Setup the processor set */
340 Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember;
341}
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define PRCB_MINOR_VERSION
Definition: ketypes.h:336
#define PRCB_MAJOR_VERSION
Definition: ketypes.h:337
#define PRCB_BUILD_UNIPROCESSOR
Definition: ketypes.h:339
#define PRCB_BUILD_DEBUG
Definition: ketypes.h:338
#define EXCEPTION_CHAIN_END
Definition: rtltypes.h:63
PKPRCB KiProcessorBlock[]
Definition: krnlinit.c:31
#define PCR_MINOR_VERSION
Definition: ke.h:290
struct _KPCR * PKPCR
#define PCR_MAJOR_VERSION
Definition: ke.h:291

Referenced by KeStartAllProcessors().

◆ KiIret()

Definition at line 965 of file ke.h.

966{
967#if defined(__GNUC__)
968 __asm__ __volatile__
969 (
970 "iret"
971 );
972#elif defined(_MSC_VER)
973 __asm
974 {
975 iretd
976 }
977#else
978#error Unsupported compiler
979#endif
981}
#define UNREACHABLE
__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")

◆ KiIsNpxErrataPresent()

BOOLEAN NTAPI KiIsNpxErrataPresent ( VOID  )

Definition at line 875 of file cpu.c.

876{
877 static double Value1 = 4195835.0, Value2 = 3145727.0;
878 INT ErrataPresent;
879 ULONG Cr0;
880
881 /* Interrupts have to be disabled here. */
883
884 /* Read CR0 and remove FPU flags */
885 Cr0 = __readcr0();
886 __writecr0(Cr0 & ~(CR0_MP | CR0_TS | CR0_EM));
887
888 /* Initialize FPU state */
889 Ke386FnInit();
890
891 /* Multiply the magic values and divide, we should get the result back */
892#ifdef __GNUC__
893 __asm__ __volatile__
894 (
895 "fldl %1\n\t"
896 "fdivl %2\n\t"
897 "fmull %2\n\t"
898 "fldl %1\n\t"
899 "fsubp\n\t"
900 "fistpl %0\n\t"
901 : "=m" (ErrataPresent)
902 : "m" (Value1),
903 "m" (Value2)
904 );
905#else
906 __asm
907 {
908 fld Value1
909 fdiv Value2
910 fmul Value2
911 fld Value1
912 fsubp st(1), st(0)
913 fistp ErrataPresent
914 };
915#endif
916
917 /* Restore CR0 */
918 __writecr0(Cr0);
919
920 /* Return if there's an errata */
921 return ErrataPresent != 0;
922}
__INTRIN_INLINE unsigned long __readcr0(void)
Definition: intrin_x86.h:1836
__INTRIN_INLINE void __writecr0(unsigned int Data)
Definition: intrin_x86.h:1821
#define CR0_MP
Definition: ketypes.h:140
#define CR0_EM
Definition: ketypes.h:141
#define CR0_TS
Definition: ketypes.h:142
int32_t INT
Definition: typedefs.h:58

Referenced by KiVerifyCpuFeatures().

◆ KiIsNpxPresent()

BOOLEAN NTAPI KiIsNpxPresent ( VOID  )

◆ KiRestoreFastSyscallReturnState()

VOID NTAPI KiRestoreFastSyscallReturnState ( VOID  )

Definition at line 727 of file cpu.c.

728{
729 /* Check if the CPU Supports fast system call */
731 {
732 /* Check if it has been disabled */
734 {
735 /* Disable fast system call */
736 KeFeatureBits &= ~KF_FAST_SYSCALL;
738 DPRINT1("Support for SYSENTER disabled.\n");
739 }
740 else
741 {
742 /* Do an IPI to enable it */
744
745 /* It's enabled, so use the proper exit stub */
747 DPRINT("Support for SYSENTER detected.\n");
748 }
749 }
750 else
751 {
752 /* Use the IRET handler */
754 DPRINT1("No support for SYSENTER detected.\n");
755 }
756}
ULONG64 KeFeatureBits
Definition: krnlinit.c:22
#define DPRINT1
Definition: precomp.h:8
ULONG KiFastSystemCallDisable
Definition: cpu.c:28
ULONG_PTR NTAPI KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context)
Definition: cpu.c:713
DECLSPEC_NORETURN VOID FASTCALL KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
DECLSPEC_NORETURN VOID FASTCALL KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler
Definition: traphdlr.c:56

Referenced by KiInitMachineDependent().

◆ KiRundownThread()

FORCEINLINE VOID KiRundownThread ( IN PKTHREAD  Thread)

Definition at line 422 of file ke.h.

423{
424 /* Check if this is the NPX Thread */
425 if (KeGetCurrentPrcb()->NpxThread == Thread)
426 {
427 /* Clear it */
428 KeGetCurrentPrcb()->NpxThread = NULL;
429 Ke386FnInit();
430 }
431}

◆ KiServiceExit()

DECLSPEC_NORETURN VOID FASTCALL KiServiceExit ( IN PKTRAP_FRAME  TrapFrame,
IN NTSTATUS  Status 
)

Definition at line 150 of file traphdlr.c.

152{
153 ASSERT((TrapFrame->EFlags & EFLAGS_V86_MASK) == 0);
154 ASSERT(!KiIsFrameEdited(TrapFrame));
155
156 /* Copy the status into EAX */
157 TrapFrame->Eax = Status;
158
159 /* Common trap exit code */
160 KiCommonExit(TrapFrame, FALSE);
161
162 /* Restore previous mode */
163 KeGetCurrentThread()->PreviousMode = (CCHAR)TrapFrame->PreviousPreviousMode;
164
165 /* Check for user mode exit */
166 if (KiUserTrap(TrapFrame))
167 {
168 /* Check if we were single stepping */
169 if (TrapFrame->EFlags & EFLAGS_TF)
170 {
171 /* Must use the IRET handler */
172 KiSystemCallTrapReturn(TrapFrame);
173 }
174 else
175 {
176 /* We can use the sysexit handler */
177 KiFastCallExitHandler(TrapFrame);
179 }
180 }
181
182 /* Exit to kernel mode */
183 KiSystemCallReturn(TrapFrame);
184}
DECLSPEC_NORETURN VOID FASTCALL KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame)
PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler
Definition: traphdlr.c:56
char CCHAR
Definition: typedefs.h:51

Referenced by KiCallbackReturnHandler(), KiSystemServiceHandler(), and KiUserModeCallout().

◆ KiServiceExit2()

DECLSPEC_NORETURN VOID FASTCALL KiServiceExit2 ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 189 of file traphdlr.c.

190{
191 /* Common trap exit code */
192 KiCommonExit(TrapFrame, FALSE);
193
194 /* Restore previous mode */
195 KeGetCurrentThread()->PreviousMode = (CCHAR)TrapFrame->PreviousPreviousMode;
196
197 /* Check if this was a V8086 trap */
198 if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame);
199
200 /* Check for user mode exit */
201 if (KiUserTrap(TrapFrame)) KiTrapReturn(TrapFrame);
202
203 /* Check for edited frame */
204 if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame);
205
206 /* Check if we have single stepping enabled */
207 if (TrapFrame->EFlags & EFLAGS_TF) KiTrapReturnNoSegments(TrapFrame);
208
209 /* Exit the trap to kernel mode */
211}

◆ KiSetCR0Bits()

VOID NTAPI KiSetCR0Bits ( VOID  )

Definition at line 444 of file cpu.c.

445{
446 ULONG Cr0;
447
448 /* Save current CR0 */
449 Cr0 = __readcr0();
450
451 /* If this is a 486, enable Write-Protection */
452 if (KeGetCurrentPrcb()->CpuType > 3) Cr0 |= CR0_WP;
453
454 /* Set new Cr0 */
455 __writecr0(Cr0);
456}
#define CR0_WP
Definition: ketypes.h:145

Referenced by KiInitMachineDependent().

◆ KiSetProcessorType()

VOID NTAPI KiSetProcessorType ( VOID  )

Definition at line 40 of file cpu.c.

41{
42 PKPRCB Prcb = KeGetCurrentPrcb();
43 USHORT Family, Model, Stepping;
44
45 /* This initializes Prcb->CpuVendor */
48
49 /* Get the family, model and stepping */
50 KiGetCpuSignature(&Family, &Model, &Stepping);
51
52 /* Save them in the PRCB */
53 Prcb->CpuID = TRUE;
54 Prcb->CpuType = (UCHAR)Family;
55 Prcb->CpuStep = ((Model << 8) | Stepping);
56}
VOID NTAPI KiGetCpuSignature(_Out_ PUSHORT Family, _Out_ PUSHORT Model, _Out_ PUSHORT Stepping)
Get the CPU signature.
Definition: cpuinfo.c:118
VOID NTAPI KiGetCpuVendorString(_Out_writes_z_(CPU_VENDOR_STR_LEN) CHAR VendorString[CPU_VENDOR_STR_LEN])
Get the CPUID information for a given CPU.
Definition: cpuinfo.c:24
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.
Definition: cpuinfo.c:55
static int Family
Definition: ping.c:62
CHAR CpuType
Definition: ketypes.h:684
USHORT CpuStep
Definition: ketypes.h:689
CHAR CpuID
Definition: ketypes.h:685
UCHAR VendorString[13]
Definition: ketypes.h:901

◆ KiSetTebBase()

FORCEINLINE VOID KiSetTebBase ( PKPCR  Pcr,
PNT_TIB  TebAddress 
)

Definition at line 455 of file ke.h.

456{
457 Pcr->NtTib.Self = TebAddress;
458 Ke386SetGdtEntryBase(&Pcr->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)], TebAddress);
459}
FORCEINLINE VOID Ke386SetGdtEntryBase(PKGDTENTRY GdtEntry, PVOID BaseAddress)
Definition: ke.h:446
NT_TIB NtTib
Definition: ke.h:297
PUSHORT GDT
Definition: ke.h:54
struct _NT_TIB * Self
Definition: compat.h:720

Referenced by KiEnterV86Mode(), KiExitV86Mode(), and KiSwapContextExit().

◆ KiSwitchToBootStack()

FORCEINLINE DECLSPEC_NORETURN VOID KiSwitchToBootStack ( IN ULONG_PTR  InitialStack)

Definition at line 925 of file ke.h.

926{
928
929 /* We have to switch to a new stack before continuing kernel initialization */
930#ifdef __GNUC__
931 __asm__
932 (
933 "movl %0, %%esp\n\t"
934 "subl %1, %%esp\n\t"
935 "pushl %2\n\t"
936 "jmp _KiSystemStartupBootStack@0"
937 :
938 : "c"(InitialStack),
940 "i"(CR0_EM | CR0_TS | CR0_MP),
942 : "%esp"
943 );
944#elif defined(_MSC_VER)
945 __asm
946 {
947 mov esp, InitialStack
951 }
952#else
953#error Unknown Compiler
954#endif
955
957}
#define CODE_SEG(...)
DECLSPEC_NORETURN VOID NTAPI KiSystemStartupBootStack(VOID)
Definition: krnlinit.c:142
#define DECLSPEC_NORETURN
Definition: corecrt.h:131
#define KTRAP_FRAME_LENGTH
Definition: asm.h:316
#define KTRAP_FRAME_ALIGN
Definition: asm.h:317
static void push(calc_node_t *op)
Definition: rpn_ieee.c:113
#define NTAPI
Definition: typedefs.h:36

Referenced by KiSystemStartup().

◆ KiSystemCallTrampoline()

NTSTATUS NTAPI KiSystemCallTrampoline ( _In_ PVOID  Handler,
_In_ PVOID  Arguments,
_In_ ULONG  StackBytes 
)

Referenced by KiSystemServiceHandler().

◆ KiThreadStartup()

VOID NTAPI KiThreadStartup ( VOID  )

Definition at line 63 of file thrdini.c.

64{
65 PKTRAP_FRAME TrapFrame;
66 PKSTART_FRAME StartFrame;
67 PKUINIT_FRAME InitFrame;
68
69 /* Get the start and trap frames */
70 InitFrame = KeGetCurrentThread()->KernelStack;
71 StartFrame = &InitFrame->StartFrame;
72 TrapFrame = &InitFrame->TrapFrame;
73
74 /* Lower to APC level */
76
77 /* Call the system routine */
78 StartFrame->SystemRoutine(StartFrame->StartRoutine, StartFrame->StartContext);
79
80 /* If we returned, we better be a user thread */
81 if (!StartFrame->UserThread)
82 {
83 KeBugCheck(NO_USER_MODE_CONTEXT);
84 }
85
86 /* Exit to user-mode */
87 KiServiceExit2(TrapFrame);
88}
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1434
PKSYSTEM_ROUTINE SystemRoutine
Definition: thrdini.c:24
PVOID StartContext
Definition: thrdini.c:26
PKSTART_ROUTINE StartRoutine
Definition: thrdini.c:25
BOOLEAN UserThread
Definition: thrdini.c:27
KTRAP_FRAME TrapFrame
Definition: thrdini.c:28
KSTART_FRAME StartFrame
Definition: thrdini.c:26

Referenced by KiInitializeContextThread().

◆ KiTrap02()

VOID __cdecl KiTrap02 ( VOID  )

Referenced by Ki386InitializeTss().

◆ KiTrap08()

VOID __cdecl KiTrap08 ( VOID  )

Referenced by Ki386InitializeTss().

◆ KiTrap13()

VOID __cdecl KiTrap13 ( VOID  )

◆ KiVdmClearVdmEFlags()

FORCEINLINE ULONG KiVdmClearVdmEFlags ( ULONG  EFlags)

Definition at line 242 of file ke.h.

243{
244 return InterlockedAnd((PLONG)KiNtVdmState, ~EFlags);
245}
#define InterlockedAnd
Definition: interlocked.h:77
const PULONG KiNtVdmState
Definition: v86vdm.c:25
int32_t * PLONG
Definition: typedefs.h:58

Referenced by KiVdmOpcodeCLI(), KiVdmOpcodeINTnn(), KiVdmOpcodeIRET(), and KiVdmOpcodePOPF().

◆ KiVdmOpcodePrefix()

BOOLEAN FASTCALL KiVdmOpcodePrefix ( IN PKTRAP_FRAME  TrapFrame,
IN ULONG  Flags 
)

Definition at line 456 of file v86vdm.c.

458{
459 /* Increase instruction size */
460 Flags++;
461
462 /* Handle the next opcode */
463 return KiVdmHandleOpcode(TrapFrame, Flags);
464}

◆ KiVdmSetVdmEFlags()

FORCEINLINE ULONG KiVdmSetVdmEFlags ( ULONG  EFlags)

Definition at line 238 of file ke.h.

239{
240 return InterlockedOr((PLONG)KiNtVdmState, EFlags);
241}
#define InterlockedOr
Definition: interlocked.h:239

Referenced by KiVdmOpcodeIRET(), KiVdmOpcodePOPF(), and KiVdmOpcodeSTI().

◆ KxQueryProcessorCycleTime()

FORCEINLINE ULONG64 KxQueryProcessorCycleTime ( VOID  )

Definition at line 135 of file ke.h.

136{
137 /* Read the time stamp counter */
138 return __rdtsc();
139}

◆ ReadBatch()

VOID __cdecl ReadBatch ( VOID  )

Referenced by KiTrap0EHandler().

◆ VdmDispatchBop()

BOOLEAN NTAPI VdmDispatchBop ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 313 of file vdmexec.c.

314{
315 PUCHAR Eip;
316 PVDM_TIB VdmTib;
317
318 /* Check if this is from V86 mode */
319 if (TrapFrame->EFlags & EFLAGS_V86_MASK)
320 {
321 /* Calculate flat EIP */
322 Eip = (PUCHAR)((TrapFrame->Eip & 0xFFFF) +
323 ((TrapFrame->SegCs & 0xFFFF) << 4));
324
325 /* Check if this is a BOP */
326 if (*(PUSHORT)Eip == 0xC4C4)
327 {
328 /* Check sure its the DOS Bop */
329 if (Eip[2] == 0x50)
330 {
331 /* FIXME: No VDM Support */
332 ASSERT(FALSE);
333 }
334
335 /* Increase the number of BOP operations */
336 VdmBopCount++;
337
338 /* Get the TIB */
339 VdmTib = NtCurrentTeb()->Vdm;
340
341 /* Fill out a VDM Event */
342 VdmTib->EventInfo.InstructionSize = 3;
343 VdmTib->EventInfo.BopNumber = Eip[2];
344 VdmTib->EventInfo.Event = VdmBop;
345
346 /* End VDM Execution */
347 VdmEndExecution(TrapFrame, VdmTib);
348 }
349 else
350 {
351 /* Not a BOP */
352 return FALSE;
353 }
354 }
355 else
356 {
357 /* FIXME: Shouldn't happen on ROS */
358 ASSERT(FALSE);
359 }
360
361 /* Return success */
362 return TRUE;
363}
#define NtCurrentTeb
@ VdmBop
Definition: vdm.h:54
ULONG BopNumber
Definition: vdm.h:90
VDMEVENTCLASS Event
Definition: vdm.h:84
ULONG InstructionSize
Definition: vdm.h:85
Definition: vdm.h:129
VDMEVENTINFO EventInfo
Definition: vdm.h:135
uint16_t * PUSHORT
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
ULONG VdmBopCount
Definition: vdmexec.c:17
VOID NTAPI VdmEndExecution(IN PKTRAP_FRAME TrapFrame, IN PVDM_TIB VdmTib)
Definition: vdmexec.c:253

Referenced by KiTrap06Handler(), and KiVdmOpcodeIRET().

◆ VdmDispatchPageFault()

BOOLEAN NTAPI VdmDispatchPageFault ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 367 of file vdmexec.c.

369{
371 PVDM_TIB VdmTib;
372
373 PAGED_CODE();
374
375 /* Get the VDM TIB so we can terminate V86 execution */
376 Status = VdmpGetVdmTib(&VdmTib);
377 if (!NT_SUCCESS(Status))
378 {
379 /* Not a proper VDM fault, keep looking */
380 DPRINT1("VdmDispatchPageFault: no VDM TIB, Vdm=%p\n", NtCurrentTeb()->Vdm);
381 return FALSE;
382 }
383
384 /* Must be coming from V86 code */
385 ASSERT(TrapFrame->EFlags & EFLAGS_V86_MASK);
386
388 {
389 /* Fill out a VDM Event */
390 VdmTib->EventInfo.Event = VdmMemAccess;
391 VdmTib->EventInfo.InstructionSize = 0;
392
393 /* End VDM Execution */
394 VdmEndExecution(TrapFrame, VdmTib);
395 }
397 {
399 }
400 _SEH2_END;
401
402 /* Consider the exception handled if we succeeded */
403 DPRINT1("VdmDispatchPageFault EFlags %lx exit with 0x%lx\n", TrapFrame->EFlags, Status);
404 return NT_SUCCESS(Status);
405}
#define PAGED_CODE()
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
@ VdmMemAccess
Definition: vdm.h:52
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
NTSTATUS NTAPI VdmpGetVdmTib(OUT PVDM_TIB *VdmTib)
Definition: vdmexec.c:23

Referenced by KiTrap0EHandler().

Variable Documentation

◆ KeI386CpuStep

ULONG KeI386CpuStep
extern

Definition at line 26 of file cpu.c.

◆ KeI386CpuType

ULONG KeI386CpuType
extern

Definition at line 25 of file cpu.c.

Referenced by KeInvalidateAllCaches().

◆ KeI386EFlagsAndMaskV86

ULONG KeI386EFlagsAndMaskV86
extern

Definition at line 21 of file v86vdm.c.

Referenced by VdmSwapContext().

◆ KeI386EFlagsOrMaskV86

ULONG KeI386EFlagsOrMaskV86
extern

Definition at line 22 of file v86vdm.c.

Referenced by VdmSwapContext().

◆ KeI386FxsrPresent

ULONG KeI386FxsrPresent
extern

Definition at line 33 of file cpu.c.

Referenced by KiFlushNPXState().

◆ KeI386MachineType

ULONG KeI386MachineType
extern

Definition at line 27 of file cpu.c.

Referenced by CmpInitializeHardwareConfiguration(), and KiInitializeMachineType().

◆ KeI386NpxPresent

ULONG KeI386NpxPresent
extern

Definition at line 28 of file cpu.c.

Referenced by KeRestoreFloatingPointState(), and KeSaveFloatingPointState().

◆ KeI386VirtualIntExtensions

◆ KeI386XMMIPresent

ULONG KeI386XMMIPresent
extern

Definition at line 32 of file cpu.c.

◆ Ki386IopmSaveArea

PVOID Ki386IopmSaveArea
extern

Definition at line 23 of file v86vdm.c.

Referenced by Ke386CallBios(), and KiInitializeKernel().

◆ KiDebugRegisterContextOffsets

UCHAR KiDebugRegisterContextOffsets[9]
extern

◆ KiDebugRegisterTrapOffsets

UCHAR KiDebugRegisterTrapOffsets[9]
extern

◆ KiFastSystemCallDisable

ULONG KiFastSystemCallDisable
extern

Definition at line 28 of file cpu.c.

Referenced by KiRestoreFastSyscallReturnState().

◆ KiI386PentiumLockErrataPresent

BOOLEAN KiI386PentiumLockErrataPresent
extern

Definition at line 42 of file cpu.c.

Referenced by KiGetFeatureBits(), KiInitMachineDependent(), and MiInitMachineDependent().

◆ KiIdt

KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR+1]
extern

Definition at line 50 of file except.c.

Referenced by KeInitExceptions().

◆ KiIdtDescriptor

KDESCRIPTOR KiIdtDescriptor
extern

Definition at line 51 of file except.c.

Referenced by KeInitExceptions(), and KiSystemStartup().

◆ KiMXCsrMask

ULONG KiMXCsrMask
extern

Definition at line 30 of file cpu.c.

Referenced by KeContextToTrapFrame(), and KiInitMachineDependent().

◆ KiNtVdmState

◆ KiSystemCallExit

CHAR KiSystemCallExit[]
extern

◆ KiSystemCallExit2

CHAR KiSystemCallExit2[]
extern

◆ KiSystemCallExitBranch

CHAR KiSystemCallExitBranch[]
extern