3 Copyright (c) Alex Ionescu. All rights reserved.
11 ARM Type definitions for the Kernel services.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
19 #ifndef _ARM_KETYPES_H
20 #define _ARM_KETYPES_H
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
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
59 #define IPI_PACKET_READY 8
60 #define IPI_SYNCH_REQUEST 16
65 #define PRCB_MAJOR_VERSION 1
66 #define PRCB_BUILD_DEBUG 1
67 #define PRCB_BUILD_UNIPROCESSOR 2
72 #define LDT_ENTRY ULONG
77 #define INITIAL_STALL_COUNT 100
80 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
82 #define KSEG0_BASE 0x80000000
85 // Trap Frame Definition
87 typedef struct _KTRAP_FRAME
111 ULONG PreviousTrapFrame
;
112 } KTRAP_FRAME
, *PKTRAP_FRAME
;
115 // Defines the Callback Stack Layout for User Mode Callbacks
117 // Just a stub with some required members for now
119 typedef struct _KCALLOUT_FRAME
122 ULONG DummyFramePointer
;
123 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
125 #ifndef NTOS_MODE_USER
128 // Exception Frame Definition
130 typedef struct _KEXCEPTION_FRAME
147 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
150 // ARM Internal Registers
152 typedef union _ARM_TTB_REGISTER
157 ULONG BaseAddress
:18;
162 typedef union _ARM_STATUS_REGISTER
171 ULONG ImpreciseAbort
:1;
174 ULONG GreaterEqual
:4;
178 ULONG StickyOverflow
:1;
180 ULONG CarryBorrowExtend
:1;
182 ULONG NegativeLessThan
:1;
185 } ARM_STATUS_REGISTER
;
187 typedef union _ARM_DOMAIN_REGISTER
209 } ARM_DOMAIN_REGISTER
;
211 typedef union _ARM_CONTROL_REGISTER
216 ULONG AlignmentFaultsEnabled
:1;
217 ULONG DCacheEnabled
:1;
219 ULONG BigEndianEnabled
:1;
223 ULONG ICacheEnabled
:1;
225 ULONG RoundRobinReplacementEnabled
:1;
228 ULONG UnalignedAccess
:1;
229 ULONG ExtendedPageTables
:1;
231 ULONG ExceptionBit
:1;
239 } ARM_CONTROL_REGISTER
, *PARM_CONTROL_REGISTER
;
241 C_ASSERT(sizeof(ARM_CONTROL_REGISTER
) == sizeof(ULONG
));
243 typedef union _ARM_ID_CODE_REGISTER
249 ULONG Architecture
:4;
254 } ARM_ID_CODE_REGISTER
, *PARM_ID_CODE_REGISTER
;
256 typedef union _ARM_CACHE_REGISTER
262 ULONG IAssociativty
:3;
267 ULONG DAssociativty
:3;
275 } ARM_CACHE_REGISTER
, *PARM_CACHE_REGISTER
;
277 typedef union _ARM_LOCKDOWN_REGISTER
287 } ARM_LOCKDOWN_REGISTER
, *PARM_LOCKDOWN_REGISTER
;
292 typedef enum _ARM_DOMAINS
313 // Special Registers Structure (outside of CONTEXT)
315 typedef struct _KSPECIAL_REGISTERS
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
;
326 typedef struct _KPROCESSOR_STATE
328 struct _CONTEXT ContextFrame
;
329 struct _KSPECIAL_REGISTERS SpecialRegisters
;
330 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
333 // Processor Region Control Block
335 typedef struct _KPRCB
339 struct _KTHREAD
*CurrentThread
;
340 struct _KTHREAD
*NextThread
;
341 struct _KTHREAD
*IdleThread
;
349 KPROCESSOR_STATE ProcessorState
;
350 ULONG KernelReserved
[16];
351 ULONG HalReserved
[16];
353 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
354 struct _KTHREAD
*NpxThread
;
355 ULONG InterruptCount
;
361 ULONG AdjustDpcThreshold
;
364 UCHAR DebuggerSavedIRQL
;
367 ULONG NodeShiftedColor
;
368 struct _KNODE
*ParentNode
;
369 ULONG MultiThreadProcessorSet
;
370 struct _KPRCB
*MultiThreadSetMaster
;
371 ULONG SecondaryColorMask
;
373 ULONG CcFastReadNoWait
;
374 ULONG CcFastReadWait
;
375 ULONG CcFastReadNotPossible
;
376 ULONG CcCopyReadNoWait
;
377 ULONG CcCopyReadWait
;
378 ULONG CcCopyReadNoWaitMiss
;
379 ULONG KeAlignmentFixupCount
;
381 ULONG KeDcacheFlushCount
;
382 ULONG KeExceptionDispatchCount
;
383 ULONG KeFirstLevelTbFills
;
384 ULONG KeFloatingEmulationCount
;
385 ULONG KeIcacheFlushCount
;
386 ULONG KeSecondLevelTbFills
;
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
;
402 volatile PVOID CurrentPacket
[3];
403 volatile ULONG TargetSet
;
404 volatile PKIPI_WORKER WorkerRoutine
;
405 volatile ULONG IpiFrozen
;
407 volatile ULONG RequestSummary
;
408 volatile struct _KPRCB
*SignalDone
;
410 struct _KDPC_DATA DpcData
[2];
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
;
421 volatile ULONG TimerHand
;
422 volatile ULONG TimerRequest
;
425 UCHAR ThreadDpcEnable
;
426 volatile BOOLEAN QuantumEnd
;
428 volatile UCHAR IdleSchedule
;
429 LONG DpcSetEventRequest
;
434 LIST_ENTRY WaitListHead
;
437 LIST_ENTRY DispatcherReadyListHead
[32];
438 SINGLE_LIST_ENTRY DeferredReadyListHead
;
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];
458 UCHAR LogicalProcessorsPerPhysicalProcessor
;
461 LARGE_INTEGER UpdateSignature
;
462 volatile LARGE_INTEGER IsrTime
;
463 LARGE_INTEGER SpareField1
;
464 //FX_SAVE_AREA NpxSaveArea;
465 PROCESSOR_POWER_STATE PowerState
;
469 // Processor Control Region
471 typedef struct _KIPCR
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
491 ULONG IrrActive
; // Unused
493 PVOID KdVersionBlock
;
500 ULONG StallScaleFactor
;
504 UCHAR SecondLevelCacheAssociativity
;
506 ULONG KernelReserved
[14];
507 ULONG SecondLevelCacheSize
;
508 ULONG HalReserved
[16];
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
;
527 PVOID InterruptStack
;
534 // Macro to get current KPRCB
538 KeGetCurrentPrcb(VOID
)
544 // Just read it from the PCR
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
555 #endif // !NTOS_MODE_USER
561 #endif // !_ARM_KETYPES_H