3 Copyright (c) Alex Ionescu. All rights reserved.
11 PowerPC Type definitions for the Kernel services.
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
19 #ifndef _POWERPC_KETYPES_H
20 #define _POWERPC_KETYPES_H
32 #define IPI_PACKET_READY 4
33 #define IPI_SYNCH_REQUEST 10
34 #define MAXIMUM_VECTOR 0x100
36 #define KSEG0_BASE 0x80000000
38 #define PRCB_MAJOR_VERSION 1
39 #define PRCB_BUILD_DEBUG 1
42 #define ROUND_UP(x,y) (((x) + ((y)-1)) & ~((y)-1))
45 typedef double DOUBLE
;
47 typedef struct _FX_SAVE_AREA
{
51 typedef struct _LDT_ENTRY
{
72 ULONG Default_Big
: 1;
73 ULONG Granularity
: 1;
80 #define SYNCH_LEVEL DISPATCH_LEVEL
82 #define SYNCH_LEVEL (IPI_LEVEL - 1)
86 // Trap Frame Definition
88 typedef struct _KTRAP_FRAME
93 UCHAR SavedApcStateIndex
;
94 UCHAR SavedKernelApcDisable
;
95 UCHAR ExceptionRecord
[ROUND_UP(sizeof(EXCEPTION_RECORD
), sizeof(ULONGLONG
))];
139 } KTRAP_FRAME
, *PKTRAP_FRAME
;
142 // GDT Entry Definition
144 typedef struct _KGDTENTRY
171 } KGDTENTRY
, *PKGDTENTRY
;
174 // IDT Entry Definition
176 typedef struct _KIDTENTRY
181 USHORT ExtendedOffset
;
182 } KIDTENTRY
, *PKIDTENTRY
;
184 typedef struct _DESCRIPTOR
189 } KDESCRIPTOR
, *PKDESCRIPTOR
;
192 // Special Registers Structure (outside of CONTEXT)
194 typedef struct _KSPECIAL_REGISTERS
240 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
243 // Processor State Data
246 typedef struct _KPROCESSOR_STATE
248 CONTEXT ContextFrame
;
249 KSPECIAL_REGISTERS SpecialRegisters
;
250 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
253 // Processor Region Control Block
255 typedef struct _KPRCB
259 struct _KTHREAD
*CurrentThread
;
260 struct _KTHREAD
*NextThread
;
261 struct _KTHREAD
*IdleThread
;
269 KPROCESSOR_STATE ProcessorState
;
270 ULONG KernelReserved
[16];
271 ULONG HalReserved
[16];
272 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
278 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
279 struct _KTHREAD
*NpxThread
;
280 ULONG InterruptCount
;
286 ULONG AdjustDpcThreshold
;
289 UCHAR DebuggerSavedIRQL
;
290 #if (NTDDI_VERSION >= NTDDI_WS03)
292 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
297 ULONG NodeShiftedColor
;
301 struct _KNODE
*ParentNode
;
302 ULONG MultiThreadProcessorSet
;
303 struct _KPRCB
*MultiThreadSetMaster
;
304 #if (NTDDI_VERSION >= NTDDI_WS03)
305 ULONG SecondaryColorMask
;
306 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
312 ULONG ThreadStartCount
[2];
314 ULONG CcFastReadNoWait
;
315 ULONG CcFastReadWait
;
316 ULONG CcFastReadNotPossible
;
317 ULONG CcCopyReadNoWait
;
318 ULONG CcCopyReadWait
;
319 ULONG CcCopyReadNoWaitMiss
;
320 #if (NTDDI_VERSION < NTDDI_LONGHORN)
321 ULONG KeAlignmentFixupCount
;
324 #if (NTDDI_VERSION < NTDDI_LONGHORN)
325 ULONG KeDcacheFlushCount
;
326 ULONG KeExceptionDispatchCount
;
327 ULONG KeFirstLevelTbFills
;
328 ULONG KeFloatingEmulationCount
;
329 ULONG KeIcacheFlushCount
;
330 ULONG KeSecondLevelTbFills
;
333 volatile ULONG IoReadOperationCount
;
334 volatile ULONG IoWriteOperationCount
;
335 volatile ULONG IoOtherOperationCount
;
336 LARGE_INTEGER IoReadTransferCount
;
337 LARGE_INTEGER IoWriteTransferCount
;
338 LARGE_INTEGER IoOtherTransferCount
;
339 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
340 ULONG CcFastMdlReadNoWait
;
341 ULONG CcFastMdlReadWait
;
342 ULONG CcFastMdlReadNotPossible
;
343 ULONG CcMapDataNoWait
;
345 ULONG CcPinMappedDataCount
;
346 ULONG CcPinReadNoWait
;
348 ULONG CcMdlReadNoWait
;
350 ULONG CcLazyWriteHotSpots
;
351 ULONG CcLazyWriteIos
;
352 ULONG CcLazyWritePages
;
355 ULONG CcLostDelayedWrites
;
356 ULONG CcFastReadResourceMiss
;
357 ULONG CcCopyReadWaitMiss
;
358 ULONG CcFastMdlReadResourceMiss
;
359 ULONG CcMapDataNoWaitMiss
;
360 ULONG CcMapDataWaitMiss
;
361 ULONG CcPinReadNoWaitMiss
;
362 ULONG CcPinReadWaitMiss
;
363 ULONG CcMdlReadNoWaitMiss
;
364 ULONG CcMdlReadWaitMiss
;
365 ULONG CcReadAheadIos
;
366 ULONG KeAlignmentFixupCount
;
367 ULONG KeExceptionDispatchCount
;
371 ULONG SpareCounter1
[8];
373 PP_LOOKASIDE_LIST PPLookasideList
[16];
374 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
375 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
376 volatile ULONG PacketBarrier
;
377 volatile ULONG ReverseStall
;
380 volatile PVOID CurrentPacket
[3];
381 volatile ULONG TargetSet
;
382 volatile PKIPI_WORKER WorkerRoutine
;
383 volatile ULONG IpiFrozen
;
385 volatile ULONG RequestSummary
;
386 volatile struct _KPRCB
*SignalDone
;
388 struct _KDPC_DATA DpcData
[2];
390 ULONG MaximumDpcQueueDepth
;
391 ULONG DpcRequestRate
;
392 ULONG MinimumDpcRate
;
393 volatile UCHAR DpcInterruptRequested
;
394 volatile UCHAR DpcThreadRequested
;
395 volatile UCHAR DpcRoutineActive
;
396 volatile UCHAR DpcThreadActive
;
399 volatile ULONG TimerHand
;
400 volatile ULONG TimerRequest
;
403 UCHAR ThreadDpcEnable
;
404 volatile BOOLEAN QuantumEnd
;
406 volatile UCHAR IdleSchedule
;
407 LONG DpcSetEventRequest
;
408 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
418 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
420 UCHAR ClockCheckSlot
;
421 UCHAR ClockPollCycle
;
423 LONG DpcWatchdogPeriod
;
424 LONG DpcWatchDogCount
;
425 LONG ThreadWatchdogPeriod
;
426 LONG ThreadWatchDogCount
;
431 LIST_ENTRY WaitListHead
;
434 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
435 SINGLE_LIST_ENTRY DeferredReadyListHead
;
436 ULONGLONG StartCycles
;
438 ULONGLONG PrcbPad71
[3];
439 LIST_ENTRY DispatcherReadyListHead
[32];
441 LIST_ENTRY DispatcherReadyListHead
[32];
442 SINGLE_LIST_ENTRY DeferredReadyListHead
;
445 PVOID ChainedInterruptList
;
446 LONG LookasideIrpFloat
;
447 volatile LONG MmPageFaultCount
;
448 volatile LONG MmCopyOnWriteCount
;
449 volatile LONG MmTransitionCount
;
450 volatile LONG MmCacheTransitionCount
;
451 volatile LONG MmDemandZeroCount
;
452 volatile LONG MmPageReadCount
;
453 volatile LONG MmPageReadIoCount
;
454 volatile LONG MmCacheReadCount
;
455 volatile LONG MmCacheIoCount
;
456 volatile LONG MmDirtyPagesWriteCount
;
457 volatile LONG MmDirtyWriteIoCount
;
458 volatile LONG MmMappedPagesWriteCount
;
459 volatile LONG MmMappedWriteIoCount
;
460 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
462 ULONG CachedResidentAvailable
;
467 ULONG SpareFields0
[1];
469 CHAR VendorString
[13];
471 UCHAR LogicalProcessorsPerPhysicalProcessor
;
474 LARGE_INTEGER UpdateSignature
;
475 volatile LARGE_INTEGER IsrTime
;
476 LARGE_INTEGER SpareField1
;
477 FX_SAVE_AREA NpxSaveArea
;
478 PROCESSOR_POWER_STATE PowerState
;
479 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
481 KTIMER DpcWatchdogTimer
;
484 SLIST_HEADER InterruptObjectPool
;
485 LARGE_INTEGER HyperCallPagePhysical
;
486 LARGE_INTEGER HyperCallPageVirtual
;
488 CACHE_DESCRIPTOR Cache
[5];
490 ULONG CacheProcessorMask
[5];
491 UCHAR LogicalProcessorsPerCore
;
493 ULONG PackageProcessorSet
;
494 ULONG CoreProcessorSet
;
499 // Processor Control Region
501 typedef struct _KIPCR
505 PKINTERRUPT_ROUTINE InterruptRoutine
[MAXIMUM_VECTOR
];
509 ULONG FirstLevelDcacheSize
;
510 ULONG FirstLevelDcacheFillSize
;
511 ULONG FirstLevelIcacheSize
;
512 ULONG FirstLevelIcacheFillSize
;
513 ULONG SecondLevelDcacheSize
;
514 ULONG SecondLevelDcacheFillSize
;
515 ULONG SecondLevelIcacheSize
;
516 ULONG SecondLevelIcacheFillSize
;
517 struct _KPRCB
*PrcbData
;
519 ULONG DcacheAlignment
;
520 ULONG DcacheFillSize
;
521 ULONG IcacheAlignment
;
522 ULONG IcacheFillSize
;
523 ULONG ProcessorVersion
;
524 ULONG ProcessorRevision
;
525 ULONG ProfileInterval
;
527 ULONG StallExecutionCount
;
528 ULONG StallScaleFactor
;
545 ULONG ReservedVectors
;
546 struct _KTHREAD
*CurrentThread
;
547 ULONG AlignedCachePolicy
;
550 ULONG SoftwareInterrupt
;
554 UCHAR DispatchInterrupt
;
560 ULONG SystemReserved
[16];
561 ULONG HalReserved
[16];
562 ULONG FirstLevelActive
;
563 ULONG SystemServiceDispatchStart
;
564 ULONG SystemServiceDispatchEnd
;
565 ULONG InterruptStack
;
571 PVOID SavedStackLimit
;
585 ULONG OnInterruptStack
;
586 ULONG SavedInitialStack
;
593 typedef struct _KTSS
{
597 // PowerPC Exception Frame
599 typedef struct _KEXCEPTION_FRAME
639 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
643 KeGetCurrentPrcb(VOID
)
645 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KIPCR
, PrcbData
));