- Rewrite the low-level trap/exception/system call code from the ground up:
[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 0x64
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 Fpscr;
63 // ULONG FpExc;
64 // ULONG S[33];
65 // ULONG FpExtra[8];
66 ULONG DbgArgMark;
67 ULONG R0;
68 ULONG R1;
69 ULONG R2;
70 ULONG R3;
71 ULONG R4;
72 ULONG R5;
73 ULONG R6;
74 ULONG R7;
75 ULONG R8;
76 ULONG R9;
77 ULONG R10;
78 ULONG R11;
79 ULONG R12;
80 ULONG UserSp;
81 ULONG UserLr;
82 ULONG SvcSp;
83 ULONG SvcLr;
84 ULONG Pc;
85 ULONG Spsr;
86 ULONG OldIrql;
87 ULONG PreviousMode;
88 } KTRAP_FRAME, *PKTRAP_FRAME;
89
90 #ifndef NTOS_MODE_USER
91
92 //
93 // Exception Frame Definition
94 //
95 typedef struct _KEXCEPTION_FRAME
96 {
97 ULONG R4;
98 ULONG R5;
99 ULONG R6;
100 ULONG R7;
101 ULONG R8;
102 ULONG R9;
103 ULONG R10;
104 ULONG R11;
105 // ULONG R12;
106 // ULONG Sp;
107 ULONG Psr;
108 ULONG Lr;
109 // ULONG SwapReturn;
110 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
111
112 //
113 // ARM Internal Registers
114 //
115 typedef union _ARM_TTB_REGISTER
116 {
117 struct
118 {
119 ULONG Reserved:14;
120 ULONG BaseAddress:18;
121 };
122 ULONG AsUlong;
123 } ARM_TTB_REGISTER;
124
125 typedef union _ARM_STATUS_REGISTER
126 {
127
128 struct
129 {
130 ULONG Mode:5;
131 ULONG State:1;
132 ULONG FiqDisable:1;
133 ULONG IrqDisable:1;
134 ULONG ImpreciseAbort:1;
135 ULONG Endianness:1;
136 ULONG Sbz:6;
137 ULONG GreaterEqual:4;
138 ULONG Sbz1:4;
139 ULONG Java:1;
140 ULONG Sbz2:2;
141 ULONG StickyOverflow:1;
142 ULONG Overflow:1;
143 ULONG CarryBorrowExtend:1;
144 ULONG Zero:1;
145 ULONG NegativeLessThan:1;
146 };
147 ULONG AsUlong;
148 } ARM_STATUS_REGISTER;
149
150 typedef union _ARM_DOMAIN_REGISTER
151 {
152 struct
153 {
154 ULONG Domain0:2;
155 ULONG Domain1:2;
156 ULONG Domain2:2;
157 ULONG Domain3:2;
158 ULONG Domain4:2;
159 ULONG Domain5:2;
160 ULONG Domain6:2;
161 ULONG Domain7:2;
162 ULONG Domain8:2;
163 ULONG Domain9:2;
164 ULONG Domain10:2;
165 ULONG Domain11:2;
166 ULONG Domain12:2;
167 ULONG Domain13:2;
168 ULONG Domain14:2;
169 ULONG Domain15:2;
170 };
171 ULONG AsUlong;
172 } ARM_DOMAIN_REGISTER;
173
174 typedef union _ARM_CONTROL_REGISTER
175 {
176 struct
177 {
178 ULONG MmuEnabled:1;
179 ULONG AlignmentFaultsEnabled:1;
180 ULONG DCacheEnabled:1;
181 ULONG Sbo:4;
182 ULONG BigEndianEnabled:1;
183 ULONG System:1;
184 ULONG Rom:1;
185 ULONG Sbz:2;
186 ULONG ICacheEnabled:1;
187 ULONG HighVectors:1;
188 ULONG RoundRobinReplacementEnabled:1;
189 ULONG Armv4Compat:1;
190 ULONG Sbo1:1;
191 ULONG Sbz1:1;
192 ULONG Sbo2:1;
193 ULONG Reserved:14;
194 };
195 ULONG AsUlong;
196 } ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER;
197
198 typedef union _ARM_ID_CODE_REGISTER
199 {
200 struct
201 {
202 ULONG Revision:4;
203 ULONG PartNumber:12;
204 ULONG Architecture:4;
205 ULONG Variant:4;
206 ULONG Identifier:8;
207 };
208 ULONG AsUlong;
209 } ARM_ID_CODE_REGISTER, *PARM_ID_CODE_REGISTER;
210
211 typedef union _ARM_CACHE_REGISTER
212 {
213 struct
214 {
215 ULONG ILength:2;
216 ULONG IMultipler:1;
217 ULONG IAssociativty:3;
218 ULONG ISize:4;
219 ULONG IReserved:2;
220 ULONG DLength:2;
221 ULONG DMultipler:1;
222 ULONG DAssociativty:3;
223 ULONG DSize:4;
224 ULONG DReserved:2;
225 ULONG Separate:1;
226 ULONG CType:4;
227 ULONG Reserved:3;
228 };
229 ULONG AsUlong;
230 } ARM_CACHE_REGISTER, *PARM_CACHE_REGISTER;
231
232 typedef union _ARM_LOCKDOWN_REGISTER
233 {
234 struct
235 {
236 ULONG Preserve:1;
237 ULONG Ignored:25;
238 ULONG Victim:3;
239 ULONG Reserved:3;
240 };
241 ULONG AsUlong;
242 } ARM_LOCKDOWN_REGISTER, *PARM_LOCKDOWN_REGISTER;
243
244 //
245 // ARM Domains
246 //
247 typedef enum _ARM_DOMAINS
248 {
249 Domain0,
250 Domain1,
251 Domain2,
252 Domain3,
253 Domain4,
254 Domain5,
255 Domain6,
256 Domain7,
257 Domain8,
258 Domain9,
259 Domain10,
260 Domain11,
261 Domain12,
262 Domain13,
263 Domain14,
264 Domain15
265 } ARM_DOMAINS;
266
267 //
268 // Special Registers Structure (outside of CONTEXT)
269 //
270 typedef struct _KSPECIAL_REGISTERS
271 {
272 ARM_CONTROL_REGISTER ControlRegister;
273 ARM_LOCKDOWN_REGISTER LockdownRegister;
274 ARM_CACHE_REGISTER CacheRegister;
275 ARM_STATUS_REGISTER StatusRegister;
276 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
277
278 //
279 // Processor State
280 //
281 typedef struct _KPROCESSOR_STATE
282 {
283 struct _CONTEXT ContextFrame;
284 struct _KSPECIAL_REGISTERS SpecialRegisters;
285 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
286
287 //
288 // Processor Region Control Block
289 //
290 typedef struct _KPRCB
291 {
292 USHORT MinorVersion;
293 USHORT MajorVersion;
294 struct _KTHREAD *CurrentThread;
295 struct _KTHREAD *NextThread;
296 struct _KTHREAD *IdleThread;
297 UCHAR Number;
298 UCHAR Reserved;
299 USHORT BuildType;
300 KAFFINITY SetMember;
301 KPROCESSOR_STATE ProcessorState;
302 ULONG KernelReserved[16];
303 ULONG HalReserved[16];
304 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
305 struct _KTHREAD *NpxThread;
306 ULONG InterruptCount;
307 ULONG KernelTime;
308 ULONG UserTime;
309 ULONG DpcTime;
310 ULONG DebugDpcTime;
311 ULONG InterruptTime;
312 ULONG AdjustDpcThreshold;
313 ULONG PageColor;
314 UCHAR SkipTick;
315 UCHAR DebuggerSavedIRQL;
316 UCHAR NodeColor;
317 UCHAR Spare1;
318 ULONG NodeShiftedColor;
319 ULONG PcrPage;
320 struct _KNODE *ParentNode;
321 ULONG MultiThreadProcessorSet;
322 struct _KPRCB *MultiThreadSetMaster;
323 ULONG SecondaryColorMask;
324 LONG Sleeping;
325 ULONG CcFastReadNoWait;
326 ULONG CcFastReadWait;
327 ULONG CcFastReadNotPossible;
328 ULONG CcCopyReadNoWait;
329 ULONG CcCopyReadWait;
330 ULONG CcCopyReadNoWaitMiss;
331 ULONG KeAlignmentFixupCount;
332 ULONG SpareCounter0;
333 ULONG KeDcacheFlushCount;
334 ULONG KeExceptionDispatchCount;
335 ULONG KeFirstLevelTbFills;
336 ULONG KeIcacheFlushCount;
337 ULONG KeSecondLevelTbFills;
338 ULONG KeSystemCalls;
339 volatile ULONG IoReadOperationCount;
340 volatile ULONG IoWriteOperationCount;
341 volatile ULONG IoOtherOperationCount;
342 LARGE_INTEGER IoReadTransferCount;
343 LARGE_INTEGER IoWriteTransferCount;
344 LARGE_INTEGER IoOtherTransferCount;
345 PP_LOOKASIDE_LIST PPLookasideList[16];
346 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
347 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
348 volatile ULONG PacketBarrier;
349 volatile ULONG ReverseStall;
350 PVOID IpiFrame;
351 volatile PVOID CurrentPacket[3];
352 volatile ULONG TargetSet;
353 volatile PKIPI_WORKER WorkerRoutine;
354 volatile ULONG IpiFrozen;
355 volatile ULONG RequestSummary;
356 volatile struct _KPRCB *SignalDone;
357 struct _KDPC_DATA DpcData[2];
358 PVOID DpcStack;
359 ULONG MaximumDpcQueueDepth;
360 ULONG DpcRequestRate;
361 ULONG MinimumDpcRate;
362 volatile UCHAR DpcInterruptRequested;
363 volatile UCHAR DpcThreadRequested;
364 volatile UCHAR DpcRoutineActive;
365 volatile UCHAR DpcThreadActive;
366 ULONG PrcbLock;
367 ULONG DpcLastCount;
368 volatile ULONG TimerHand;
369 volatile ULONG TimerRequest;
370 PVOID DpcThread;
371 KEVENT DpcEvent;
372 UCHAR ThreadDpcEnable;
373 volatile BOOLEAN QuantumEnd;
374 volatile UCHAR IdleSchedule;
375 LONG DpcSetEventRequest;
376 LONG TickOffset;
377 KDPC CallDpc;
378 LIST_ENTRY WaitListHead;
379 ULONG ReadySummary;
380 ULONG QueueIndex;
381 LIST_ENTRY DispatcherReadyListHead[32];
382 SINGLE_LIST_ENTRY DeferredReadyListHead;
383 PVOID ChainedInterruptList;
384 LONG LookasideIrpFloat;
385 volatile LONG MmPageFaultCount;
386 volatile LONG MmCopyOnWriteCount;
387 volatile LONG MmTransitionCount;
388 volatile LONG MmCacheTransitionCount;
389 volatile LONG MmDemandZeroCount;
390 volatile LONG MmPageReadCount;
391 volatile LONG MmPageReadIoCount;
392 volatile LONG MmCacheReadCount;
393 volatile LONG MmCacheIoCount;
394 volatile LONG MmDirtyPagesWriteCount;
395 volatile LONG MmDirtyWriteIoCount;
396 volatile LONG MmMappedPagesWriteCount;
397 volatile LONG MmMappedWriteIoCount;
398 CHAR VendorString[13];
399 ULONG MHz;
400 ULONG FeatureBits;
401 volatile LARGE_INTEGER IsrTime;
402 PROCESSOR_POWER_STATE PowerState;
403 } KPRCB, *PKPRCB;
404
405 //
406 // Macro to get current KPRCB
407 //
408 FORCEINLINE
409 struct _KPRCB *
410 KeGetCurrentPrcb(VOID)
411 {
412 return PCR->Prcb;
413 }
414
415 #endif
416 #endif