[XDK]
[reactos.git] / 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 ((PKUSER_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 ULONG Dummy;
32 } KFLOATING_SAVE, *PKFLOATING_SAVE;
33
34 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
35
36 #define KeQueryInterruptTime() \
37 (*(volatile ULONG64*)SharedInterruptTime)
38
39 #define KeQuerySystemTime(CurrentCount) \
40 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
41
42 #define KeQueryTickCount(CurrentCount) \
43 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
44
45 #define KeGetDcacheFillSize() 1L
46
47 #define YieldProcessor _mm_pause
48
49 FORCEINLINE
50 KIRQL
51 KeGetCurrentIrql(VOID)
52 {
53 return (KIRQL)__readcr8();
54 }
55
56 FORCEINLINE
57 VOID
58 KeLowerIrql(IN KIRQL NewIrql)
59 {
60 //ASSERT(KeGetCurrentIrql() >= NewIrql);
61 __writecr8(NewIrql);
62 }
63
64 FORCEINLINE
65 KIRQL
66 KfRaiseIrql(IN KIRQL NewIrql)
67 {
68 KIRQL OldIrql;
69
70 OldIrql = __readcr8();
71 //ASSERT(OldIrql <= NewIrql);
72 __writecr8(NewIrql);
73 return OldIrql;
74 }
75 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
76
77 FORCEINLINE
78 KIRQL
79 KeRaiseIrqlToDpcLevel(VOID)
80 {
81 return KfRaiseIrql(DISPATCH_LEVEL);
82 }
83
84 FORCEINLINE
85 KIRQL
86 KeRaiseIrqlToSynchLevel(VOID)
87 {
88 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
89 }
90
91 FORCEINLINE
92 PKTHREAD
93 KeGetCurrentThread(VOID)
94 {
95 return (struct _KTHREAD *)__readgsqword(0x188);
96 }
97
98 /* VOID
99 * KeFlushIoBuffers(
100 * IN PMDL Mdl,
101 * IN BOOLEAN ReadOperation,
102 * IN BOOLEAN DmaOperation)
103 */
104 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
105
106 /* x86 and x64 performs a 0x2C interrupt */
107 #define DbgRaiseAssertionFailure __int2c
108
109 $endif /* _WDMDDK_ */
110 $if (_NTDDK_)
111
112 #define PAUSE_PROCESSOR YieldProcessor();
113
114 #define KERNEL_STACK_SIZE 0x6000
115 #define KERNEL_LARGE_STACK_SIZE 0x12000
116 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
117
118 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
119
120 #define EXCEPTION_READ_FAULT 0
121 #define EXCEPTION_WRITE_FAULT 1
122 #define EXCEPTION_EXECUTE_FAULT 8
123
124 #if !defined(RC_INVOKED)
125
126 #define CONTEXT_AMD64 0x100000
127
128 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
129 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
130 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
131 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
132 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
133
134 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
135 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
136
137 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
138
139 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
140 #define CONTEXT_SERVICE_ACTIVE 0x10000000
141 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
142 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
143
144 #endif /* !defined(RC_INVOKED) */
145
146 #define INITIAL_MXCSR 0x1f80
147 #define INITIAL_FPCSR 0x027f
148
149 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
150 ULONG64 P1Home;
151 ULONG64 P2Home;
152 ULONG64 P3Home;
153 ULONG64 P4Home;
154 ULONG64 P5Home;
155 ULONG64 P6Home;
156 ULONG ContextFlags;
157 ULONG MxCsr;
158 USHORT SegCs;
159 USHORT SegDs;
160 USHORT SegEs;
161 USHORT SegFs;
162 USHORT SegGs;
163 USHORT SegSs;
164 ULONG EFlags;
165 ULONG64 Dr0;
166 ULONG64 Dr1;
167 ULONG64 Dr2;
168 ULONG64 Dr3;
169 ULONG64 Dr6;
170 ULONG64 Dr7;
171 ULONG64 Rax;
172 ULONG64 Rcx;
173 ULONG64 Rdx;
174 ULONG64 Rbx;
175 ULONG64 Rsp;
176 ULONG64 Rbp;
177 ULONG64 Rsi;
178 ULONG64 Rdi;
179 ULONG64 R8;
180 ULONG64 R9;
181 ULONG64 R10;
182 ULONG64 R11;
183 ULONG64 R12;
184 ULONG64 R13;
185 ULONG64 R14;
186 ULONG64 R15;
187 ULONG64 Rip;
188 union {
189 XMM_SAVE_AREA32 FltSave;
190 struct {
191 M128A Header[2];
192 M128A Legacy[8];
193 M128A Xmm0;
194 M128A Xmm1;
195 M128A Xmm2;
196 M128A Xmm3;
197 M128A Xmm4;
198 M128A Xmm5;
199 M128A Xmm6;
200 M128A Xmm7;
201 M128A Xmm8;
202 M128A Xmm9;
203 M128A Xmm10;
204 M128A Xmm11;
205 M128A Xmm12;
206 M128A Xmm13;
207 M128A Xmm14;
208 M128A Xmm15;
209 } DUMMYSTRUCTNAME;
210 } DUMMYUNIONNAME;
211 M128A VectorRegister[26];
212 ULONG64 VectorControl;
213 ULONG64 DebugControl;
214 ULONG64 LastBranchToRip;
215 ULONG64 LastBranchFromRip;
216 ULONG64 LastExceptionToRip;
217 ULONG64 LastExceptionFromRip;
218 } CONTEXT;
219
220 #define PCR_MINOR_VERSION 1
221 #define PCR_MAJOR_VERSION 1
222
223 typedef struct _KPCR
224 {
225 _ANONYMOUS_UNION union
226 {
227 NT_TIB NtTib;
228 _ANONYMOUS_STRUCT struct
229 {
230 union _KGDTENTRY64 *GdtBase;
231 struct _KTSS64 *TssBase;
232 ULONG64 UserRsp;
233 struct _KPCR *Self;
234 struct _KPRCB *CurrentPrcb;
235 PKSPIN_LOCK_QUEUE LockArray;
236 PVOID Used_Self;
237 };
238 };
239 union _KIDTENTRY64 *IdtBase;
240 ULONG64 Unused[2];
241 KIRQL Irql;
242 UCHAR SecondLevelCacheAssociativity;
243 UCHAR ObsoleteNumber;
244 UCHAR Fill0;
245 ULONG Unused0[3];
246 USHORT MajorVersion;
247 USHORT MinorVersion;
248 ULONG StallScaleFactor;
249 PVOID Unused1[3];
250 ULONG KernelReserved[15];
251 ULONG SecondLevelCacheSize;
252 ULONG HalReserved[16];
253 ULONG Unused2;
254 PVOID KdVersionBlock;
255 PVOID Unused3;
256 ULONG PcrAlign1[24];
257 } KPCR, *PKPCR;
258
259 FORCEINLINE
260 PKPCR
261 KeGetPcr(VOID)
262 {
263 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
264 }
265
266 FORCEINLINE
267 ULONG
268 KeGetCurrentProcessorNumber(VOID)
269 {
270 return (ULONG)__readgsword(0x184);
271 }
272
273 $endif /* _NTDDK_ */