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
84 ULONG PreviousTrapFrame
;
85 } KTRAP_FRAME
, *PKTRAP_FRAME
;
87 #ifndef NTOS_MODE_USER
90 // Exception Frame Definition
92 typedef struct _KEXCEPTION_FRAME
109 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
112 // ARM Internal Registers
114 typedef union _ARM_TTB_REGISTER
119 ULONG BaseAddress
:18;
124 typedef union _ARM_STATUS_REGISTER
133 ULONG ImpreciseAbort
:1;
136 ULONG GreaterEqual
:4;
140 ULONG StickyOverflow
:1;
142 ULONG CarryBorrowExtend
:1;
144 ULONG NegativeLessThan
:1;
147 } ARM_STATUS_REGISTER
;
149 typedef union _ARM_DOMAIN_REGISTER
171 } ARM_DOMAIN_REGISTER
;
173 typedef union _ARM_CONTROL_REGISTER
178 ULONG AlignmentFaultsEnabled
:1;
179 ULONG DCacheEnabled
:1;
181 ULONG BigEndianEnabled
:1;
185 ULONG ICacheEnabled
:1;
187 ULONG RoundRobinReplacementEnabled
:1;
195 } ARM_CONTROL_REGISTER
, *PARM_CONTROL_REGISTER
;
197 typedef union _ARM_ID_CODE_REGISTER
203 ULONG Architecture
:4;
208 } ARM_ID_CODE_REGISTER
, *PARM_ID_CODE_REGISTER
;
210 typedef union _ARM_CACHE_REGISTER
216 ULONG IAssociativty
:3;
221 ULONG DAssociativty
:3;
229 } ARM_CACHE_REGISTER
, *PARM_CACHE_REGISTER
;
231 typedef union _ARM_LOCKDOWN_REGISTER
241 } ARM_LOCKDOWN_REGISTER
, *PARM_LOCKDOWN_REGISTER
;
246 typedef enum _ARM_DOMAINS
267 // Special Registers Structure (outside of CONTEXT)
269 typedef struct _KSPECIAL_REGISTERS
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
;
280 typedef struct _KPROCESSOR_STATE
282 struct _CONTEXT ContextFrame
;
283 struct _KSPECIAL_REGISTERS SpecialRegisters
;
284 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
287 // Processor Region Control Block
289 typedef struct _KPRCB
293 struct _KTHREAD
*CurrentThread
;
294 struct _KTHREAD
*NextThread
;
295 struct _KTHREAD
*IdleThread
;
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
;
311 ULONG AdjustDpcThreshold
;
314 UCHAR DebuggerSavedIRQL
;
317 ULONG NodeShiftedColor
;
319 struct _KNODE
*ParentNode
;
320 ULONG MultiThreadProcessorSet
;
321 struct _KPRCB
*MultiThreadSetMaster
;
322 ULONG SecondaryColorMask
;
324 ULONG CcFastReadNoWait
;
325 ULONG CcFastReadWait
;
326 ULONG CcFastReadNotPossible
;
327 ULONG CcCopyReadNoWait
;
328 ULONG CcCopyReadWait
;
329 ULONG CcCopyReadNoWaitMiss
;
330 ULONG KeAlignmentFixupCount
;
332 ULONG KeDcacheFlushCount
;
333 ULONG KeExceptionDispatchCount
;
334 ULONG KeFirstLevelTbFills
;
335 ULONG KeIcacheFlushCount
;
336 ULONG KeSecondLevelTbFills
;
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
;
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];
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
;
367 volatile ULONG TimerHand
;
368 volatile ULONG TimerRequest
;
371 UCHAR ThreadDpcEnable
;
372 volatile BOOLEAN QuantumEnd
;
373 volatile UCHAR IdleSchedule
;
374 LONG DpcSetEventRequest
;
377 LIST_ENTRY WaitListHead
;
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];
400 volatile LARGE_INTEGER IsrTime
;
401 PROCESSOR_POWER_STATE PowerState
;
405 // Macro to get current KPRCB
409 KeGetCurrentPrcb(VOID
)