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
;
322 KPROCESSOR_STATE ProcessorState
;
323 ULONG KernelReserved
[16];
324 ULONG HalReserved
[16];
326 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
327 struct _KTHREAD
*NpxThread
;
328 ULONG InterruptCount
;
334 ULONG AdjustDpcThreshold
;
337 UCHAR DebuggerSavedIRQL
;
340 ULONG NodeShiftedColor
;
341 struct _KNODE
*ParentNode
;
342 ULONG MultiThreadProcessorSet
;
343 struct _KPRCB
*MultiThreadSetMaster
;
344 ULONG SecondaryColorMask
;
346 ULONG CcFastReadNoWait
;
347 ULONG CcFastReadWait
;
348 ULONG CcFastReadNotPossible
;
349 ULONG CcCopyReadNoWait
;
350 ULONG CcCopyReadWait
;
351 ULONG CcCopyReadNoWaitMiss
;
352 ULONG KeAlignmentFixupCount
;
354 ULONG KeDcacheFlushCount
;
355 ULONG KeExceptionDispatchCount
;
356 ULONG KeFirstLevelTbFills
;
357 ULONG KeFloatingEmulationCount
;
358 ULONG KeIcacheFlushCount
;
359 ULONG KeSecondLevelTbFills
;
361 volatile ULONG IoReadOperationCount
;
362 volatile ULONG IoWriteOperationCount
;
363 volatile ULONG IoOtherOperationCount
;
364 LARGE_INTEGER IoReadTransferCount
;
365 LARGE_INTEGER IoWriteTransferCount
;
366 LARGE_INTEGER IoOtherTransferCount
;
367 ULONG SpareCounter1
[8];
368 PP_LOOKASIDE_LIST PPLookasideList
[16];
369 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
370 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
371 volatile ULONG PacketBarrier
;
372 volatile ULONG ReverseStall
;
375 volatile PVOID CurrentPacket
[3];
376 volatile ULONG TargetSet
;
377 volatile PKIPI_WORKER WorkerRoutine
;
378 volatile ULONG IpiFrozen
;
380 volatile ULONG RequestSummary
;
381 volatile struct _KPRCB
*SignalDone
;
383 struct _KDPC_DATA DpcData
[2];
385 ULONG MaximumDpcQueueDepth
;
386 ULONG DpcRequestRate
;
387 ULONG MinimumDpcRate
;
388 volatile UCHAR DpcInterruptRequested
;
389 volatile UCHAR DpcThreadRequested
;
390 volatile UCHAR DpcRoutineActive
;
391 volatile UCHAR DpcThreadActive
;
394 volatile ULONG TimerHand
;
395 volatile ULONG TimerRequest
;
398 UCHAR ThreadDpcEnable
;
399 volatile BOOLEAN QuantumEnd
;
401 volatile UCHAR IdleSchedule
;
402 LONG DpcSetEventRequest
;
407 LIST_ENTRY WaitListHead
;
410 LIST_ENTRY DispatcherReadyListHead
[32];
411 SINGLE_LIST_ENTRY DeferredReadyListHead
;
413 PVOID ChainedInterruptList
;
414 LONG LookasideIrpFloat
;
415 volatile LONG MmPageFaultCount
;
416 volatile LONG MmCopyOnWriteCount
;
417 volatile LONG MmTransitionCount
;
418 volatile LONG MmCacheTransitionCount
;
419 volatile LONG MmDemandZeroCount
;
420 volatile LONG MmPageReadCount
;
421 volatile LONG MmPageReadIoCount
;
422 volatile LONG MmCacheReadCount
;
423 volatile LONG MmCacheIoCount
;
424 volatile LONG MmDirtyPagesWriteCount
;
425 volatile LONG MmDirtyWriteIoCount
;
426 volatile LONG MmMappedPagesWriteCount
;
427 volatile LONG MmMappedWriteIoCount
;
428 ULONG SpareFields0
[1];
429 CHAR VendorString
[13];
431 UCHAR LogicalProcessorsPerPhysicalProcessor
;
434 LARGE_INTEGER UpdateSignature
;
435 volatile LARGE_INTEGER IsrTime
;
436 LARGE_INTEGER SpareField1
;
437 //FX_SAVE_AREA NpxSaveArea;
438 PROCESSOR_POWER_STATE PowerState
;
442 // Processor Control Region
444 typedef struct _KIPCR
451 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
; // Unused
452 PVOID Used_StackBase
; // Unused
453 PVOID PerfGlobalGroupMask
;
454 PVOID TssCopy
; // Unused
455 ULONG ContextSwitches
;
456 KAFFINITY SetMemberCopy
; // Unused
464 ULONG IrrActive
; // Unused
466 PVOID KdVersionBlock
;
473 ULONG StallScaleFactor
;
480 PKINTERRUPT_ROUTINE InterruptRoutine
[32];
481 ULONG ReservedVectors
;
482 ULONG FirstLevelDcacheSize
;
483 ULONG FirstLevelDcacheFillSize
;
484 ULONG FirstLevelIcacheSize
;
485 ULONG FirstLevelIcacheFillSize
;
486 ULONG SecondLevelDcacheSize
;
487 ULONG SecondLevelDcacheFillSize
;
488 ULONG SecondLevelIcacheSize
;
489 ULONG SecondLevelIcacheFillSize
;
490 ULONG DcacheFillSize
;
491 ULONG DcacheAlignment
;
492 ULONG IcacheAlignment
;
493 ULONG IcacheFillSize
;
495 PVOID InterruptStack
;
502 // Macro to get current KPRCB
506 KeGetCurrentPrcb(VOID
)
512 // Just read it from the PCR
514 #define KeGetCurrentProcessorNumber() (int)PCR->Number
515 #define KeGetCurrentIrql() PCR->Irql
516 #define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread
517 #define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode
518 #define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0)
519 #define KeGetCurrentThread() _KeGetCurrentThread()
520 #define KeGetPreviousMode() _KeGetPreviousMode()
521 #define KeGetDcacheFillSize() PCR->DcacheFillSize