[SDK][NDK] Move SYSTEM_POWER_INFORMATION to ntpoapi.h (#869)
[reactos.git] / sdk / include / xdk / amd64 / ke.h
1 $if (_WDMDDK_)
2 /** Kernel definitions for AMD64 **/
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 CLOCK_LEVEL 13
11 #define IPI_LEVEL 14
12 #define DRS_LEVEL 14
13 #define POWER_LEVEL 14
14 #define PROFILE_LEVEL 15
15 #define HIGH_LEVEL 15
16
17 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
18 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
19 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
20 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
21 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
22
23 #define PAGE_SIZE 0x1000
24 #define PAGE_SHIFT 12L
25
26 #define EFLAG_SIGN 0x8000
27 #define EFLAG_ZERO 0x4000
28 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
29
30 typedef struct _KFLOATING_SAVE
31 {
32 ULONG Dummy;
33 } KFLOATING_SAVE, *PKFLOATING_SAVE;
34
35 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
36
37 #define KeQueryInterruptTime() \
38 (*(volatile ULONG64*)SharedInterruptTime)
39
40 #define KeQuerySystemTime(CurrentCount) \
41 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
42
43 #define KeQueryTickCount(CurrentCount) \
44 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
45
46 #define KeGetDcacheFillSize() 1L
47
48 #define YieldProcessor _mm_pause
49 #define MemoryBarrier __faststorefence
50 #define FastFence __faststorefence
51 #define LoadFence _mm_lfence
52 #define MemoryFence _mm_mfence
53 #define StoreFence _mm_sfence
54 #define LFENCE_ACQUIRE() LoadFence()
55
56 FORCEINLINE
57 VOID
58 KeMemoryBarrier(
59 VOID)
60 {
61 // FIXME: Do we really need lfence after the __faststorefence ?
62 FastFence();
63 LFENCE_ACQUIRE();
64 }
65
66 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
67
68 _IRQL_requires_max_(HIGH_LEVEL)
69 _IRQL_saves_
70 FORCEINLINE
71 KIRQL
72 KeGetCurrentIrql(VOID)
73 {
74 return (KIRQL)__readcr8();
75 }
76
77 _IRQL_requires_max_(HIGH_LEVEL)
78 FORCEINLINE
79 VOID
80 KeLowerIrql(
81 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql)
82 {
83 //ASSERT((KIRQL)__readcr8() >= NewIrql);
84 __writecr8(NewIrql);
85 }
86
87 _IRQL_requires_max_(HIGH_LEVEL)
88 _IRQL_raises_(NewIrql)
89 _IRQL_saves_
90 FORCEINLINE
91 KIRQL
92 KfRaiseIrql(
93 _In_ KIRQL NewIrql)
94 {
95 KIRQL OldIrql;
96
97 OldIrql = (KIRQL)__readcr8();
98 //ASSERT(OldIrql <= NewIrql);
99 __writecr8(NewIrql);
100 return OldIrql;
101 }
102 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
103
104 _IRQL_requires_max_(DISPATCH_LEVEL)
105 _IRQL_saves_
106 _IRQL_raises_(DISPATCH_LEVEL)
107 FORCEINLINE
108 KIRQL
109 KeRaiseIrqlToDpcLevel(
110 VOID)
111 {
112 return KfRaiseIrql(DISPATCH_LEVEL);
113 }
114
115 FORCEINLINE
116 KIRQL
117 KeRaiseIrqlToSynchLevel(VOID)
118 {
119 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
120 }
121
122 FORCEINLINE
123 PKTHREAD
124 KeGetCurrentThread(VOID)
125 {
126 return (struct _KTHREAD *)__readgsqword(0x188);
127 }
128
129 _Always_(_Post_satisfies_(return<=0))
130 _Must_inspect_result_
131 _IRQL_requires_max_(DISPATCH_LEVEL)
132 _Kernel_float_saved_
133 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
134 FORCEINLINE
135 NTSTATUS
136 KeSaveFloatingPointState(
137 _Out_ PKFLOATING_SAVE FloatSave)
138 {
139 UNREFERENCED_PARAMETER(FloatSave);
140 return STATUS_SUCCESS;
141 }
142
143 _Success_(1)
144 _Kernel_float_restored_
145 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
146 FORCEINLINE
147 NTSTATUS
148 KeRestoreFloatingPointState(
149 _In_ PKFLOATING_SAVE FloatSave)
150 {
151 UNREFERENCED_PARAMETER(FloatSave);
152 return STATUS_SUCCESS;
153 }
154
155 /* VOID
156 * KeFlushIoBuffers(
157 * IN PMDL Mdl,
158 * IN BOOLEAN ReadOperation,
159 * IN BOOLEAN DmaOperation)
160 */
161 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
162
163 /* x86 and x64 performs a 0x2C interrupt */
164 #define DbgRaiseAssertionFailure __int2c
165
166 $endif /* _WDMDDK_ */
167 $if (_NTDDK_)
168
169 #define PAUSE_PROCESSOR YieldProcessor();
170
171 #define KERNEL_STACK_SIZE 0x6000
172 #define KERNEL_LARGE_STACK_SIZE 0x12000
173 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
174
175 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
176
177 #define EXCEPTION_READ_FAULT 0
178 #define EXCEPTION_WRITE_FAULT 1
179 #define EXCEPTION_EXECUTE_FAULT 8
180
181 #if !defined(RC_INVOKED)
182
183 #define CONTEXT_AMD64 0x100000
184
185 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
186 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
187 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
188 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
189 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
190
191 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
192 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
193
194 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x40L)
195
196 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
197 #define CONTEXT_SERVICE_ACTIVE 0x10000000
198 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
199 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
200
201 #endif /* !defined(RC_INVOKED) */
202
203 #define INITIAL_MXCSR 0x1f80
204 #define INITIAL_FPCSR 0x027f
205
206 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
207 ULONG64 P1Home;
208 ULONG64 P2Home;
209 ULONG64 P3Home;
210 ULONG64 P4Home;
211 ULONG64 P5Home;
212 ULONG64 P6Home;
213 ULONG ContextFlags;
214 ULONG MxCsr;
215 USHORT SegCs;
216 USHORT SegDs;
217 USHORT SegEs;
218 USHORT SegFs;
219 USHORT SegGs;
220 USHORT SegSs;
221 ULONG EFlags;
222 ULONG64 Dr0;
223 ULONG64 Dr1;
224 ULONG64 Dr2;
225 ULONG64 Dr3;
226 ULONG64 Dr6;
227 ULONG64 Dr7;
228 ULONG64 Rax;
229 ULONG64 Rcx;
230 ULONG64 Rdx;
231 ULONG64 Rbx;
232 ULONG64 Rsp;
233 ULONG64 Rbp;
234 ULONG64 Rsi;
235 ULONG64 Rdi;
236 ULONG64 R8;
237 ULONG64 R9;
238 ULONG64 R10;
239 ULONG64 R11;
240 ULONG64 R12;
241 ULONG64 R13;
242 ULONG64 R14;
243 ULONG64 R15;
244 ULONG64 Rip;
245 union {
246 XMM_SAVE_AREA32 FltSave;
247 struct {
248 M128A Header[2];
249 M128A Legacy[8];
250 M128A Xmm0;
251 M128A Xmm1;
252 M128A Xmm2;
253 M128A Xmm3;
254 M128A Xmm4;
255 M128A Xmm5;
256 M128A Xmm6;
257 M128A Xmm7;
258 M128A Xmm8;
259 M128A Xmm9;
260 M128A Xmm10;
261 M128A Xmm11;
262 M128A Xmm12;
263 M128A Xmm13;
264 M128A Xmm14;
265 M128A Xmm15;
266 } DUMMYSTRUCTNAME;
267 } DUMMYUNIONNAME;
268 M128A VectorRegister[26];
269 ULONG64 VectorControl;
270 ULONG64 DebugControl;
271 ULONG64 LastBranchToRip;
272 ULONG64 LastBranchFromRip;
273 ULONG64 LastExceptionToRip;
274 ULONG64 LastExceptionFromRip;
275 } CONTEXT;
276
277 #define PCR_MINOR_VERSION 1
278 #define PCR_MAJOR_VERSION 1
279
280 typedef struct _KPCR
281 {
282 _ANONYMOUS_UNION union
283 {
284 NT_TIB NtTib;
285 _ANONYMOUS_STRUCT struct
286 {
287 union _KGDTENTRY64 *GdtBase;
288 struct _KTSS64 *TssBase;
289 ULONG64 UserRsp;
290 struct _KPCR *Self;
291 struct _KPRCB *CurrentPrcb;
292 PKSPIN_LOCK_QUEUE LockArray;
293 PVOID Used_Self;
294 };
295 };
296 union _KIDTENTRY64 *IdtBase;
297 ULONG64 Unused[2];
298 KIRQL Irql;
299 UCHAR SecondLevelCacheAssociativity;
300 UCHAR ObsoleteNumber;
301 UCHAR Fill0;
302 ULONG Unused0[3];
303 USHORT MajorVersion;
304 USHORT MinorVersion;
305 ULONG StallScaleFactor;
306 PVOID Unused1[3];
307 ULONG KernelReserved[15];
308 ULONG SecondLevelCacheSize;
309 ULONG HalReserved[16];
310 ULONG Unused2;
311 PVOID KdVersionBlock;
312 PVOID Unused3;
313 ULONG PcrAlign1[24];
314 } KPCR, *PKPCR;
315
316 FORCEINLINE
317 PKPCR
318 KeGetPcr(VOID)
319 {
320 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
321 }
322
323 FORCEINLINE
324 ULONG
325 KeGetCurrentProcessorNumber(VOID)
326 {
327 return (ULONG)__readgsword(0x184);
328 }
329
330 $endif /* _NTDDK_ */