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
32 #define IPI_PACKET_READY 8
33 #define IPI_SYNCH_REQUEST 16
38 #define PRCB_MAJOR_VERSION 1
39 #define PRCB_BUILD_DEBUG 1
40 #define PRCB_BUILD_UNIPROCESSOR 2
45 #define LDT_ENTRY ULONG
50 #define INITIAL_STALL_COUNT 0x64
53 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
55 #define KSEG0_BASE 0x80000000
58 // Trap Frame Definition
60 typedef struct _KTRAP_FRAME
88 } KTRAP_FRAME
, *PKTRAP_FRAME
;
90 #ifndef NTOS_MODE_USER
93 // Exception Frame Definition
95 typedef struct _KEXCEPTION_FRAME
110 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
113 // ARM Internal Registers
115 typedef union _ARM_TTB_REGISTER
120 ULONG BaseAddress
:18;
125 typedef union _ARM_STATUS_REGISTER
134 ULONG ImpreciseAbort
:1;
137 ULONG GreaterEqual
:4;
141 ULONG StickyOverflow
:1;
143 ULONG CarryBorrowExtend
:1;
145 ULONG NegativeLessThan
:1;
148 } ARM_STATUS_REGISTER
;
150 typedef union _ARM_DOMAIN_REGISTER
172 } ARM_DOMAIN_REGISTER
;
174 typedef union _ARM_CONTROL_REGISTER
179 ULONG AlignmentFaultsEnabled
:1;
180 ULONG DCacheEnabled
:1;
182 ULONG BigEndianEnabled
:1;
186 ULONG ICacheEnabled
:1;
188 ULONG RoundRobinReplacementEnabled
:1;
196 } ARM_CONTROL_REGISTER
, *PARM_CONTROL_REGISTER
;
198 typedef union _ARM_ID_CODE_REGISTER
204 ULONG Architecture
:4;
209 } ARM_ID_CODE_REGISTER
, *PARM_ID_CODE_REGISTER
;
211 typedef union _ARM_CACHE_REGISTER
217 ULONG IAssociativty
:3;
222 ULONG DAssociativty
:3;
230 } ARM_CACHE_REGISTER
, *PARM_CACHE_REGISTER
;
232 typedef union _ARM_LOCKDOWN_REGISTER
242 } ARM_LOCKDOWN_REGISTER
, *PARM_LOCKDOWN_REGISTER
;
247 typedef enum _ARM_DOMAINS
268 // Special Registers Structure (outside of CONTEXT)
270 typedef struct _KSPECIAL_REGISTERS
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
;
281 typedef struct _KPROCESSOR_STATE
283 struct _CONTEXT ContextFrame
;
284 struct _KSPECIAL_REGISTERS SpecialRegisters
;
285 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
288 // Processor Region Control Block
290 typedef struct _KPRCB
294 struct _KTHREAD
*CurrentThread
;
295 struct _KTHREAD
*NextThread
;
296 struct _KTHREAD
*IdleThread
;
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
;
312 ULONG AdjustDpcThreshold
;
315 UCHAR DebuggerSavedIRQL
;
318 ULONG NodeShiftedColor
;
320 struct _KNODE
*ParentNode
;
321 ULONG MultiThreadProcessorSet
;
322 struct _KPRCB
*MultiThreadSetMaster
;
323 ULONG SecondaryColorMask
;
325 ULONG CcFastReadNoWait
;
326 ULONG CcFastReadWait
;
327 ULONG CcFastReadNotPossible
;
328 ULONG CcCopyReadNoWait
;
329 ULONG CcCopyReadWait
;
330 ULONG CcCopyReadNoWaitMiss
;
331 ULONG KeAlignmentFixupCount
;
333 ULONG KeDcacheFlushCount
;
334 ULONG KeExceptionDispatchCount
;
335 ULONG KeFirstLevelTbFills
;
336 ULONG KeIcacheFlushCount
;
337 ULONG KeSecondLevelTbFills
;
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
;
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];
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
;
368 volatile ULONG TimerHand
;
369 volatile ULONG TimerRequest
;
372 UCHAR ThreadDpcEnable
;
373 volatile BOOLEAN QuantumEnd
;
374 volatile UCHAR IdleSchedule
;
375 LONG DpcSetEventRequest
;
378 LIST_ENTRY WaitListHead
;
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];
401 volatile LARGE_INTEGER IsrTime
;
402 PROCESSOR_POWER_STATE PowerState
;
406 // Macro to get current KPRCB
410 KeGetCurrentPrcb(VOID
)