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