xref: /reactos/sdk/include/xdk/amd64/ke.h (revision 9cfd8dd9)
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 #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
128 KeGetCurrentThread(VOID)
129 {
130     return (struct _KTHREAD *)__readgsqword(0x188);
131 }
132 
133 _Always_(_Post_satisfies_(return<=0))
134 _Must_inspect_result_
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
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
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
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
341 KeGetCurrentProcessorNumber(VOID)
342 {
343     return __readgsbyte(0x184);
344 }
345 
346 $endif /* _NTDDK_ */
347