1 $if (_WDMDDK_)
2 /** Kernel definitions for ARM **/
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 CLOCK_LEVEL 13
10 #define IPI_LEVEL 14
11 #define DRS_LEVEL 14
12 #define POWER_LEVEL 14
13 #define PROFILE_LEVEL 15
14 #define HIGH_LEVEL 15
15
16 #define KIP0PCRADDRESS 0xFFDFF000
17 #define KI_USER_SHARED_DATA 0xFFFF9000
18 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
19
20 #define PAGE_SIZE 0x1000
21 #define PAGE_SHIFT 12L
22
23 typedef struct _KFLOATING_SAVE
24 {
25 ULONG Reserved;
26 } KFLOATING_SAVE, *PKFLOATING_SAVE;
27
28 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
29
30 FORCEINLINE
31 VOID
YieldProcessor(VOID)32 YieldProcessor(
33 VOID)
34 {
35 __dmb(_ARM_BARRIER_ISHST);
36 __yield();
37 }
38
39 #define MemoryBarrier() __dmb(_ARM_BARRIER_SY)
40 #define PreFetchCacheLine(l,a) __prefetch((const void *) (a))
41 #define PrefetchForWrite(p) __prefetch((const void *) (p))
42 #define ReadForWriteAccess(p) (*(p))
43
44 FORCEINLINE
45 VOID
KeMemoryBarrier(VOID)46 KeMemoryBarrier(
47 VOID)
48 {
49 _ReadWriteBarrier();
50 MemoryBarrier();
51 }
52
53 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
54
55 _IRQL_requires_max_(HIGH_LEVEL)
56 _IRQL_saves_
57 NTHALAPI
58 KIRQL
59 NTAPI
60 KeGetCurrentIrql(
61 VOID);
62
63 _IRQL_requires_max_(HIGH_LEVEL)
64 NTHALAPI
65 VOID
66 FASTCALL
67 KfLowerIrql(
68 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
69 #define KeLowerIrql(a) KfLowerIrql(a)
70
71 _IRQL_requires_max_(HIGH_LEVEL)
72 _IRQL_raises_(NewIrql)
73 _IRQL_saves_
74 NTHALAPI
75 KIRQL
76 FASTCALL
77 KfRaiseIrql(
78 _In_ KIRQL NewIrql);
79 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
80
81 _IRQL_requires_max_(DISPATCH_LEVEL)
82 _IRQL_saves_
83 _IRQL_raises_(DISPATCH_LEVEL)
84 NTHALAPI
85 KIRQL
86 NTAPI
87 KeRaiseIrqlToDpcLevel(VOID);
88
89 NTHALAPI
90 KIRQL
91 NTAPI
92 KeRaiseIrqlToSynchLevel(VOID);
93
94 _Requires_lock_not_held_(*SpinLock)
95 _Acquires_lock_(*SpinLock)
96 _IRQL_requires_max_(DISPATCH_LEVEL)
97 _IRQL_saves_
98 _IRQL_raises_(DISPATCH_LEVEL)
99 NTHALAPI
100 KIRQL
101 FASTCALL
102 KfAcquireSpinLock(
103 _Inout_ PKSPIN_LOCK SpinLock);
104 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
105
106 _Requires_lock_held_(*SpinLock)
107 _Releases_lock_(*SpinLock)
108 _IRQL_requires_(DISPATCH_LEVEL)
109 NTHALAPI
110 VOID
111 FASTCALL
112 KfReleaseSpinLock(
113 _Inout_ PKSPIN_LOCK SpinLock,
114 _In_ _IRQL_restores_ KIRQL NewIrql);
115 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
116
117 _Requires_lock_not_held_(*SpinLock)
118 _Acquires_lock_(*SpinLock)
119 _IRQL_requires_min_(DISPATCH_LEVEL)
120 NTKERNELAPI
121 VOID
122 FASTCALL
123 KefAcquireSpinLockAtDpcLevel(
124 _Inout_ PKSPIN_LOCK SpinLock);
125 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
126
127 _Requires_lock_held_(*SpinLock)
128 _Releases_lock_(*SpinLock)
129 _IRQL_requires_min_(DISPATCH_LEVEL)
130 NTKERNELAPI
131 VOID
132 FASTCALL
133 KefReleaseSpinLockFromDpcLevel(
134 _Inout_ PKSPIN_LOCK SpinLock);
135 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
136
137 NTSYSAPI
138 PKTHREAD
139 NTAPI
140 KeGetCurrentThread(VOID);
141
142 _Always_(_Post_satisfies_(return<=0))
143 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)144 _IRQL_requires_max_(DISPATCH_LEVEL)
145 _Kernel_float_saved_
146 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
147 FORCEINLINE
148 NTSTATUS
149 KeSaveFloatingPointState(
150 _Out_ PKFLOATING_SAVE FloatSave)
151 {
152 UNREFERENCED_PARAMETER(FloatSave);
153 return STATUS_SUCCESS;
154 }
155
156 _Success_(1)
157 _Kernel_float_restored_
158 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
159 FORCEINLINE
160 NTSTATUS
KeRestoreFloatingPointState(_In_ PKFLOATING_SAVE FloatSave)161 KeRestoreFloatingPointState(
162 _In_ PKFLOATING_SAVE FloatSave)
163 {
164 UNREFERENCED_PARAMETER(FloatSave);
165 return STATUS_SUCCESS;
166 }
167
168 VOID
169 KeFlushIoBuffers(
170 _In_ PMDL Mdl,
171 _In_ BOOLEAN ReadOperation,
172 _In_ BOOLEAN DmaOperation);
173
174 #define DbgRaiseAssertionFailure() __emit(0xdefc)
175
176 FORCEINLINE
177 VOID
_KeQueryTickCount(OUT PLARGE_INTEGER CurrentCount)178 _KeQueryTickCount(
179 OUT PLARGE_INTEGER CurrentCount)
180 {
181 for (;;) {
182 #ifdef NONAMELESSUNION
183 CurrentCount->s.HighPart = KeTickCount.High1Time;
184 CurrentCount->s.LowPart = KeTickCount.LowPart;
185 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
186 #else
187 CurrentCount->HighPart = KeTickCount.High1Time;
188 CurrentCount->LowPart = KeTickCount.LowPart;
189 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
190 #endif
191 YieldProcessor();
192 }
193 }
194 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
195
196 #define CP15_PMSELR 15, 0, 9, 12, 5 /* Event Counter Selection Register */
197 #define CP15_PMXEVCNTR 15, 0, 9, 13, 2 /* Event Count Register */
198 #define CP15_TPIDRURW 15, 0, 13, 0, 2 /* Software Thread ID Register, UsRW */
199 #define CP15_TPIDRURO 15, 0, 13, 0, 3 /* Software Thread ID Register, UsRO */
200 #define CP15_TPIDRPRW 15, 0, 13, 0, 4 /* Software Thread ID Register, Kernel */
201
202 $endif (_WDMDDK_)
203 $if (_NTDDK_)
204
205 #define PAUSE_PROCESSOR __yield();
206
207 #define KERNEL_STACK_SIZE 0x3000
208 #define KERNEL_LARGE_STACK_SIZE 0xF000
209 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
210
211 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
212
213 #define EXCEPTION_READ_FAULT 0
214 #define EXCEPTION_WRITE_FAULT 1
215 #define EXCEPTION_EXECUTE_FAULT 8
216
217 /* The following flags control the contents of the CONTEXT structure. */
218 #define CONTEXT_ARM 0x200000L
219 #define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001L)
220 #define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002L)
221 #define CONTEXT_FLOATING_POINT (CONTEXT_ARM | 0x00000004L)
222 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008L)
223 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
224
225 typedef struct _NEON128
226 {
227 ULONGLONG Low;
228 LONGLONG High;
229 } NEON128, *PNEON128;
230
231 #define ARM_MAX_BREAKPOINTS 8
232 #define ARM_MAX_WATCHPOINTS 1
233
234 typedef struct _CONTEXT
235 {
236 /* The flags values within this flag control the contents of
237 a CONTEXT record.
238
239 If the context record is used as an input parameter, then
240 for each portion of the context record controlled by a flag
241 whose value is set, it is assumed that that portion of the
242 context record contains valid context. If the context record
243 is being used to modify a thread's context, then only that
244 portion of the threads context will be modified.
245
246 If the context record is used as an IN OUT parameter to capture
247 the context of a thread, then only those portions of the thread's
248 context corresponding to set flags will be returned.
249
250 The context record is never used as an OUT only parameter. */
251 ULONG ContextFlags;
252
253 /* This section is specified/returned if the ContextFlags word contains
254 the flag CONTEXT_INTEGER. */
255 ULONG R0;
256 ULONG R1;
257 ULONG R2;
258 ULONG R3;
259 ULONG R4;
260 ULONG R5;
261 ULONG R6;
262 ULONG R7;
263 ULONG R8;
264 ULONG R9;
265 ULONG R10;
266 ULONG R11;
267 ULONG R12;
268
269 ULONG Sp;
270 ULONG Lr;
271 ULONG Pc;
272 ULONG Cpsr;
273
274 /* Floating Point/NEON Registers */
275 ULONG Fpscr;
276 ULONG Padding;
277 union
278 {
279 NEON128 Q[16];
280 ULONGLONG D[32];
281 ULONG S[32];
282 } DUMMYUNIONNAME;
283
284 /* Debug registers */
285 ULONG Bvr[ARM_MAX_BREAKPOINTS];
286 ULONG Bcr[ARM_MAX_BREAKPOINTS];
287 ULONG Wvr[ARM_MAX_WATCHPOINTS];
288 ULONG Wcr[ARM_MAX_WATCHPOINTS];
289
290 ULONG Padding2[2];
291 } CONTEXT;
292
293 #define PCR_MINOR_VERSION 1
294 #define PCR_MAJOR_VERSION 1
295
296 typedef struct _KPCR
297 {
298 _ANONYMOUS_UNION union
299 {
300 NT_TIB NtTib;
301 _ANONYMOUS_STRUCT struct
302 {
303 ULONG TibPad0[2];
304 PVOID Spare1;
305 struct _KPCR *Self;
306 struct _KPRCB *CurrentPrcb;
307 PKSPIN_LOCK_QUEUE LockArray;
308 PVOID Used_Self;
309 };
310 };
311 KIRQL CurrentIrql;
312 UCHAR SecondLevelCacheAssociativity;
313 ULONG Unused0[3];
314 USHORT MajorVersion;
315 USHORT MinorVersion;
316 ULONG StallScaleFactor;
317 PVOID Unused1[3];
318 ULONG KernelReserved[15];
319 ULONG SecondLevelCacheSize;
320 _ANONYMOUS_UNION union
321 {
322 USHORT SoftwareInterruptPending; // Software Interrupt Pending Flag
323 struct
324 {
325 UCHAR ApcInterrupt; // 0x01 if APC int pending
326 UCHAR DispatchInterrupt; // 0x01 if dispatch int pending
327 };
328 };
329 USHORT InterruptPad;
330 ULONG HalReserved[32];
331 PVOID KdVersionBlock;
332 PVOID Unused3;
333 ULONG PcrAlign1[8];
334 } KPCR, *PKPCR;
335
336 #define CP15_PCR_RESERVED_MASK 0xFFF
337 #define KIPCR() (((ULONG_PTR)_MoveFromCoprocessor(CP15_TPIDRPRW)) & ~CP15_PCR_RESERVED_MASK)
338
339 FORCEINLINE
340 PKPCR
KeGetPcr(VOID)341 KeGetPcr(VOID)
342 {
343 return (PKPCR)KIPCR();
344 }
345
346 #if (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS)
347 FORCEINLINE
348 ULONG
KeGetCurrentProcessorNumber(VOID)349 KeGetCurrentProcessorNumber(VOID)
350 {
351 return (ULONG)*((PUCHAR)KIPCR() + 0x580);
352 }
353 #endif /* (NTDDI_VERSION < NTDDI_WIN7) || !defined(NT_PROCESSOR_GROUPS) */
354
355 $endif (_NTDDK_)
356