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 100
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
;
88 // Defines the Callback Stack Layout for User Mode Callbacks
90 // Just a stub with some required members for now
92 typedef struct _KCALLOUT_FRAME
95 ULONG DummyFramePointer
;
96 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
98 #ifndef NTOS_MODE_USER
101 // Exception Frame Definition
103 typedef struct _KEXCEPTION_FRAME
120 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
123 // ARM Internal Registers
125 typedef union _ARM_TTB_REGISTER
130 ULONG BaseAddress
:18;
135 typedef union _ARM_STATUS_REGISTER
144 ULONG ImpreciseAbort
:1;
147 ULONG GreaterEqual
:4;
151 ULONG StickyOverflow
:1;
153 ULONG CarryBorrowExtend
:1;
155 ULONG NegativeLessThan
:1;
158 } ARM_STATUS_REGISTER
;
160 typedef union _ARM_DOMAIN_REGISTER
182 } ARM_DOMAIN_REGISTER
;
184 typedef union _ARM_CONTROL_REGISTER
189 ULONG AlignmentFaultsEnabled
:1;
190 ULONG DCacheEnabled
:1;
192 ULONG BigEndianEnabled
:1;
196 ULONG ICacheEnabled
:1;
198 ULONG RoundRobinReplacementEnabled
:1;
201 ULONG UnalignedAccess
:1;
202 ULONG ExtendedPageTables
:1;
204 ULONG ExceptionBit
:1;
212 } ARM_CONTROL_REGISTER
, *PARM_CONTROL_REGISTER
;
214 C_ASSERT(sizeof(ARM_CONTROL_REGISTER
) == sizeof(ULONG
));
216 typedef union _ARM_ID_CODE_REGISTER
222 ULONG Architecture
:4;
227 } ARM_ID_CODE_REGISTER
, *PARM_ID_CODE_REGISTER
;
229 typedef union _ARM_CACHE_REGISTER
235 ULONG IAssociativty
:3;
240 ULONG DAssociativty
:3;
248 } ARM_CACHE_REGISTER
, *PARM_CACHE_REGISTER
;
250 typedef union _ARM_LOCKDOWN_REGISTER
260 } ARM_LOCKDOWN_REGISTER
, *PARM_LOCKDOWN_REGISTER
;
265 typedef enum _ARM_DOMAINS
286 // Special Registers Structure (outside of CONTEXT)
288 typedef struct _KSPECIAL_REGISTERS
290 ARM_CONTROL_REGISTER ControlRegister
;
291 ARM_LOCKDOWN_REGISTER LockdownRegister
;
292 ARM_CACHE_REGISTER CacheRegister
;
293 ARM_STATUS_REGISTER StatusRegister
;
294 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
299 typedef struct _KPROCESSOR_STATE
301 struct _CONTEXT ContextFrame
;
302 struct _KSPECIAL_REGISTERS SpecialRegisters
;
303 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
306 // Processor Region Control Block
308 typedef struct _KPRCB
312 struct _KTHREAD
*CurrentThread
;
313 struct _KTHREAD
*NextThread
;
314 struct _KTHREAD
*IdleThread
;
319 KPROCESSOR_STATE ProcessorState
;
320 ULONG KernelReserved
[16];
321 ULONG HalReserved
[16];
322 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
323 struct _KTHREAD
*NpxThread
;
324 ULONG InterruptCount
;
330 ULONG AdjustDpcThreshold
;
333 UCHAR DebuggerSavedIRQL
;
336 ULONG NodeShiftedColor
;
338 struct _KNODE
*ParentNode
;
339 ULONG MultiThreadProcessorSet
;
340 struct _KPRCB
*MultiThreadSetMaster
;
341 ULONG SecondaryColorMask
;
343 ULONG CcFastReadNoWait
;
344 ULONG CcFastReadWait
;
345 ULONG CcFastReadNotPossible
;
346 ULONG CcCopyReadNoWait
;
347 ULONG CcCopyReadWait
;
348 ULONG CcCopyReadNoWaitMiss
;
349 ULONG KeAlignmentFixupCount
;
351 ULONG KeDcacheFlushCount
;
352 ULONG KeExceptionDispatchCount
;
353 ULONG KeFirstLevelTbFills
;
354 ULONG KeFloatingEmulationCount
;
355 ULONG KeIcacheFlushCount
;
356 ULONG KeSecondLevelTbFills
;
358 volatile ULONG IoReadOperationCount
;
359 volatile ULONG IoWriteOperationCount
;
360 volatile ULONG IoOtherOperationCount
;
361 LARGE_INTEGER IoReadTransferCount
;
362 LARGE_INTEGER IoWriteTransferCount
;
363 LARGE_INTEGER IoOtherTransferCount
;
364 ULONG KeContextSwitches
;
365 PP_LOOKASIDE_LIST PPLookasideList
[16];
366 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
367 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
368 volatile ULONG PacketBarrier
;
369 volatile ULONG ReverseStall
;
371 volatile PVOID CurrentPacket
[3];
372 volatile ULONG TargetSet
;
373 volatile PKIPI_WORKER WorkerRoutine
;
374 volatile ULONG IpiFrozen
;
375 volatile ULONG RequestSummary
;
376 volatile struct _KPRCB
*SignalDone
;
377 struct _KDPC_DATA DpcData
[2];
379 ULONG MaximumDpcQueueDepth
;
380 ULONG DpcRequestRate
;
381 ULONG MinimumDpcRate
;
382 volatile UCHAR DpcInterruptRequested
;
383 volatile UCHAR DpcThreadRequested
;
384 volatile UCHAR DpcRoutineActive
;
385 volatile UCHAR DpcThreadActive
;
388 volatile ULONG TimerHand
;
389 volatile ULONG TimerRequest
;
392 UCHAR ThreadDpcEnable
;
393 volatile BOOLEAN QuantumEnd
;
394 volatile UCHAR IdleSchedule
;
395 LONG DpcSetEventRequest
;
398 LIST_ENTRY WaitListHead
;
401 LIST_ENTRY DispatcherReadyListHead
[32];
402 SINGLE_LIST_ENTRY DeferredReadyListHead
;
403 PVOID ChainedInterruptList
;
404 LONG LookasideIrpFloat
;
405 volatile LONG MmPageFaultCount
;
406 volatile LONG MmCopyOnWriteCount
;
407 volatile LONG MmTransitionCount
;
408 volatile LONG MmCacheTransitionCount
;
409 volatile LONG MmDemandZeroCount
;
410 volatile LONG MmPageReadCount
;
411 volatile LONG MmPageReadIoCount
;
412 volatile LONG MmCacheReadCount
;
413 volatile LONG MmCacheIoCount
;
414 volatile LONG MmDirtyPagesWriteCount
;
415 volatile LONG MmDirtyWriteIoCount
;
416 volatile LONG MmMappedPagesWriteCount
;
417 volatile LONG MmMappedWriteIoCount
;
418 CHAR VendorString
[13];
421 volatile LARGE_INTEGER IsrTime
;
422 PROCESSOR_POWER_STATE PowerState
;
426 // Macro to get current KPRCB
430 KeGetCurrentPrcb(VOID
)