Reintegrate header branch
[reactos.git] / reactos / 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 volatile LONG Barrier;
55 #if defined(__GNUC__)
56 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
57 #elif defined(_MSC_VER)
58 __asm xchg [Barrier], eax
59 #endif
60 }
61
62 NTHALAPI
63 KIRQL
64 NTAPI
65 KeGetCurrentIrql(VOID);
66
67 NTHALAPI
68 VOID
69 FASTCALL
70 KfLowerIrql(
71 IN KIRQL NewIrql);
72 #define KeLowerIrql(a) KfLowerIrql(a)
73
74 NTHALAPI
75 KIRQL
76 FASTCALL
77 KfRaiseIrql(
78 IN KIRQL NewIrql);
79 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
80
81 NTHALAPI
82 KIRQL
83 NTAPI
84 KeRaiseIrqlToDpcLevel(VOID);
85
86 NTHALAPI
87 KIRQL
88 NTAPI
89 KeRaiseIrqlToSynchLevel(VOID);
90
91 NTHALAPI
92 KIRQL
93 FASTCALL
94 KfAcquireSpinLock(
95 IN OUT PKSPIN_LOCK SpinLock);
96 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
97
98 NTHALAPI
99 VOID
100 FASTCALL
101 KfReleaseSpinLock(
102 IN OUT PKSPIN_LOCK SpinLock,
103 IN KIRQL NewIrql);
104 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
105
106 NTKERNELAPI
107 VOID
108 FASTCALL
109 KefAcquireSpinLockAtDpcLevel(
110 IN OUT PKSPIN_LOCK SpinLock);
111 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
112
113 NTKERNELAPI
114 VOID
115 FASTCALL
116 KefReleaseSpinLockFromDpcLevel(
117 IN OUT PKSPIN_LOCK SpinLock);
118 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
119
120 NTSYSAPI
121 PKTHREAD
122 NTAPI
123 KeGetCurrentThread(VOID);
124
125 NTKERNELAPI
126 NTSTATUS
127 NTAPI
128 KeSaveFloatingPointState(
129 OUT PKFLOATING_SAVE FloatSave);
130
131 NTKERNELAPI
132 NTSTATUS
133 NTAPI
134 KeRestoreFloatingPointState(
135 IN PKFLOATING_SAVE FloatSave);
136
137 /* VOID
138 * KeFlushIoBuffers(
139 * IN PMDL Mdl,
140 * IN BOOLEAN ReadOperation,
141 * IN BOOLEAN DmaOperation)
142 */
143 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
144
145 /* x86 and x64 performs a 0x2C interrupt */
146 #define DbgRaiseAssertionFailure __int2c
147
148 FORCEINLINE
149 VOID
150 _KeQueryTickCount(
151 OUT PLARGE_INTEGER CurrentCount)
152 {
153 for (;;) {
154 CurrentCount->HighPart = KeTickCount.High1Time;
155 CurrentCount->LowPart = KeTickCount.LowPart;
156 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
157 YieldProcessor();
158 }
159 }
160 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
161
162 $endif /* _WDMDDK_ */
163 $if (_NTDDK_)
164
165 #define PAUSE_PROCESSOR YieldProcessor();
166
167 #define KERNEL_STACK_SIZE 12288
168 #define KERNEL_LARGE_STACK_SIZE 61440
169 #define KERNEL_LARGE_STACK_COMMIT 12288
170
171 #define SIZE_OF_80387_REGISTERS 80
172
173 #if !defined(RC_INVOKED)
174
175 #define CONTEXT_i386 0x10000
176 #define CONTEXT_i486 0x10000
177 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
178 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
179 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
180 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
181 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
182 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
183
184 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
185 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
186 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
187 CONTEXT_EXTENDED_REGISTERS)
188
189 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
190
191 #endif /* !defined(RC_INVOKED) */
192
193 typedef struct _FLOATING_SAVE_AREA {
194 ULONG ControlWord;
195 ULONG StatusWord;
196 ULONG TagWord;
197 ULONG ErrorOffset;
198 ULONG ErrorSelector;
199 ULONG DataOffset;
200 ULONG DataSelector;
201 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
202 ULONG Cr0NpxState;
203 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
204
205 #include "pshpack4.h"
206 typedef struct _CONTEXT {
207 ULONG ContextFlags;
208 ULONG Dr0;
209 ULONG Dr1;
210 ULONG Dr2;
211 ULONG Dr3;
212 ULONG Dr6;
213 ULONG Dr7;
214 FLOATING_SAVE_AREA FloatSave;
215 ULONG SegGs;
216 ULONG SegFs;
217 ULONG SegEs;
218 ULONG SegDs;
219 ULONG Edi;
220 ULONG Esi;
221 ULONG Ebx;
222 ULONG Edx;
223 ULONG Ecx;
224 ULONG Eax;
225 ULONG Ebp;
226 ULONG Eip;
227 ULONG SegCs;
228 ULONG EFlags;
229 ULONG Esp;
230 ULONG SegSs;
231 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
232 } CONTEXT;
233 #include "poppack.h"
234
235 #define KeGetPcr() PCR
236
237 #define PCR_MINOR_VERSION 1
238 #define PCR_MAJOR_VERSION 1
239
240 typedef struct _KPCR {
241 union {
242 NT_TIB NtTib;
243 struct {
244 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
245 PVOID Used_StackBase;
246 PVOID Spare2;
247 PVOID TssCopy;
248 ULONG ContextSwitches;
249 KAFFINITY SetMemberCopy;
250 PVOID Used_Self;
251 };
252 };
253 struct _KPCR *SelfPcr;
254 struct _KPRCB *Prcb;
255 KIRQL Irql;
256 ULONG IRR;
257 ULONG IrrActive;
258 ULONG IDR;
259 PVOID KdVersionBlock;
260 struct _KIDTENTRY *IDT;
261 struct _KGDTENTRY *GDT;
262 struct _KTSS *TSS;
263 USHORT MajorVersion;
264 USHORT MinorVersion;
265 KAFFINITY SetMember;
266 ULONG StallScaleFactor;
267 UCHAR SpareUnused;
268 UCHAR Number;
269 UCHAR Spare0;
270 UCHAR SecondLevelCacheAssociativity;
271 ULONG VdmAlert;
272 ULONG KernelReserved[14];
273 ULONG SecondLevelCacheSize;
274 ULONG HalReserved[16];
275 } KPCR, *PKPCR;
276
277 FORCEINLINE
278 ULONG
279 KeGetCurrentProcessorNumber(VOID)
280 {
281 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
282 }
283
284 $endif /* _NTDDK_ */
285
286
287
288