ReactOS 0.4.17-dev-1343-g8fe3cee
ke.h File Reference
#include "intrin_i.h"
Include dependency graph for ke.h:

Go to the source code of this file.

Macros

#define KD_BREAKPOINT_TYPE   ULONG
 
#define KD_BREAKPOINT_SIZE   sizeof(ULONG)
 
#define KD_BREAKPOINT_VALUE   0xD43E0000
 
#define ESR_EC_SHIFT   26
 
#define ESR_EC_UNKNOWN   0x00
 
#define ESR_EC_WFX   0x01
 
#define ESR_EC_FP_ACCESS   0x07
 
#define ESR_EC_ILLEGAL_STATE   0x0E
 
#define ESR_EC_SVC64   0x15
 
#define ESR_EC_SYS64   0x18
 
#define ESR_EC_SVE   0x19
 
#define ESR_EC_IABT_LOWER   0x20
 
#define ESR_EC_IABT_CURRENT   0x21
 
#define ESR_EC_PC_ALIGN   0x22
 
#define ESR_EC_DABT_LOWER   0x24
 
#define ESR_EC_DABT_CURRENT   0x25
 
#define ESR_EC_SP_ALIGN   0x26
 
#define ESR_EC_FP_EXCEPTION   0x2C
 
#define ESR_EC_SERROR   0x2F
 
#define ESR_EC_BREAKPOINT_LOWER   0x30
 
#define ESR_EC_BREAKPOINT_CURRENT   0x31
 
#define ESR_EC_STEP_LOWER   0x32
 
#define ESR_EC_STEP_CURRENT   0x33
 
#define ESR_EC_WATCHPOINT_LOWER   0x34
 
#define ESR_EC_WATCHPOINT_CURRENT   0x35
 
#define ESR_EC_BRK64   0x3C
 
#define ESR_ISS_WNR   0x40
 
#define ESR_ISS_FSC_MASK   0x3F
 
#define KI_TRAP_SYNCHRONOUS   0
 
#define KI_TRAP_IRQ   1
 
#define KI_TRAP_FIQ   2
 
#define KI_TRAP_SERROR   3
 
#define KeGetTrapFrame(Thread)
 
#define KeGetExceptionFrame(Thread)
 
#define KeGetContextSwitches(Prcb)    ((Prcb)->KeContextSwitches)
 
#define KiGetSecondLevelDCacheSize()   ((PKIPCR)KeGetPcr())->SecondLevelCacheSize
 
#define KeGetTrapFrameInterruptState(TrapFrame)    (((TrapFrame)->Spsr & ARM64_PSR_I) == 0)
 
#define KiGetPreviousMode(TrapFrame)    (KiUserTrap(TrapFrame) ? UserMode : KernelMode)
 
#define KeArchInitThreadWithContext(Thread, SystemRoutine, StartRoutine, StartContext, Context)    KeArm64InitThreadWithContext(Thread,SystemRoutine,StartRoutine,StartContext,Context)
 

Functions

FORCEINLINE ULONG_PTR KeGetContextPc (_In_ PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextPc (_Inout_ PCONTEXT Context, _In_ ULONG_PTR ProgramCounter)
 
FORCEINLINE ULONG_PTR KeGetContextReturnRegister (_In_ PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextReturnRegister (_Inout_ PCONTEXT Context, _In_ ULONG_PTR ReturnValue)
 
FORCEINLINE ULONG_PTR KeGetContextStackRegister (_In_ PCONTEXT Context)
 
FORCEINLINE ULONG_PTR KeGetContextFrameRegister (_In_ PCONTEXT Context)
 
FORCEINLINE VOID KeSetContextFrameRegister (_Inout_ PCONTEXT Context, _In_ ULONG_PTR Frame)
 
FORCEINLINE ULONG_PTR KeGetTrapFramePc (_In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE PKTRAP_FRAME KiGetLinkedTrapFrame (_In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister (_In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG_PTR KeGetTrapFrameFrameRegister (_In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE ULONG64 KxQueryProcessorCycleTime (VOID)
 
FORCEINLINE BOOLEAN KeDisableInterrupts (VOID)
 
FORCEINLINE VOID KeRestoreInterrupts (_In_ BOOLEAN WereEnabled)
 
FORCEINLINE VOID KeInvalidateTlbEntry (_In_ PVOID Address)
 
FORCEINLINE VOID KeFlushProcessTb (VOID)
 
FORCEINLINE VOID KeSweepICache (_In_ PVOID BaseAddress, _In_ SIZE_T FlushSize)
 
FORCEINLINE VOID KiRundownThread (_In_ PKTHREAD Thread)
 
FORCEINLINE BOOLEAN KiUserTrap (_In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE VOID KiEndInterrupt (_In_ KIRQL Irql, _In_ PKTRAP_FRAME TrapFrame)
 
FORCEINLINE VOID Ki386PerfEnd (VOID)
 
FORCEINLINE PULONG_PTR KiGetUserModeStackAddress (VOID)
 
DECLSPEC_NORETURN VOID KiSwitchToBootStack (_In_ ULONG_PTR InitialStack)
 
VOID KiArm64InitializeTraps (VOID)
 
VOID KiSetProcessorType (VOID)
 
ULONG64 KiGetFeatureBits (VOID)
 Evaluates the KeFeatureFlag bits for the current CPU.
 
VOID KeArm64InitThreadWithContext (_In_ PKTHREAD Thread, _In_ PKSYSTEM_ROUTINE SystemRoutine, _In_ PKSTART_ROUTINE StartRoutine, _In_ PVOID StartContext, _In_opt_ PCONTEXT Context)
 
VOID KiGetTrapContext (_In_ PKTRAP_FRAME TrapFrame, _Out_ PCONTEXT Context)
 
VOID KiSetTrapContext (_Out_ PKTRAP_FRAME TrapFrame, _In_ PCONTEXT Context, _In_ KPROCESSOR_MODE RequestorMode)
 
DECLSPEC_NORETURN VOID KiUserCallbackExit (_In_ PKTRAP_FRAME TrapFrame)
 
DECLSPEC_NORETURN VOID KiExceptionExit (_In_ PKTRAP_FRAME TrapFrame, _In_ PKEXCEPTION_FRAME ExceptionFrame)
 
NTHALAPI NTSTATUS NTAPI HalAllocateAdapterChannel (_In_ PADAPTER_OBJECT AdapterObject, _In_ PWAIT_CONTEXT_BLOCK Wcb, _In_ ULONG NumberOfMapRegisters, _In_ PDRIVER_CONTROL ExecutionRoutine)
 

Variables

NTKERNELAPI volatile KSYSTEM_TIME KeTickCount
 

Macro Definition Documentation

◆ ESR_EC_BREAKPOINT_CURRENT

#define ESR_EC_BREAKPOINT_CURRENT   0x31

Definition at line 43 of file ke.h.

◆ ESR_EC_BREAKPOINT_LOWER

#define ESR_EC_BREAKPOINT_LOWER   0x30

Definition at line 42 of file ke.h.

◆ ESR_EC_BRK64

#define ESR_EC_BRK64   0x3C

Definition at line 48 of file ke.h.

◆ ESR_EC_DABT_CURRENT

#define ESR_EC_DABT_CURRENT   0x25

Definition at line 38 of file ke.h.

◆ ESR_EC_DABT_LOWER

#define ESR_EC_DABT_LOWER   0x24

Definition at line 37 of file ke.h.

◆ ESR_EC_FP_ACCESS

#define ESR_EC_FP_ACCESS   0x07

Definition at line 29 of file ke.h.

◆ ESR_EC_FP_EXCEPTION

#define ESR_EC_FP_EXCEPTION   0x2C

Definition at line 40 of file ke.h.

◆ ESR_EC_IABT_CURRENT

#define ESR_EC_IABT_CURRENT   0x21

Definition at line 35 of file ke.h.

◆ ESR_EC_IABT_LOWER

#define ESR_EC_IABT_LOWER   0x20

Definition at line 34 of file ke.h.

◆ ESR_EC_ILLEGAL_STATE

#define ESR_EC_ILLEGAL_STATE   0x0E

Definition at line 30 of file ke.h.

◆ ESR_EC_PC_ALIGN

#define ESR_EC_PC_ALIGN   0x22

Definition at line 36 of file ke.h.

◆ ESR_EC_SERROR

#define ESR_EC_SERROR   0x2F

Definition at line 41 of file ke.h.

◆ ESR_EC_SHIFT

#define ESR_EC_SHIFT   26

Definition at line 26 of file ke.h.

◆ ESR_EC_SP_ALIGN

#define ESR_EC_SP_ALIGN   0x26

Definition at line 39 of file ke.h.

◆ ESR_EC_STEP_CURRENT

#define ESR_EC_STEP_CURRENT   0x33

Definition at line 45 of file ke.h.

◆ ESR_EC_STEP_LOWER

#define ESR_EC_STEP_LOWER   0x32

Definition at line 44 of file ke.h.

◆ ESR_EC_SVC64

#define ESR_EC_SVC64   0x15

Definition at line 31 of file ke.h.

◆ ESR_EC_SVE

#define ESR_EC_SVE   0x19

Definition at line 33 of file ke.h.

◆ ESR_EC_SYS64

#define ESR_EC_SYS64   0x18

Definition at line 32 of file ke.h.

◆ ESR_EC_UNKNOWN

#define ESR_EC_UNKNOWN   0x00

Definition at line 27 of file ke.h.

◆ ESR_EC_WATCHPOINT_CURRENT

#define ESR_EC_WATCHPOINT_CURRENT   0x35

Definition at line 47 of file ke.h.

◆ ESR_EC_WATCHPOINT_LOWER

#define ESR_EC_WATCHPOINT_LOWER   0x34

Definition at line 46 of file ke.h.

◆ ESR_EC_WFX

#define ESR_EC_WFX   0x01

Definition at line 28 of file ke.h.

◆ ESR_ISS_FSC_MASK

#define ESR_ISS_FSC_MASK   0x3F

Definition at line 52 of file ke.h.

◆ ESR_ISS_WNR

#define ESR_ISS_WNR   0x40

Definition at line 51 of file ke.h.

◆ KD_BREAKPOINT_SIZE

#define KD_BREAKPOINT_SIZE   sizeof(ULONG)

Definition at line 22 of file ke.h.

◆ KD_BREAKPOINT_TYPE

#define KD_BREAKPOINT_TYPE   ULONG

Definition at line 21 of file ke.h.

◆ KD_BREAKPOINT_VALUE

#define KD_BREAKPOINT_VALUE   0xD43E0000

Definition at line 23 of file ke.h.

◆ KeArchInitThreadWithContext

#define KeArchInitThreadWithContext (   Thread,
  SystemRoutine,
  StartRoutine,
  StartContext,
  Context 
)     KeArm64InitThreadWithContext(Thread,SystemRoutine,StartRoutine,StartContext,Context)

Definition at line 301 of file ke.h.

◆ KeGetContextSwitches

#define KeGetContextSwitches (   Prcb)     ((Prcb)->KeContextSwitches)

Definition at line 176 of file ke.h.

◆ KeGetExceptionFrame

#define KeGetExceptionFrame (   Thread)
Value:
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
struct _KEXCEPTION_FRAME * PKEXCEPTION_FRAME
#define KeGetTrapFrame(Thread)
Definition: ke.h:218
uint32_t ULONG_PTR
Definition: typedefs.h:65

Definition at line 168 of file ke.h.

◆ KeGetTrapFrame

#define KeGetTrapFrame (   Thread)
Value:
((PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \
sizeof(KTRAP_FRAME)))
struct _KTRAP_FRAME * PKTRAP_FRAME

Definition at line 164 of file ke.h.

◆ KeGetTrapFrameInterruptState

#define KeGetTrapFrameInterruptState (   TrapFrame)     (((TrapFrame)->Spsr & ARM64_PSR_I) == 0)

Definition at line 189 of file ke.h.

◆ KI_TRAP_FIQ

#define KI_TRAP_FIQ   2

Definition at line 57 of file ke.h.

◆ KI_TRAP_IRQ

#define KI_TRAP_IRQ   1

Definition at line 56 of file ke.h.

◆ KI_TRAP_SERROR

#define KI_TRAP_SERROR   3

Definition at line 58 of file ke.h.

◆ KI_TRAP_SYNCHRONOUS

#define KI_TRAP_SYNCHRONOUS   0

Definition at line 55 of file ke.h.

◆ KiGetPreviousMode

#define KiGetPreviousMode (   TrapFrame)     (KiUserTrap(TrapFrame) ? UserMode : KernelMode)

Definition at line 254 of file ke.h.

◆ KiGetSecondLevelDCacheSize

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

Definition at line 183 of file ke.h.

Function Documentation

◆ HalAllocateAdapterChannel()

NTHALAPI NTSTATUS NTAPI HalAllocateAdapterChannel ( _In_ PADAPTER_OBJECT  AdapterObject,
_In_ PWAIT_CONTEXT_BLOCK  Wcb,
_In_ ULONG  NumberOfMapRegisters,
_In_ PDRIVER_CONTROL  ExecutionRoutine 
)

◆ KeArm64InitThreadWithContext()

VOID KeArm64InitThreadWithContext ( _In_ PKTHREAD  Thread,
_In_ PKSYSTEM_ROUTINE  SystemRoutine,
_In_ PKSTART_ROUTINE  StartRoutine,
_In_ PVOID  StartContext,
_In_opt_ PCONTEXT  Context 
)

◆ KeDisableInterrupts()

FORCEINLINE BOOLEAN KeDisableInterrupts ( VOID  )

Definition at line 195 of file ke.h.

196{
197 ULONG64 Daif;
198
200 _disable();
201 return (Daif & ARM64_PSR_I) ? FALSE : TRUE;
202}
#define ARM64_DAIF
Definition: intrin_i.h:22
#define KeArm64ReadRegister(Register)
Definition: intrin_i.h:46
#define ARM64_PSR_I
Definition: intrin_i.h:39
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned __int64 ULONG64
Definition: imports.h:198
void __cdecl _disable(void)
Definition: intrin_arm.h:365

◆ KeFlushProcessTb()

FORCEINLINE VOID KeFlushProcessTb ( VOID  )

Definition at line 224 of file ke.h.

225{
227}
VOID NTAPI KeArm64FlushTbAll(VOID)

◆ KeGetContextFrameRegister()

FORCEINLINE ULONG_PTR KeGetContextFrameRegister ( _In_ PCONTEXT  Context)

Definition at line 107 of file ke.h.

109{
110 return Context->Fp;
111}
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81

◆ KeGetContextPc()

FORCEINLINE ULONG_PTR KeGetContextPc ( _In_ PCONTEXT  Context)

Definition at line 65 of file ke.h.

67{
68 return Context->Pc;
69}

◆ KeGetContextReturnRegister()

FORCEINLINE ULONG_PTR KeGetContextReturnRegister ( _In_ PCONTEXT  Context)

Definition at line 82 of file ke.h.

84{
85 return Context->X0;
86}

◆ KeGetContextStackRegister()

FORCEINLINE ULONG_PTR KeGetContextStackRegister ( _In_ PCONTEXT  Context)

Definition at line 99 of file ke.h.

101{
102 return Context->Sp;
103}

◆ KeGetTrapFrameFrameRegister()

FORCEINLINE ULONG_PTR KeGetTrapFrameFrameRegister ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 148 of file ke.h.

150{
151 return TrapFrame->Fp;
152}

◆ KeGetTrapFramePc()

FORCEINLINE ULONG_PTR KeGetTrapFramePc ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 124 of file ke.h.

126{
127 return TrapFrame->Pc;
128}

◆ KeGetTrapFrameStackRegister()

FORCEINLINE ULONG_PTR KeGetTrapFrameStackRegister ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 140 of file ke.h.

142{
143 return TrapFrame->Sp;
144}

◆ KeInvalidateTlbEntry()

FORCEINLINE VOID KeInvalidateTlbEntry ( _In_ PVOID  Address)

Definition at line 216 of file ke.h.

218{
220}
VOID NTAPI KeArm64FlushTbEntry(_In_ PVOID Address)
static WCHAR Address[46]
Definition: ping.c:68

◆ KeRestoreInterrupts()

FORCEINLINE VOID KeRestoreInterrupts ( _In_ BOOLEAN  WereEnabled)

Definition at line 207 of file ke.h.

209{
210 if (WereEnabled)
211 _enable();
212}
void __cdecl _enable(void)
Definition: intrin_arm.h:373

◆ KeSetContextFrameRegister()

FORCEINLINE VOID KeSetContextFrameRegister ( _Inout_ PCONTEXT  Context,
_In_ ULONG_PTR  Frame 
)

Definition at line 115 of file ke.h.

118{
119 Context->Fp = Frame;
120}

◆ KeSetContextPc()

FORCEINLINE VOID KeSetContextPc ( _Inout_ PCONTEXT  Context,
_In_ ULONG_PTR  ProgramCounter 
)

Definition at line 73 of file ke.h.

76{
77 Context->Pc = ProgramCounter;
78}

◆ KeSetContextReturnRegister()

FORCEINLINE VOID KeSetContextReturnRegister ( _Inout_ PCONTEXT  Context,
_In_ ULONG_PTR  ReturnValue 
)

Definition at line 90 of file ke.h.

93{
94 Context->X0 = ReturnValue;
95}
UINT32 void void ** ReturnValue
Definition: acevents.h:216

◆ KeSweepICache()

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

Definition at line 231 of file ke.h.

234{
236}
VOID NTAPI KeArm64SweepIcacheRange(_In_ PVOID BaseAddress, _In_ SIZE_T Length)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize _Pre_valid_ PVOID * BaseAddress
Definition: mmfuncs.h:408

◆ Ki386PerfEnd()

FORCEINLINE VOID Ki386PerfEnd ( VOID  )

Definition at line 269 of file ke.h.

270{
271}

◆ KiArm64InitializeTraps()

VOID KiArm64InitializeTraps ( VOID  )

◆ KiEndInterrupt()

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

Definition at line 259 of file ke.h.

262{
264 UNREFERENCED_PARAMETER(TrapFrame);
265}
_Out_ PKIRQL Irql
Definition: csq.h:179
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329

◆ KiExceptionExit()

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

◆ KiGetFeatureBits()

ULONG64 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
if(dx< 0)
Definition: linetemp.h:194
#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
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1197
#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 CpuVendor
Definition: ketypes.h:704
UCHAR LogicalProcessorsPerPhysicalProcessor
Definition: ketypes.h:770
ULONG InitialApicId
Definition: ketypes.h:721
unsigned char UCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
struct CPUID_AMD_SVM_FEATURES_EDX::@4540 Bits
CPUID_AMD_SVM_FEATURES_EDX Edx
Definition: Cpuid.h:389
struct CPUID_EXTENDED_CPU_SIG_REGS::@4524 Intel
struct CPUID_EXTENDED_CPU_SIG_REGS::@4525 Amd
struct CPUID_EXTENDED_STATE_SUB_LEAF_EAX::@4635 Bits
CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax
Definition: Cpuid.h:121
struct CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX::@4625 Bits
CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx
Definition: Cpuid.h:94
struct CPUID_THERMAL_POWER_MANAGEMENT_REGS::@4511 Undoc
struct MSR_IA32_VMX_PROCBASED_CTLS2_REGISTER::@4672 Bits
struct MSR_IA32_VMX_PROCBASED_CTLS_REGISTER::@4671 Bits

◆ KiGetLinkedTrapFrame()

FORCEINLINE PKTRAP_FRAME KiGetLinkedTrapFrame ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 132 of file ke.h.

134{
135 return (PKTRAP_FRAME)TrapFrame->TrapFrame;
136}

◆ KiGetTrapContext()

VOID KiGetTrapContext ( _In_ PKTRAP_FRAME  TrapFrame,
_Out_ PCONTEXT  Context 
)

◆ KiGetUserModeStackAddress()

FORCEINLINE PULONG_PTR KiGetUserModeStackAddress ( VOID  )

Definition at line 275 of file ke.h.

276{
277 return &PsGetCurrentThread()->Tcb.TrapFrame->Sp;
278}
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81

◆ KiRundownThread()

FORCEINLINE VOID KiRundownThread ( _In_ PKTHREAD  Thread)

Definition at line 240 of file ke.h.

242{
244}

◆ KiSetProcessorType()

VOID 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
unsigned short USHORT
Definition: pedump.c:61
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

◆ KiSetTrapContext()

VOID KiSetTrapContext ( _Out_ PKTRAP_FRAME  TrapFrame,
_In_ PCONTEXT  Context,
_In_ KPROCESSOR_MODE  RequestorMode 
)

◆ KiSwitchToBootStack()

DECLSPEC_NORETURN VOID KiSwitchToBootStack ( _In_ ULONG_PTR  InitialStack)

◆ KiUserCallbackExit()

DECLSPEC_NORETURN VOID KiUserCallbackExit ( _In_ PKTRAP_FRAME  TrapFrame)

◆ KiUserTrap()

FORCEINLINE BOOLEAN KiUserTrap ( _In_ PKTRAP_FRAME  TrapFrame)

Definition at line 248 of file ke.h.

250{
251 return ((TrapFrame->Spsr & ARM64_PSR_MODE_MASK) == ARM64_PSR_MODE_EL0T);
252}
#define ARM64_PSR_MODE_EL0T
Definition: intrin_i.h:43
#define ARM64_PSR_MODE_MASK
Definition: intrin_i.h:42

◆ KxQueryProcessorCycleTime()

FORCEINLINE ULONG64 KxQueryProcessorCycleTime ( VOID  )

Definition at line 156 of file ke.h.

157{
158 return (ULONG64)_ReadStatusReg(ARM64_CNTVCT);
159}

Variable Documentation

◆ KeTickCount

NTKERNELAPI volatile KSYSTEM_TIME KeTickCount
extern

Definition at line 19 of file clock.c.