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