xref: /reactos/sdk/include/xdk/x86/ke.h (revision 8398c9fc)
1 $if (_WDMDDK_)
2 /** Kernel definitions for x86 **/
3 
4 /* Interrupt request levels */
5 #define PASSIVE_LEVEL           0
6 #define LOW_LEVEL               0
7 #define APC_LEVEL               1
8 #define DISPATCH_LEVEL          2
9 #define CMCI_LEVEL              5
10 #define PROFILE_LEVEL           27
11 #define CLOCK1_LEVEL            28
12 #define CLOCK2_LEVEL            28
13 #define IPI_LEVEL               29
14 #define POWER_LEVEL             30
15 #define HIGH_LEVEL              31
16 #define CLOCK_LEVEL             CLOCK2_LEVEL
17 
18 #define KIP0PCRADDRESS          0xffdff000
19 #define KI_USER_SHARED_DATA     0xffdf0000
20 #define SharedUserData          ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
21 
22 #define PAGE_SIZE               0x1000
23 #define PAGE_SHIFT              12L
24 #define KeGetDcacheFillSize()   1L
25 
26 #define EFLAG_SIGN              0x8000
27 #define EFLAG_ZERO              0x4000
28 #define EFLAG_SELECT            (EFLAG_SIGN | EFLAG_ZERO)
29 
30 #define RESULT_NEGATIVE         ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
31 #define RESULT_ZERO             ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
32 #define RESULT_POSITIVE         ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
33 
34 
35 typedef struct _KFLOATING_SAVE {
36   ULONG ControlWord;
37   ULONG StatusWord;
38   ULONG ErrorOffset;
39   ULONG ErrorSelector;
40   ULONG DataOffset;
41   ULONG DataSelector;
42   ULONG Cr0NpxState;
43   ULONG Spare1;
44 } KFLOATING_SAVE, *PKFLOATING_SAVE;
45 
46 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
47 
48 #define YieldProcessor _mm_pause
49 
50 FORCEINLINE
51 VOID
52 KeMemoryBarrier(VOID)
53 {
54   LONG Barrier, *Dummy = &Barrier;
55   (VOID)Dummy;
56 
57 #if defined(__GNUC__)
58   __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
59 #elif defined(_MSC_VER)
60   __asm xchg [Barrier], eax
61 #endif
62 }
63 
64 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
65 
66 _IRQL_requires_max_(HIGH_LEVEL)
67 _IRQL_saves_
68 NTHALAPI
69 KIRQL
70 NTAPI
71 KeGetCurrentIrql(VOID);
72 
73 _IRQL_requires_max_(HIGH_LEVEL)
74 NTHALAPI
75 VOID
76 FASTCALL
77 KfLowerIrql(
78   _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
79 #define KeLowerIrql(a) KfLowerIrql(a)
80 
81 _IRQL_requires_max_(HIGH_LEVEL)
82 _IRQL_raises_(NewIrql)
83 _IRQL_saves_
84 NTHALAPI
85 KIRQL
86 FASTCALL
87 KfRaiseIrql(
88   _In_ KIRQL NewIrql);
89 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
90 
91 _IRQL_requires_max_(DISPATCH_LEVEL)
92 _IRQL_saves_
93 _IRQL_raises_(DISPATCH_LEVEL)
94 NTHALAPI
95 KIRQL
96 NTAPI
97 KeRaiseIrqlToDpcLevel(VOID);
98 
99 NTHALAPI
100 KIRQL
101 NTAPI
102 KeRaiseIrqlToSynchLevel(VOID);
103 
104 _Requires_lock_not_held_(*SpinLock)
105 _Acquires_lock_(*SpinLock)
106 _IRQL_requires_max_(DISPATCH_LEVEL)
107 _IRQL_saves_
108 _IRQL_raises_(DISPATCH_LEVEL)
109 NTHALAPI
110 KIRQL
111 FASTCALL
112 KfAcquireSpinLock(
113   _Inout_ PKSPIN_LOCK SpinLock);
114 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
115 
116 _Requires_lock_held_(*SpinLock)
117 _Releases_lock_(*SpinLock)
118 _IRQL_requires_(DISPATCH_LEVEL)
119 NTHALAPI
120 VOID
121 FASTCALL
122 KfReleaseSpinLock(
123   _Inout_ PKSPIN_LOCK SpinLock,
124   _In_ _IRQL_restores_ KIRQL NewIrql);
125 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
126 
127 _Requires_lock_not_held_(*SpinLock)
128 _Acquires_lock_(*SpinLock)
129 _IRQL_requires_min_(DISPATCH_LEVEL)
130 NTKERNELAPI
131 VOID
132 FASTCALL
133 KefAcquireSpinLockAtDpcLevel(
134   _Inout_ PKSPIN_LOCK SpinLock);
135 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
136 
137 _Requires_lock_held_(*SpinLock)
138 _Releases_lock_(*SpinLock)
139 _IRQL_requires_min_(DISPATCH_LEVEL)
140 NTKERNELAPI
141 VOID
142 FASTCALL
143 KefReleaseSpinLockFromDpcLevel(
144   _Inout_ PKSPIN_LOCK SpinLock);
145 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
146 
147 NTSYSAPI
148 PKTHREAD
149 NTAPI
150 KeGetCurrentThread(VOID);
151 
152 _Always_(_Post_satisfies_(return<=0))
153 _Must_inspect_result_
154 _IRQL_requires_max_(DISPATCH_LEVEL)
155 _Kernel_float_saved_
156 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
157 NTKERNELAPI
158 NTSTATUS
159 NTAPI
160 KeSaveFloatingPointState(
161   _Out_ PKFLOATING_SAVE FloatSave);
162 
163 _Success_(1)
164 _Kernel_float_restored_
165 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
166 NTKERNELAPI
167 NTSTATUS
168 NTAPI
169 KeRestoreFloatingPointState(
170   _In_ PKFLOATING_SAVE FloatSave);
171 
172 #if (NTDDI_VERSION >= NTDDI_WIN7)
173 FORCEINLINE
174 ULONG
175 NTAPI
176 KeGetCurrentProcessorIndex(VOID)
177 {
178     return __readfsbyte(0x51);
179 }
180 #endif
181 
182 /* VOID
183  * KeFlushIoBuffers(
184  *   IN PMDL Mdl,
185  *   IN BOOLEAN ReadOperation,
186  *   IN BOOLEAN DmaOperation)
187  */
188 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
189 
190 /* x86 and x64 performs a 0x2C interrupt */
191 #define DbgRaiseAssertionFailure __int2c
192 
193 FORCEINLINE
194 VOID
195 _KeQueryTickCount(
196   OUT PLARGE_INTEGER CurrentCount)
197 {
198   for (;;) {
199 #ifdef NONAMELESSUNION
200     CurrentCount->s.HighPart = KeTickCount.High1Time;
201     CurrentCount->s.LowPart = KeTickCount.LowPart;
202     if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
203 #else
204     CurrentCount->HighPart = KeTickCount.High1Time;
205     CurrentCount->LowPart = KeTickCount.LowPart;
206     if (CurrentCount->HighPart == KeTickCount.High2Time) break;
207 #endif
208     YieldProcessor();
209   }
210 }
211 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
212 
213 $endif (_WDMDDK_)
214 $if (_NTDDK_)
215 
216 #define PAUSE_PROCESSOR YieldProcessor();
217 
218 #define KERNEL_STACK_SIZE                   12288
219 #define KERNEL_LARGE_STACK_SIZE             61440
220 #define KERNEL_LARGE_STACK_COMMIT           12288
221 
222 #define SIZE_OF_80387_REGISTERS   80
223 
224 #if !defined(RC_INVOKED)
225 
226 #define CONTEXT_i386               0x10000
227 #define CONTEXT_i486               0x10000
228 #define CONTEXT_CONTROL            (CONTEXT_i386|0x00000001L)
229 #define CONTEXT_INTEGER            (CONTEXT_i386|0x00000002L)
230 #define CONTEXT_SEGMENTS           (CONTEXT_i386|0x00000004L)
231 #define CONTEXT_FLOATING_POINT     (CONTEXT_i386|0x00000008L)
232 #define CONTEXT_DEBUG_REGISTERS    (CONTEXT_i386|0x00000010L)
233 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
234 
235 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
236 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS |  \
237                      CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS |      \
238                      CONTEXT_EXTENDED_REGISTERS)
239 
240 #define CONTEXT_XSTATE          (CONTEXT_i386 | 0x00000040L)
241 
242 #endif /* !defined(RC_INVOKED) */
243 
244 typedef struct _FLOATING_SAVE_AREA {
245   ULONG ControlWord;
246   ULONG StatusWord;
247   ULONG TagWord;
248   ULONG ErrorOffset;
249   ULONG ErrorSelector;
250   ULONG DataOffset;
251   ULONG DataSelector;
252   UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
253   ULONG Cr0NpxState;
254 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
255 
256 #include "pshpack4.h"
257 typedef struct _CONTEXT {
258   ULONG ContextFlags;
259   ULONG Dr0;
260   ULONG Dr1;
261   ULONG Dr2;
262   ULONG Dr3;
263   ULONG Dr6;
264   ULONG Dr7;
265   FLOATING_SAVE_AREA FloatSave;
266   ULONG SegGs;
267   ULONG SegFs;
268   ULONG SegEs;
269   ULONG SegDs;
270   ULONG Edi;
271   ULONG Esi;
272   ULONG Ebx;
273   ULONG Edx;
274   ULONG Ecx;
275   ULONG Eax;
276   ULONG Ebp;
277   ULONG Eip;
278   ULONG SegCs;
279   ULONG EFlags;
280   ULONG Esp;
281   ULONG SegSs;
282   UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
283 } CONTEXT;
284 #include "poppack.h"
285 
286 #define PCR_MINOR_VERSION 1
287 #define PCR_MAJOR_VERSION 1
288 
289 typedef struct _KPCR {
290   union {
291     NT_TIB NtTib;
292     struct {
293       struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
294       PVOID Used_StackBase;
295       PVOID Spare2;
296       PVOID TssCopy;
297       ULONG ContextSwitches;
298       KAFFINITY SetMemberCopy;
299       PVOID Used_Self;
300     };
301   };
302   struct _KPCR *SelfPcr;
303   struct _KPRCB *Prcb;
304   KIRQL Irql;
305   ULONG IRR;
306   ULONG IrrActive;
307   ULONG IDR;
308   PVOID KdVersionBlock;
309   struct _KIDTENTRY *IDT;
310   struct _KGDTENTRY *GDT;
311   struct _KTSS *TSS;
312   USHORT MajorVersion;
313   USHORT MinorVersion;
314   KAFFINITY SetMember;
315   ULONG StallScaleFactor;
316   UCHAR SpareUnused;
317   UCHAR Number;
318   UCHAR Spare0;
319   UCHAR SecondLevelCacheAssociativity;
320   ULONG VdmAlert;
321   ULONG KernelReserved[14];
322   ULONG SecondLevelCacheSize;
323   ULONG HalReserved[16];
324 } KPCR, *PKPCR;
325 
326 /* NOTE: This macro is not exposed in the DDK/WDK for _M_IX86.
327  * If it were, this would be its definition. */
328 #if 0
329 // #define KeGetPcr()      ((PKPCR)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
330 FORCEINLINE
331 PKPCR
332 KeGetPcr(VOID)
333 {
334     return (PKPCR)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr));
335 }
336 #endif
337 
338 #if (NTDDI_VERSION >= NTDDI_WIN7)
339 _CRT_DEPRECATE_TEXT("KeGetCurrentProcessorNumber is deprecated. Use KeGetCurrentProcessorNumberEx or KeGetCurrentProcessorIndex instead.")
340 #endif
341 FORCEINLINE
342 ULONG
343 KeGetCurrentProcessorNumber(VOID)
344 {
345     return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
346 }
347 
348 /* Macros for kernel-mode run-time checks of X86 system architecture */
349 #ifdef IsNEC_98
350 #undef IsNEC_98
351 #endif
352 #define IsNEC_98     (SharedUserData->AlternativeArchitecture == NEC98x86)
353 
354 #ifdef IsNotNEC_98
355 #undef IsNotNEC_98
356 #endif
357 #define IsNotNEC_98  (SharedUserData->AlternativeArchitecture != NEC98x86)
358 
359 #ifdef SetNEC_98
360 #undef SetNEC_98
361 #endif
362 #define SetNEC_98    (SharedUserData->AlternativeArchitecture = NEC98x86)
363 
364 #ifdef SetNotNEC_98
365 #undef SetNotNEC_98
366 #endif
367 #define SetNotNEC_98 (SharedUserData->AlternativeArchitecture = StandardDesign)
368 
369 $endif (_NTDDK_)
370