[XDK][DDK] Take the gcc path for __assert_annotation{A,W} and __CREATE_NTOS_DATA_IMPO...
[reactos.git] / sdk / include / xdk / x86 / ke.h
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 UNREFERENCED_LOCAL_VARIABLE(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 /* VOID
173 * KeFlushIoBuffers(
174 * IN PMDL Mdl,
175 * IN BOOLEAN ReadOperation,
176 * IN BOOLEAN DmaOperation)
177 */
178 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
179
180 /* x86 and x64 performs a 0x2C interrupt */
181 #define DbgRaiseAssertionFailure __int2c
182
183 FORCEINLINE
184 VOID
185 _KeQueryTickCount(
186 OUT PLARGE_INTEGER CurrentCount)
187 {
188 for (;;) {
189 #ifdef NONAMELESSUNION
190 CurrentCount->s.HighPart = KeTickCount.High1Time;
191 CurrentCount->s.LowPart = KeTickCount.LowPart;
192 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
193 #else
194 CurrentCount->HighPart = KeTickCount.High1Time;
195 CurrentCount->LowPart = KeTickCount.LowPart;
196 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
197 #endif
198 YieldProcessor();
199 }
200 }
201 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
202
203 $endif (_WDMDDK_)
204 $if (_NTDDK_)
205
206 #define PAUSE_PROCESSOR YieldProcessor();
207
208 #define KERNEL_STACK_SIZE 12288
209 #define KERNEL_LARGE_STACK_SIZE 61440
210 #define KERNEL_LARGE_STACK_COMMIT 12288
211
212 #define SIZE_OF_80387_REGISTERS 80
213
214 #if !defined(RC_INVOKED)
215
216 #define CONTEXT_i386 0x10000
217 #define CONTEXT_i486 0x10000
218 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
219 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
220 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
221 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
222 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
223 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
224
225 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
226 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
227 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
228 CONTEXT_EXTENDED_REGISTERS)
229
230 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
231
232 #endif /* !defined(RC_INVOKED) */
233
234 typedef struct _FLOATING_SAVE_AREA {
235 ULONG ControlWord;
236 ULONG StatusWord;
237 ULONG TagWord;
238 ULONG ErrorOffset;
239 ULONG ErrorSelector;
240 ULONG DataOffset;
241 ULONG DataSelector;
242 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
243 ULONG Cr0NpxState;
244 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
245
246 #include "pshpack4.h"
247 typedef struct _CONTEXT {
248 ULONG ContextFlags;
249 ULONG Dr0;
250 ULONG Dr1;
251 ULONG Dr2;
252 ULONG Dr3;
253 ULONG Dr6;
254 ULONG Dr7;
255 FLOATING_SAVE_AREA FloatSave;
256 ULONG SegGs;
257 ULONG SegFs;
258 ULONG SegEs;
259 ULONG SegDs;
260 ULONG Edi;
261 ULONG Esi;
262 ULONG Ebx;
263 ULONG Edx;
264 ULONG Ecx;
265 ULONG Eax;
266 ULONG Ebp;
267 ULONG Eip;
268 ULONG SegCs;
269 ULONG EFlags;
270 ULONG Esp;
271 ULONG SegSs;
272 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
273 } CONTEXT;
274 #include "poppack.h"
275
276 #define KeGetPcr() PCR
277
278 #define PCR_MINOR_VERSION 1
279 #define PCR_MAJOR_VERSION 1
280
281 typedef struct _KPCR {
282 union {
283 NT_TIB NtTib;
284 struct {
285 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
286 PVOID Used_StackBase;
287 PVOID Spare2;
288 PVOID TssCopy;
289 ULONG ContextSwitches;
290 KAFFINITY SetMemberCopy;
291 PVOID Used_Self;
292 };
293 };
294 struct _KPCR *SelfPcr;
295 struct _KPRCB *Prcb;
296 KIRQL Irql;
297 ULONG IRR;
298 ULONG IrrActive;
299 ULONG IDR;
300 PVOID KdVersionBlock;
301 struct _KIDTENTRY *IDT;
302 struct _KGDTENTRY *GDT;
303 struct _KTSS *TSS;
304 USHORT MajorVersion;
305 USHORT MinorVersion;
306 KAFFINITY SetMember;
307 ULONG StallScaleFactor;
308 UCHAR SpareUnused;
309 UCHAR Number;
310 UCHAR Spare0;
311 UCHAR SecondLevelCacheAssociativity;
312 ULONG VdmAlert;
313 ULONG KernelReserved[14];
314 ULONG SecondLevelCacheSize;
315 ULONG HalReserved[16];
316 } KPCR, *PKPCR;
317
318 FORCEINLINE
319 ULONG
320 KeGetCurrentProcessorNumber(VOID)
321 {
322 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
323 }
324
325 $endif (_NTDDK_)
326
327
328
329