Sync with trunk r63502.
[reactos.git] / 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 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 //
27 // Dependencies
28 //
29
30 //
31 // CPSR Values
32 //
33 #define CPSR_THUMB_ENABLE 0x20
34 #define CPSR_FIQ_DISABLE 0x40
35 #define CPSR_IRQ_DISABLE 0x80
36 #define CPSR_USER_MODE 0x10
37 #define CPSR_FIQ_MODE 0x11
38 #define CPSR_IRQ_MODE 0x12
39 #define CPSR_SVC_MODE 0x13
40 #define CPSR_ABORT_MODE 0x17
41 #define CPSR_UND_MODE 0x1B
42 #define CPSR_MODES 0x1F
43
44 //
45 // C1 Register Values
46 //
47 #define C1_MMU_CONTROL 0x01
48 #define C1_ALIGNMENT_CONTROL 0x02
49 #define C1_DCACHE_CONTROL 0x04
50 #define C1_ICACHE_CONTROL 0x1000
51 #define C1_VECTOR_CONTROL 0x2000
52
53 //
54 // IPI Types
55 //
56 #define IPI_APC 1
57 #define IPI_DPC 2
58 #define IPI_FREEZE 4
59 #define IPI_PACKET_READY 8
60 #define IPI_SYNCH_REQUEST 16
61
62 //
63 // PRCB Flags
64 //
65 #define PRCB_MAJOR_VERSION 1
66 #define PRCB_BUILD_DEBUG 1
67 #define PRCB_BUILD_UNIPROCESSOR 2
68
69 //
70 // No LDTs on ARM
71 //
72 #define LDT_ENTRY ULONG
73
74 //
75 // HAL Variables
76 //
77 #define INITIAL_STALL_COUNT 100
78
79 //
80 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
81 //
82 #define KSEG0_BASE 0x80000000
83
84 //
85 // Trap Frame Definition
86 //
87 typedef struct _KTRAP_FRAME
88 {
89 ULONG DbgArgMark;
90 ULONG R0;
91 ULONG R1;
92 ULONG R2;
93 ULONG R3;
94 ULONG R4;
95 ULONG R5;
96 ULONG R6;
97 ULONG R7;
98 ULONG R8;
99 ULONG R9;
100 ULONG R10;
101 ULONG R11;
102 ULONG R12;
103 ULONG UserSp;
104 ULONG UserLr;
105 ULONG SvcSp;
106 ULONG SvcLr;
107 ULONG Pc;
108 ULONG Spsr;
109 ULONG OldIrql;
110 ULONG PreviousMode;
111 ULONG PreviousTrapFrame;
112 } KTRAP_FRAME, *PKTRAP_FRAME;
113
114 //
115 // Defines the Callback Stack Layout for User Mode Callbacks
116 //
117 // Just a stub with some required members for now
118 //
119 typedef struct _KCALLOUT_FRAME
120 {
121 ULONG CallbackStack;
122 ULONG DummyFramePointer;
123 } KCALLOUT_FRAME, *PKCALLOUT_FRAME;
124
125 #ifndef NTOS_MODE_USER
126
127 //
128 // Exception Frame Definition
129 //
130 typedef struct _KEXCEPTION_FRAME
131 {
132 // ULONG R0;
133 // ULONG R1;
134 // ULONG R2;
135 // ULONG R3;
136 ULONG R4;
137 ULONG R5;
138 ULONG R6;
139 ULONG R7;
140 ULONG R8;
141 ULONG R9;
142 ULONG R10;
143 ULONG R11;
144 // ULONG R12;
145 ULONG Lr;
146 ULONG Psr;
147 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
148
149 //
150 // ARM Internal Registers
151 //
152 typedef union _ARM_TTB_REGISTER
153 {
154 struct
155 {
156 ULONG Reserved:14;
157 ULONG BaseAddress:18;
158 };
159 ULONG AsUlong;
160 } ARM_TTB_REGISTER;
161
162 typedef union _ARM_STATUS_REGISTER
163 {
164
165 struct
166 {
167 ULONG Mode:5;
168 ULONG State:1;
169 ULONG FiqDisable:1;
170 ULONG IrqDisable:1;
171 ULONG ImpreciseAbort:1;
172 ULONG Endianness:1;
173 ULONG Sbz:6;
174 ULONG GreaterEqual:4;
175 ULONG Sbz1:4;
176 ULONG Java:1;
177 ULONG Sbz2:2;
178 ULONG StickyOverflow:1;
179 ULONG Overflow:1;
180 ULONG CarryBorrowExtend:1;
181 ULONG Zero:1;
182 ULONG NegativeLessThan:1;
183 };
184 ULONG AsUlong;
185 } ARM_STATUS_REGISTER;
186
187 typedef union _ARM_DOMAIN_REGISTER
188 {
189 struct
190 {
191 ULONG Domain0:2;
192 ULONG Domain1:2;
193 ULONG Domain2:2;
194 ULONG Domain3:2;
195 ULONG Domain4:2;
196 ULONG Domain5:2;
197 ULONG Domain6:2;
198 ULONG Domain7:2;
199 ULONG Domain8:2;
200 ULONG Domain9:2;
201 ULONG Domain10:2;
202 ULONG Domain11:2;
203 ULONG Domain12:2;
204 ULONG Domain13:2;
205 ULONG Domain14:2;
206 ULONG Domain15:2;
207 };
208 ULONG AsUlong;
209 } ARM_DOMAIN_REGISTER;
210
211 typedef union _ARM_CONTROL_REGISTER
212 {
213 struct
214 {
215 ULONG MmuEnabled:1;
216 ULONG AlignmentFaultsEnabled:1;
217 ULONG DCacheEnabled:1;
218 ULONG Sbo:4;
219 ULONG BigEndianEnabled:1;
220 ULONG System:1;
221 ULONG Rom:1;
222 ULONG Sbz:2;
223 ULONG ICacheEnabled:1;
224 ULONG HighVectors:1;
225 ULONG RoundRobinReplacementEnabled:1;
226 ULONG Armv4Compat:1;
227 ULONG Ignored:6;
228 ULONG UnalignedAccess:1;
229 ULONG ExtendedPageTables:1;
230 ULONG Sbz1:1;
231 ULONG ExceptionBit:1;
232 ULONG Sbz2:1;
233 ULONG Nmif:1;
234 ULONG TexRemap:1;
235 ULONG ForceAp:1;
236 ULONG Reserved:2;
237 };
238 ULONG AsUlong;
239 } ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER;
240
241 C_ASSERT(sizeof(ARM_CONTROL_REGISTER) == sizeof(ULONG));
242
243 typedef union _ARM_ID_CODE_REGISTER
244 {
245 struct
246 {
247 ULONG Revision:4;
248 ULONG PartNumber:12;
249 ULONG Architecture:4;
250 ULONG Variant:4;
251 ULONG Identifier:8;
252 };
253 ULONG AsUlong;
254 } ARM_ID_CODE_REGISTER, *PARM_ID_CODE_REGISTER;
255
256 typedef union _ARM_CACHE_REGISTER
257 {
258 struct
259 {
260 ULONG ILength:2;
261 ULONG IMultipler:1;
262 ULONG IAssociativty:3;
263 ULONG ISize:4;
264 ULONG IReserved:2;
265 ULONG DLength:2;
266 ULONG DMultipler:1;
267 ULONG DAssociativty:3;
268 ULONG DSize:4;
269 ULONG DReserved:2;
270 ULONG Separate:1;
271 ULONG CType:4;
272 ULONG Reserved:3;
273 };
274 ULONG AsUlong;
275 } ARM_CACHE_REGISTER, *PARM_CACHE_REGISTER;
276
277 typedef union _ARM_LOCKDOWN_REGISTER
278 {
279 struct
280 {
281 ULONG Preserve:1;
282 ULONG Ignored:25;
283 ULONG Victim:3;
284 ULONG Reserved:3;
285 };
286 ULONG AsUlong;
287 } ARM_LOCKDOWN_REGISTER, *PARM_LOCKDOWN_REGISTER;
288
289 //
290 // ARM Domains
291 //
292 typedef enum _ARM_DOMAINS
293 {
294 Domain0,
295 Domain1,
296 Domain2,
297 Domain3,
298 Domain4,
299 Domain5,
300 Domain6,
301 Domain7,
302 Domain8,
303 Domain9,
304 Domain10,
305 Domain11,
306 Domain12,
307 Domain13,
308 Domain14,
309 Domain15
310 } ARM_DOMAINS;
311
312 //
313 // Special Registers Structure (outside of CONTEXT)
314 //
315 typedef struct _KSPECIAL_REGISTERS
316 {
317 ARM_CONTROL_REGISTER ControlRegister;
318 ARM_LOCKDOWN_REGISTER LockdownRegister;
319 ARM_CACHE_REGISTER CacheRegister;
320 ARM_STATUS_REGISTER StatusRegister;
321 } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
322
323 //
324 // Processor State
325 //
326 typedef struct _KPROCESSOR_STATE
327 {
328 struct _CONTEXT ContextFrame;
329 struct _KSPECIAL_REGISTERS SpecialRegisters;
330 } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
331
332 //
333 // Processor Region Control Block
334 //
335 typedef struct _KPRCB
336 {
337 USHORT MinorVersion;
338 USHORT MajorVersion;
339 struct _KTHREAD *CurrentThread;
340 struct _KTHREAD *NextThread;
341 struct _KTHREAD *IdleThread;
342 UCHAR Number;
343 UCHAR Reserved;
344 USHORT BuildType;
345 KAFFINITY SetMember;
346 UCHAR CpuType;
347 UCHAR CpuID;
348 USHORT CpuStep;
349 KPROCESSOR_STATE ProcessorState;
350 ULONG KernelReserved[16];
351 ULONG HalReserved[16];
352 UCHAR PrcbPad0[92];
353 KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
354 struct _KTHREAD *NpxThread;
355 ULONG InterruptCount;
356 ULONG KernelTime;
357 ULONG UserTime;
358 ULONG DpcTime;
359 ULONG DebugDpcTime;
360 ULONG InterruptTime;
361 ULONG AdjustDpcThreshold;
362 ULONG PageColor;
363 UCHAR SkipTick;
364 UCHAR DebuggerSavedIRQL;
365 UCHAR NodeColor;
366 UCHAR Spare1;
367 ULONG NodeShiftedColor;
368 struct _KNODE *ParentNode;
369 ULONG MultiThreadProcessorSet;
370 struct _KPRCB *MultiThreadSetMaster;
371 ULONG SecondaryColorMask;
372 LONG Sleeping;
373 ULONG CcFastReadNoWait;
374 ULONG CcFastReadWait;
375 ULONG CcFastReadNotPossible;
376 ULONG CcCopyReadNoWait;
377 ULONG CcCopyReadWait;
378 ULONG CcCopyReadNoWaitMiss;
379 ULONG KeAlignmentFixupCount;
380 ULONG SpareCounter0;
381 ULONG KeDcacheFlushCount;
382 ULONG KeExceptionDispatchCount;
383 ULONG KeFirstLevelTbFills;
384 ULONG KeFloatingEmulationCount;
385 ULONG KeIcacheFlushCount;
386 ULONG KeSecondLevelTbFills;
387 ULONG KeSystemCalls;
388 volatile ULONG IoReadOperationCount;
389 volatile ULONG IoWriteOperationCount;
390 volatile ULONG IoOtherOperationCount;
391 LARGE_INTEGER IoReadTransferCount;
392 LARGE_INTEGER IoWriteTransferCount;
393 LARGE_INTEGER IoOtherTransferCount;
394 ULONG SpareCounter1[8];
395 PP_LOOKASIDE_LIST PPLookasideList[16];
396 PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
397 PP_LOOKASIDE_LIST PPPagedLookasideList[32];
398 volatile ULONG PacketBarrier;
399 volatile ULONG ReverseStall;
400 PVOID IpiFrame;
401 UCHAR PrcbPad2[52];
402 volatile PVOID CurrentPacket[3];
403 volatile ULONG TargetSet;
404 volatile PKIPI_WORKER WorkerRoutine;
405 volatile ULONG IpiFrozen;
406 UCHAR PrcbPad3[40];
407 volatile ULONG RequestSummary;
408 volatile struct _KPRCB *SignalDone;
409 UCHAR PrcbPad4[56];
410 struct _KDPC_DATA DpcData[2];
411 PVOID DpcStack;
412 ULONG MaximumDpcQueueDepth;
413 ULONG DpcRequestRate;
414 ULONG MinimumDpcRate;
415 volatile UCHAR DpcInterruptRequested;
416 volatile UCHAR DpcThreadRequested;
417 volatile UCHAR DpcRoutineActive;
418 volatile UCHAR DpcThreadActive;
419 ULONG PrcbLock;
420 ULONG DpcLastCount;
421 volatile ULONG TimerHand;
422 volatile ULONG TimerRequest;
423 PVOID DpcThread;
424 KEVENT DpcEvent;
425 UCHAR ThreadDpcEnable;
426 volatile BOOLEAN QuantumEnd;
427 UCHAR PrcbPad50;
428 volatile UCHAR IdleSchedule;
429 LONG DpcSetEventRequest;
430 UCHAR PrcbPad5[18];
431 LONG TickOffset;
432 KDPC CallDpc;
433 ULONG PrcbPad7[8];
434 LIST_ENTRY WaitListHead;
435 ULONG ReadySummary;
436 ULONG QueueIndex;
437 LIST_ENTRY DispatcherReadyListHead[32];
438 SINGLE_LIST_ENTRY DeferredReadyListHead;
439 ULONG PrcbPad72[11];
440 PVOID ChainedInterruptList;
441 LONG LookasideIrpFloat;
442 volatile LONG MmPageFaultCount;
443 volatile LONG MmCopyOnWriteCount;
444 volatile LONG MmTransitionCount;
445 volatile LONG MmCacheTransitionCount;
446 volatile LONG MmDemandZeroCount;
447 volatile LONG MmPageReadCount;
448 volatile LONG MmPageReadIoCount;
449 volatile LONG MmCacheReadCount;
450 volatile LONG MmCacheIoCount;
451 volatile LONG MmDirtyPagesWriteCount;
452 volatile LONG MmDirtyWriteIoCount;
453 volatile LONG MmMappedPagesWriteCount;
454 volatile LONG MmMappedWriteIoCount;
455 ULONG SpareFields0[1];
456 CHAR VendorString[13];
457 UCHAR InitialApicId;
458 UCHAR LogicalProcessorsPerPhysicalProcessor;
459 ULONG MHz;
460 ULONG FeatureBits;
461 LARGE_INTEGER UpdateSignature;
462 volatile LARGE_INTEGER IsrTime;
463 LARGE_INTEGER SpareField1;
464 //FX_SAVE_AREA NpxSaveArea;
465 PROCESSOR_POWER_STATE PowerState;
466 } KPRCB, *PKPRCB;
467
468 //
469 // Processor Control Region
470 //
471 typedef struct _KIPCR
472 {
473 union
474 {
475 NT_TIB NtTib;
476 struct
477 {
478 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused
479 PVOID Used_StackBase; // Unused
480 PVOID PerfGlobalGroupMask;
481 PVOID TssCopy; // Unused
482 ULONG ContextSwitches;
483 KAFFINITY SetMemberCopy; // Unused
484 PVOID Used_Self;
485 };
486 };
487 struct _KPCR *Self;
488 struct _KPRCB *Prcb;
489 KIRQL Irql;
490 ULONG IRR; // Unused
491 ULONG IrrActive; // Unused
492 ULONG IDR; // Unused
493 PVOID KdVersionBlock;
494 PVOID IDT; // Unused
495 PVOID GDT; // Unused
496 PVOID TSS; // Unused
497 USHORT MajorVersion;
498 USHORT MinorVersion;
499 KAFFINITY SetMember;
500 ULONG StallScaleFactor;
501 UCHAR SpareUnused;
502 UCHAR Number;
503 UCHAR Spare0;
504 UCHAR SecondLevelCacheAssociativity;
505 ULONG VdmAlert;
506 ULONG KernelReserved[14];
507 ULONG SecondLevelCacheSize;
508 ULONG HalReserved[16];
509 // arm part
510 UCHAR IrqlMask[32];
511 ULONG IrqlTable[32];
512 PKINTERRUPT_ROUTINE InterruptRoutine[32];
513 ULONG ReservedVectors;
514 ULONG FirstLevelDcacheSize;
515 ULONG FirstLevelDcacheFillSize;
516 ULONG FirstLevelIcacheSize;
517 ULONG FirstLevelIcacheFillSize;
518 ULONG SecondLevelDcacheSize;
519 ULONG SecondLevelDcacheFillSize;
520 ULONG SecondLevelIcacheSize;
521 ULONG SecondLevelIcacheFillSize;
522 ULONG DcacheFillSize;
523 ULONG DcacheAlignment;
524 ULONG IcacheAlignment;
525 ULONG IcacheFillSize;
526 ULONG ProcessorId;
527 PVOID InterruptStack;
528 PVOID PanicStack;
529 PVOID InitialStack;
530 KPRCB PrcbData;
531 } KIPCR, *PKIPCR;
532
533 //
534 // Macro to get current KPRCB
535 //
536 FORCEINLINE
537 struct _KPRCB *
538 KeGetCurrentPrcb(VOID)
539 {
540 return PCR->Prcb;
541 }
542
543 //
544 // Just read it from the PCR
545 //
546 #define KeGetCurrentProcessorNumber() (int)PCR->Number
547 #define KeGetCurrentIrql() PCR->Irql
548 #define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread
549 #define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode
550 #define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0)
551 #define KeGetCurrentThread() _KeGetCurrentThread()
552 #define KeGetPreviousMode() _KeGetPreviousMode()
553 #define KeGetDcacheFillSize() PCR->DcacheFillSize
554
555 #endif // !NTOS_MODE_USER
556
557 #ifdef __cplusplus
558 }; // extern "C"
559 #endif
560
561 #endif // !_ARM_KETYPES_H