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
KeMemoryBarrier(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
_IRQL_requires_max_(HIGH_LEVEL)68 _IRQL_requires_max_(HIGH_LEVEL)
69 _IRQL_saves_
70 FORCEINLINE
71 KIRQL
72 KeGetCurrentIrql(VOID)
73 {
74 return (KIRQL)__readcr8();
75 }
76
_IRQL_requires_max_(HIGH_LEVEL)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)
_IRQL_raises_(NewIrql)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
_IRQL_requires_max_(DISPATCH_LEVEL)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
KeRaiseIrqlToSynchLevel(VOID)117 KeRaiseIrqlToSynchLevel(VOID)
118 {
119 #ifdef CONFIG_SMP
120 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
121 #else
122 return KfRaiseIrql(2); // SYNCH_LEVEL = DISPATCH_LEVEL
123 #endif
124 }
125
126 FORCEINLINE
127 PKTHREAD
KeGetCurrentThread(VOID)128 KeGetCurrentThread(VOID)
129 {
130 return (struct _KTHREAD *)__readgsqword(0x188);
131 }
132
133 _Always_(_Post_satisfies_(return<=0))
134 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)135 _IRQL_requires_max_(DISPATCH_LEVEL)
136 _Kernel_float_saved_
137 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
138 FORCEINLINE
139 NTSTATUS
140 KeSaveFloatingPointState(
141 _Out_ PKFLOATING_SAVE FloatSave)
142 {
143 UNREFERENCED_PARAMETER(FloatSave);
144 return STATUS_SUCCESS;
145 }
146
147 _Success_(1)
148 _Kernel_float_restored_
149 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
150 FORCEINLINE
151 NTSTATUS
KeRestoreFloatingPointState(_In_ PKFLOATING_SAVE FloatSave)152 KeRestoreFloatingPointState(
153 _In_ PKFLOATING_SAVE FloatSave)
154 {
155 UNREFERENCED_PARAMETER(FloatSave);
156 return STATUS_SUCCESS;
157 }
158
159 #if (NTDDI_VERSION >= NTDDI_WIN7)
160 FORCEINLINE
161 ULONG
KeGetCurrentProcessorIndex(VOID)162 KeGetCurrentProcessorIndex(VOID)
163 {
164 return __readgsdword(0x1a4);
165 }
166 #endif
167
168 /* VOID
169 * KeFlushIoBuffers(
170 * IN PMDL Mdl,
171 * IN BOOLEAN ReadOperation,
172 * IN BOOLEAN DmaOperation)
173 */
174 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
175
176 /* x86 and x64 performs a 0x2C interrupt */
177 #define DbgRaiseAssertionFailure __int2c
178
179 $endif /* _WDMDDK_ */
180 $if (_NTDDK_)
181
182 #define PAUSE_PROCESSOR YieldProcessor();
183
184 #define KERNEL_STACK_SIZE 0x6000
185 #define KERNEL_LARGE_STACK_SIZE 0x12000
186 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
187
188 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
189
190 #define EXCEPTION_READ_FAULT 0
191 #define EXCEPTION_WRITE_FAULT 1
192 #define EXCEPTION_EXECUTE_FAULT 8
193
194 #if !defined(RC_INVOKED)
195
196 #define CONTEXT_AMD64 0x100000
197
198 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
199 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
200 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
201 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
202 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
203
204 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
205 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
206
207 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x40L)
208
209 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
210 #define CONTEXT_SERVICE_ACTIVE 0x10000000
211 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
212 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
213
214 #endif /* !defined(RC_INVOKED) */
215
216 #define INITIAL_MXCSR 0x1f80
217 #define INITIAL_FPCSR 0x027f
218
219 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
220 ULONG64 P1Home;
221 ULONG64 P2Home;
222 ULONG64 P3Home;
223 ULONG64 P4Home;
224 ULONG64 P5Home;
225 ULONG64 P6Home;
226 ULONG ContextFlags;
227 ULONG MxCsr;
228 USHORT SegCs;
229 USHORT SegDs;
230 USHORT SegEs;
231 USHORT SegFs;
232 USHORT SegGs;
233 USHORT SegSs;
234 ULONG EFlags;
235 ULONG64 Dr0;
236 ULONG64 Dr1;
237 ULONG64 Dr2;
238 ULONG64 Dr3;
239 ULONG64 Dr6;
240 ULONG64 Dr7;
241 ULONG64 Rax;
242 ULONG64 Rcx;
243 ULONG64 Rdx;
244 ULONG64 Rbx;
245 ULONG64 Rsp;
246 ULONG64 Rbp;
247 ULONG64 Rsi;
248 ULONG64 Rdi;
249 ULONG64 R8;
250 ULONG64 R9;
251 ULONG64 R10;
252 ULONG64 R11;
253 ULONG64 R12;
254 ULONG64 R13;
255 ULONG64 R14;
256 ULONG64 R15;
257 ULONG64 Rip;
258 union {
259 XMM_SAVE_AREA32 FltSave;
260 struct {
261 M128A Header[2];
262 M128A Legacy[8];
263 M128A Xmm0;
264 M128A Xmm1;
265 M128A Xmm2;
266 M128A Xmm3;
267 M128A Xmm4;
268 M128A Xmm5;
269 M128A Xmm6;
270 M128A Xmm7;
271 M128A Xmm8;
272 M128A Xmm9;
273 M128A Xmm10;
274 M128A Xmm11;
275 M128A Xmm12;
276 M128A Xmm13;
277 M128A Xmm14;
278 M128A Xmm15;
279 } DUMMYSTRUCTNAME DECLSPEC_ALIGN(16);
280 } DUMMYUNIONNAME DECLSPEC_ALIGN(16);
281 M128A VectorRegister[26];
282 ULONG64 VectorControl;
283 ULONG64 DebugControl;
284 ULONG64 LastBranchToRip;
285 ULONG64 LastBranchFromRip;
286 ULONG64 LastExceptionToRip;
287 ULONG64 LastExceptionFromRip;
288 } CONTEXT;
289
290 #define PCR_MINOR_VERSION 1
291 #define PCR_MAJOR_VERSION 1
292
293 typedef struct _KPCR
294 {
295 _ANONYMOUS_UNION union
296 {
297 NT_TIB NtTib;
298 _ANONYMOUS_STRUCT struct
299 {
300 union _KGDTENTRY64 *GdtBase;
301 struct _KTSS64 *TssBase;
302 ULONG64 UserRsp;
303 struct _KPCR *Self;
304 struct _KPRCB *CurrentPrcb;
305 PKSPIN_LOCK_QUEUE LockArray;
306 PVOID Used_Self;
307 };
308 };
309 union _KIDTENTRY64 *IdtBase;
310 ULONG64 Unused[2];
311 KIRQL Irql;
312 UCHAR SecondLevelCacheAssociativity;
313 UCHAR ObsoleteNumber;
314 UCHAR Fill0;
315 ULONG Unused0[3];
316 USHORT MajorVersion;
317 USHORT MinorVersion;
318 ULONG StallScaleFactor;
319 PVOID Unused1[3];
320 ULONG KernelReserved[15];
321 ULONG SecondLevelCacheSize;
322 ULONG HalReserved[16];
323 ULONG Unused2;
324 PVOID KdVersionBlock;
325 PVOID Unused3;
326 ULONG PcrAlign1[24];
327 } KPCR, *PKPCR;
328
329 FORCEINLINE
330 PKPCR
KeGetPcr(VOID)331 KeGetPcr(VOID)
332 {
333 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
334 }
335
336 #if (NTDDI_VERSION >= NTDDI_WIN7)
337 _CRT_DEPRECATE_TEXT("KeGetCurrentProcessorNumber is deprecated. Use KeGetCurrentProcessorNumberEx or KeGetCurrentProcessorIndex instead.")
338 #endif
339 FORCEINLINE
340 ULONG
KeGetCurrentProcessorNumber(VOID)341 KeGetCurrentProcessorNumber(VOID)
342 {
343 return __readgsbyte(0x184);
344 }
345
346 $endif /* _NTDDK_ */
347