1 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H
2 #define __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H
9 extern ULONG Ke386CacheAlignment
;
12 // Thread Dispatcher Header DebugActive Mask
14 #define DR_MASK(x) (1 << (x))
15 #define DR_REG_MASK 0x4F
17 #define IMAGE_FILE_MACHINE_ARCHITECTURE IMAGE_FILE_MACHINE_I386
20 // INT3 is 1 byte long
22 #define KD_BREAKPOINT_TYPE UCHAR
23 #define KD_BREAKPOINT_SIZE sizeof(UCHAR)
24 #define KD_BREAKPOINT_VALUE 0xCC
27 // Macros for getting and setting special purpose registers in portable code
29 #define KeGetContextPc(Context) \
32 #define KeSetContextPc(Context, ProgramCounter) \
33 ((Context)->Eip = (ProgramCounter))
35 #define KeGetTrapFramePc(TrapFrame) \
38 #define KeGetContextReturnRegister(Context) \
41 #define KeSetContextReturnRegister(Context, ReturnValue) \
42 ((Context)->Eax = (ReturnValue))
45 // Macro to get trap and exception frame from a thread stack
47 #define KeGetTrapFrame(Thread) \
48 (PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \
49 sizeof(KTRAP_FRAME) - \
52 #define KeGetExceptionFrame(Thread) \
56 // Macro to get context switches from the PRCB
57 // All architectures but x86 have it in the PRCB's KeContextSwitches
59 #define KeGetContextSwitches(Prcb) \
60 CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
63 // Returns the Interrupt State from a Trap Frame.
64 // ON = TRUE, OFF = FALSE
66 #define KeGetTrapFrameInterruptState(TrapFrame) \
67 BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK)
70 // Invalidates the TLB entry for a specified address
74 KeInvalidateTlbEntry(IN PVOID Address
)
76 /* Invalidate the TLB entry for this address */
94 KiGetCacheInformation(VOID
);
104 KiIsNpxErrataPresent(
110 KiSetProcessorType(VOID
);
114 KiGetFeatureBits(VOID
);
116 #ifdef _NTOSKRNL_ /* FIXME: Move flags above to NDK instead of here */
119 KiThreadStartup(PKSYSTEM_ROUTINE SystemRoutine
,
120 PKSTART_ROUTINE StartRoutine
,
123 KTRAP_FRAME TrapFrame
);
128 Ke386GetGdtEntryThread(
131 IN PKGDTENTRY Descriptor
137 IN FLOATING_SAVE_AREA
*SaveArea
143 IN PKTRAP_FRAME TrapFrame
148 Ki386SetupAndExitToV86Mode(
160 Ki386EnableGlobalPage(
161 IN
volatile ULONG_PTR Context
166 KiI386PentiumLockErrataFixup(
184 KiAmdK6InitializeMTRR(
190 KiRestoreFastSyscallReturnState(
208 Ki386EnableXMMIExceptions(
213 // Global x86 only Kernel data
215 extern PVOID Ki386IopmSaveArea
;
216 extern ULONG KeI386EFlagsAndMaskV86
;
217 extern ULONG KeI386EFlagsOrMaskV86
;
218 extern BOOLEAN KeI386VirtualIntExtensions
;
219 extern KIDTENTRY KiIdt
[MAXIMUM_IDTVECTOR
];
220 extern KDESCRIPTOR KiIdtDescriptor
;
221 extern ULONG Ke386GlobalPagesEnabled
;
222 extern BOOLEAN KiI386PentiumLockErrataPresent
;
223 extern ULONG KeI386NpxPresent
;
224 extern ULONG KeI386XMMIPresent
;
225 extern ULONG KeI386FxsrPresent
;
226 extern ULONG KiMXCsrMask
;
227 extern ULONG KeI386CpuType
;
228 extern ULONG KeI386CpuStep
;
229 extern UCHAR KiDebugRegisterTrapOffsets
[9];
230 extern UCHAR KiDebugRegisterContextOffsets
[9];
231 extern VOID __cdecl
KiTrap2(VOID
);
232 extern VOID __cdecl
KiTrap8(VOID
);
233 extern VOID __cdecl
KiTrap19(VOID
);
234 extern VOID __cdecl
KiFastCallEntry(VOID
);
237 // Sanitizes a selector
241 Ke386SanitizeSeg(IN ULONG Cs
,
242 IN KPROCESSOR_MODE Mode
)
245 // Check if we're in kernel-mode, and force CPL 0 if so.
246 // Otherwise, force CPL 3.
248 return ((Mode
== KernelMode
) ?
249 (Cs
& (0xFFFF & ~RPL_MASK
)) :
250 (RPL_MASK
| (Cs
& 0xFFFF)));
258 Ke386SanitizeFlags(IN ULONG Eflags
,
259 IN KPROCESSOR_MODE Mode
)
262 // Check if we're in kernel-mode, and sanitize EFLAGS if so.
263 // Otherwise, also force interrupt mask on.
265 return ((Mode
== KernelMode
) ?
266 (Eflags
& (EFLAGS_USER_SANITIZE
| EFLAGS_INTERRUPT_MASK
)) :
267 (EFLAGS_INTERRUPT_MASK
| (Eflags
& EFLAGS_USER_SANITIZE
)));
271 // Gets a DR register from a CONTEXT structure
275 KiDrFromContext(IN ULONG Dr
,
278 return *(PVOID
*)((ULONG_PTR
)Context
+ KiDebugRegisterContextOffsets
[Dr
]);
282 // Gets a DR register from a KTRAP_FRAME structure
286 KiDrFromTrapFrame(IN ULONG Dr
,
287 IN PKTRAP_FRAME TrapFrame
)
289 return (PVOID
*)((ULONG_PTR
)TrapFrame
+ KiDebugRegisterTrapOffsets
[Dr
]);
293 // Sanitizes a Debug Register
297 Ke386SanitizeDr(IN PVOID DrAddress
,
298 IN KPROCESSOR_MODE Mode
)
301 // Check if we're in kernel-mode, and return the address directly if so.
302 // Otherwise, make sure it's not inside the kernel-mode address space.
303 // If it is, then clear the address.
305 return ((Mode
== KernelMode
) ? DrAddress
:
306 (DrAddress
<= MM_HIGHEST_USER_ADDRESS
) ? DrAddress
: 0);
310 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H */