xref: /reactos/sdk/include/xdk/amd64/ke.h (revision fb5d5ecd)
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_ */
331