Merge trunk head (r45466)
[reactos.git] / reactos / include / ndk / arm / ketypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 ketypes.h (ARM)
8
9 Abstract:
10
11 ARM Type definitions for the Kernel services.
12
13 Author:
14
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16
17 --*/
18
19 #ifndef _ARM_KETYPES_H
20 #define _ARM_KETYPES_H
21
22 //
23 // Dependencies
24 //
25
26 //
27 // IPI Types
28 //
29 #define IPI_APC 1
30 #define IPI_DPC 2
31 #define IPI_FREEZE 4
32 #define IPI_PACKET_READY 8
33 #define IPI_SYNCH_REQUEST 16
34
35 //
36 // PRCB Flags
37 //
38 #define PRCB_MAJOR_VERSION 1
39 #define PRCB_BUILD_DEBUG 1
40 #define PRCB_BUILD_UNIPROCESSOR 2
41
42 //
43 // No LDTs on ARM
44 //
45 #define LDT_ENTRY ULONG
46
47 //
48 // HAL Variables
49 //
50 #define INITIAL_STALL_COUNT 100
51
52 //
53 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
54 //
55 #define KSEG0_BASE 0x80000000
56
57 //
58 // Trap Frame Definition
59 //
60 typedef struct _KTRAP_FRAME
61 {
62 ULONG DbgArgMark;
63 ULONG R0;
64 ULONG R1;
65 ULONG R2;
66 ULONG R3;
67 ULONG R4;
68 ULONG R5;
69 ULONG R6;
70 ULONG R7;
71 ULONG R8;
72 ULONG R9;
73 ULONG R10;
74 ULONG R11;
75 ULONG R12;
76 ULONG UserSp;
77 ULONG UserLr;
78 ULONG SvcSp;
79 ULONG SvcLr;
80 ULONG Pc;
81 ULONG Spsr;
82 ULONG OldIrql;
83 ULONG PreviousMode;
84 ULONG PreviousTrapFrame;
85 } KTRAP_FRAME, *PKTRAP_FRAME;
86
87 //
88 // Defines the Callback Stack Layout for User Mode Callbacks
89 //
90 // Just a stub with some required members for now
91 //
92 typedef struct _KCALLOUT_FRAME
93 {
94 ULONG CallbackStack;
95 ULONG DummyFramePointer;
96 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
97
98 #ifndef NTOS_MODE_USER
99
100 //
101 // Exception Frame Definition
102 //
103 typedef struct _KEXCEPTION_FRAME
104 {
105 // ULONG R0;
106 // ULONG R1;
107 // ULONG R2;
108 // ULONG R3;
109 ULONG R4;
110 ULONG R5;
111 ULONG R6;
112 ULONG R7;
113 ULONG R8;
114 ULONG R9;
115 ULONG R10;
116 ULONG R11;
117 // ULONG R12;
118 ULONG Lr;
119 ULONG Psr;
120 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
121
122 //
123 // ARM Internal Registers
124 //
125 typedef union _ARM_TTB_REGISTER
126 {
127 struct
128 {
129 ULONG Reserved:14;
130 ULONG BaseAddress:18;
131 };
132 ULONG AsUlong;
133 } ARM_TTB_REGISTER;
134
135 typedef union _ARM_STATUS_REGISTER
136 {
137
138 struct
139 {
140 ULONG Mode:5;
141 ULONG State:1;
142 ULONG FiqDisable:1;
143 ULONG IrqDisable:1;
144 ULONG ImpreciseAbort:1;
145 ULONG Endianness:1;
146 ULONG Sbz:6;
147 ULONG GreaterEqual:4;
148 ULONG Sbz1:4;
149 ULONG Java:1;
150 ULONG Sbz2:2;
151 ULONG StickyOverflow:1;
152 ULONG Overflow:1;
153 ULONG CarryBorrowExtend:1;
154 ULONG Zero:1;
155 ULONG NegativeLessThan:1;
156 };
157 ULONG AsUlong;
158 } ARM_STATUS_REGISTER;
159
160 typedef union _ARM_DOMAIN_REGISTER
161 {
162 struct
163 {
164 ULONG Domain0:2;
165 ULONG Domain1:2;
166 ULONG Domain2:2;
167 ULONG Domain3:2;
168 ULONG Domain4:2;
169 ULONG Domain5:2;
170 ULONG Domain6:2;
171 ULONG Domain7:2;
172 ULONG Domain8:2;
173 ULONG Domain9:2;
174 ULONG Domain10:2;
175 ULONG Domain11:2;
176 ULONG Domain12:2;
177 ULONG Domain13:2;
178 ULONG Domain14:2;
179 ULONG Domain15:2;
180 };
181 ULONG AsUlong;
182 } ARM_DOMAIN_REGISTER;
183
184 typedef union _ARM_CONTROL_REGISTER
185 {
186 struct
187 {
188 ULONG MmuEnabled:1;
189 ULONG AlignmentFaultsEnabled:1;
190 ULONG DCacheEnabled:1;
191 ULONG Sbo:4;
192 ULONG BigEndianEnabled:1;
193 ULONG System:1;
194 ULONG Rom:1;
195 ULONG Sbz:2;
196 ULONG ICacheEnabled:1;
197 ULONG HighVectors:1;
198 ULONG RoundRobinReplacementEnabled:1;
199 ULONG Armv4Compat:1;
200 ULONG Ignored:6;
201 ULONG UnalignedAccess:1;
202 ULONG ExtendedPageTables:1;
203 ULONG Sbz1:1;
204 ULONG ExceptionBit:1;
205 ULONG Sbz2:1;
206 ULONG Nmif:1;
207 ULONG TexRemap:1;
208 ULONG ForceAp:1;
209 ULONG Reserved:2;
210 };
211 ULONG AsUlong;
212 } ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER;
213
214 C_ASSERT(sizeof(ARM_CONTROL_REGISTER) == sizeof(ULONG));
215
216 typedef union _ARM_ID_CODE_REGISTER
217 {
218 struct
219 {
220 ULONG Revision:4;
221 ULONG PartNumber:12;
222 ULONG Architecture:4;
223 ULONG Variant:4;
224 ULONG Identifier:8;
225 };
226 ULONG AsUlong;
227 } ARM_ID_CODE_REGISTER, *PARM_ID_CODE_REGISTER;
228
229 typedef union _ARM_CACHE_REGISTER
230 {
231 struct
232 {
233 ULONG ILength:2;
234 ULONG IMultipler:1;
235 ULONG IAssociativty:3;
236 ULONG ISize:4;
237 ULONG IReserved:2;
238 ULONG DLength:2;
239 ULONG DMultipler:1;
240 ULONG DAssociativty:3;
241 ULONG DSize:4;
242 ULONG DReserved:2;
243 ULONG Separate:1;
244 ULONG CType:4;
245 ULONG Reserved:3;
246 };
247 ULONG AsUlong;
248 } ARM_CACHE_REGISTER, *PARM_CACHE_REGISTER;
249
250 typedef union _ARM_LOCKDOWN_REGISTER
251 {
252 struct
253 {
254 ULONG Preserve:1;
255 ULONG Ignored:25;
256 ULONG Victim:3;
257 ULONG Reserved:3;
258 };
259 ULONG AsUlong;
260 } ARM_LOCKDOWN_REGISTER, *PARM_LOCKDOWN_REGISTER;
261
262 //
263 // ARM Domains
264 //
265 typedef enum _ARM_DOMAINS
266 {
267 Domain0,
268 Domain1,
269 Domain2,
270 Domain3,
271 Domain4,
272 Domain5,
273 Domain6,
274 Domain7,
275 Domain8,
276 Domain9,
277 Domain10,
278 Domain11,
279 Domain12,
280 Domain13,
281 Domain14,
282 Domain15
283 } ARM_DOMAINS;
284
285 //
286 // Special Registers Structure (outside of CONTEXT)
287 //
288 typedef struct _KSPECIAL_REGISTERS
289 {
290 ARM_CONTROL_REGISTER ControlRegister;
291 ARM_LOCKDOWN_REGISTER LockdownRegister;
292 ARM_CACHE_REGISTER CacheRegister;
293 ARM_STATUS_REGISTER StatusRegister;
294 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
295
296 //
297 // Processor State
298 //
299 typedef struct _KPROCESSOR_STATE
300 {
301 struct _CONTEXT ContextFrame;
302 struct _KSPECIAL_REGISTERS SpecialRegisters;
303 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
304
305 //
306 // Processor Region Control Block
307 //
308 typedef struct _KPRCB
309 {
310 USHORT MinorVersion;
311 USHORT MajorVersion;
312 struct _KTHREAD *CurrentThread;
313 struct _KTHREAD *NextThread;
314 struct _KTHREAD *IdleThread;
315 UCHAR Number;
316 UCHAR Reserved;
317 USHORT BuildType;
318 KAFFINITY SetMember;
319 KPROCESSOR_STATE ProcessorState;
320 ULONG KernelReserved[16];
321 ULONG HalReserved[16];
322 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
323 struct _KTHREAD *NpxThread;
324 ULONG InterruptCount;
325 ULONG KernelTime;
326 ULONG UserTime;
327 ULONG DpcTime;
328 ULONG DebugDpcTime;
329 ULONG InterruptTime;
330 ULONG AdjustDpcThreshold;
331 ULONG PageColor;
332 UCHAR SkipTick;
333 UCHAR DebuggerSavedIRQL;
334 UCHAR NodeColor;
335 UCHAR Spare1;
336 ULONG NodeShiftedColor;
337 ULONG PcrPage;
338 struct _KNODE *ParentNode;
339 ULONG MultiThreadProcessorSet;
340 struct _KPRCB *MultiThreadSetMaster;
341 ULONG SecondaryColorMask;
342 LONG Sleeping;
343 ULONG CcFastReadNoWait;
344 ULONG CcFastReadWait;
345 ULONG CcFastReadNotPossible;
346 ULONG CcCopyReadNoWait;
347 ULONG CcCopyReadWait;
348 ULONG CcCopyReadNoWaitMiss;
349 ULONG KeAlignmentFixupCount;
350 ULONG SpareCounter0;
351 ULONG KeDcacheFlushCount;
352 ULONG KeExceptionDispatchCount;
353 ULONG KeFirstLevelTbFills;
354 ULONG KeFloatingEmulationCount;
355 ULONG KeIcacheFlushCount;
356 ULONG KeSecondLevelTbFills;
357 ULONG KeSystemCalls;
358 volatile ULONG IoReadOperationCount;
359 volatile ULONG IoWriteOperationCount;
360 volatile ULONG IoOtherOperationCount;
361 LARGE_INTEGER IoReadTransferCount;
362 LARGE_INTEGER IoWriteTransferCount;
363 LARGE_INTEGER IoOtherTransferCount;
364 ULONG KeContextSwitches;
365 PP_LOOKASIDE_LIST PPLookasideList[16];
366 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
367 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
368 volatile ULONG PacketBarrier;
369 volatile ULONG ReverseStall;
370 PVOID IpiFrame;
371 volatile PVOID CurrentPacket[3];
372 volatile ULONG TargetSet;
373 volatile PKIPI_WORKER WorkerRoutine;
374 volatile ULONG IpiFrozen;
375 volatile ULONG RequestSummary;
376 volatile struct _KPRCB *SignalDone;
377 struct _KDPC_DATA DpcData[2];
378 PVOID DpcStack;
379 ULONG MaximumDpcQueueDepth;
380 ULONG DpcRequestRate;
381 ULONG MinimumDpcRate;
382 volatile UCHAR DpcInterruptRequested;
383 volatile UCHAR DpcThreadRequested;
384 volatile UCHAR DpcRoutineActive;
385 volatile UCHAR DpcThreadActive;
386 ULONG PrcbLock;
387 ULONG DpcLastCount;
388 volatile ULONG TimerHand;
389 volatile ULONG TimerRequest;
390 PVOID DpcThread;
391 KEVENT DpcEvent;
392 UCHAR ThreadDpcEnable;
393 volatile BOOLEAN QuantumEnd;
394 volatile UCHAR IdleSchedule;
395 LONG DpcSetEventRequest;
396 LONG TickOffset;
397 KDPC CallDpc;
398 LIST_ENTRY WaitListHead;
399 ULONG ReadySummary;
400 ULONG QueueIndex;
401 LIST_ENTRY DispatcherReadyListHead[32];
402 SINGLE_LIST_ENTRY DeferredReadyListHead;
403 PVOID ChainedInterruptList;
404 LONG LookasideIrpFloat;
405 volatile LONG MmPageFaultCount;
406 volatile LONG MmCopyOnWriteCount;
407 volatile LONG MmTransitionCount;
408 volatile LONG MmCacheTransitionCount;
409 volatile LONG MmDemandZeroCount;
410 volatile LONG MmPageReadCount;
411 volatile LONG MmPageReadIoCount;
412 volatile LONG MmCacheReadCount;
413 volatile LONG MmCacheIoCount;
414 volatile LONG MmDirtyPagesWriteCount;
415 volatile LONG MmDirtyWriteIoCount;
416 volatile LONG MmMappedPagesWriteCount;
417 volatile LONG MmMappedWriteIoCount;
418 CHAR VendorString[13];
419 ULONG MHz;
420 ULONG FeatureBits;
421 volatile LARGE_INTEGER IsrTime;
422 PROCESSOR_POWER_STATE PowerState;
423 } KPRCB, *PKPRCB;
424
425 //
426 // Macro to get current KPRCB
427 //
428 FORCEINLINE
429 struct _KPRCB *
430 KeGetCurrentPrcb(VOID)
431 {
432 return PCR->Prcb;
433 }
434
435 #endif
436 #endif