3 Copyright (c) Alex Ionescu. All rights reserved.
11 i386 Type definitions for the Kernel services.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
19 #ifndef _I386_KETYPES_H
20 #define _I386_KETYPES_H
27 // KPCR Access for non-IA64 builds
29 #define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
30 #define PCR ((volatile KPCR * const)K0IPCR)
31 #if defined(CONFIG_SMP) || defined(NT_BUILD)
33 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
39 #define MACHINE_TYPE_ISA 0x0000
40 #define MACHINE_TYPE_EISA 0x0001
41 #define MACHINE_TYPE_MCA 0x0002
44 // X86 80386 Segment Types
46 #define I386_TASK_GATE 0x5
48 #define I386_ACTIVE_TSS 0xB
49 #define I386_CALL_GATE 0xC
50 #define I386_INTERRUPT_GATE 0xE
51 #define I386_TRAP_GATE 0xF
56 #define RPL_MASK 0x0003
57 #define MODE_MASK 0x0001
58 #define KGDT_R0_CODE 0x8
59 #define KGDT_R0_DATA 0x10
60 #define KGDT_R3_CODE 0x18
61 #define KGDT_R3_DATA 0x20
63 #define KGDT_R0_PCR 0x30
64 #define KGDT_R3_TEB 0x38
66 #define KGDT_DF_TSS 0x50
67 #define KGDT_NMI_TSS 0x58
80 #define CR4_FXSR 0x200
81 #define CR4_XMMEXCPT 0x400
86 #define EFLAGS_CF 0x01L
87 #define EFLAGS_ZF 0x40L
88 #define EFLAGS_TF 0x100L
89 #define EFLAGS_INTERRUPT_MASK 0x200L
90 #define EFLAGS_DF 0x400L
91 #define EFLAGS_IOPL 0x3000L
92 #define EFLAGS_NESTED_TASK 0x4000L
93 #define EFLAGS_RF 0x10000
94 #define EFLAGS_V86_MASK 0x20000
95 #define EFLAGS_ALIGN_CHECK 0x40000
96 #define EFLAGS_VIF 0x80000
97 #define EFLAGS_VIP 0x100000
98 #define EFLAGS_ID 0x200000
99 #define EFLAGS_USER_SANITIZE 0x3F4DD7
100 #define EFLAG_SIGN 0x8000
101 #define EFLAG_ZERO 0x4000
109 #define IPI_PACKET_READY 8
110 #define IPI_SYNCH_REQUEST 16
115 #define PRCB_MAJOR_VERSION 1
116 #define PRCB_BUILD_DEBUG 1
117 #define PRCB_BUILD_UNIPROCESSOR 2
122 #define INITIAL_STALL_COUNT 0x64
127 #define IO_ACCESS_MAP_NONE 0
128 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
129 #define KiComputeIopmOffset(MapNumber) \
130 (MapNumber == IO_ACCESS_MAP_NONE) ? \
131 (USHORT)(sizeof(KTSS)) : \
132 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
135 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
137 #define KSEG0_BASE 0x80000000
140 // Synchronization-level IRQL
143 #define SYNCH_LEVEL DISPATCH_LEVEL
145 #if (NTDDI_VERSION < NTDDI_WS03)
146 #define SYNCH_LEVEL (IPI_LEVEL - 1)
148 #define SYNCH_LEVEL (IPI_LEVEL - 2)
153 // Trap Frame Definition
155 typedef struct _KTRAP_FRAME
175 ULONG PreviousPreviousMode
;
176 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
192 } KTRAP_FRAME
, *PKTRAP_FRAME
;
195 // LDT Entry Definition
197 #ifndef _LDT_ENTRY_DEFINED
198 #define _LDT_ENTRY_DEFINED
199 typedef struct _LDT_ENTRY
226 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
230 // GDT Entry Definition
232 typedef struct _KGDTENTRY
259 } KGDTENTRY
, *PKGDTENTRY
;
262 // IDT Entry Access Definition
264 typedef struct _KIDT_ACCESS
272 UCHAR SystemSegmentFlag
:1;
278 } KIDT_ACCESS
, *PKIDT_ACCESS
;
281 // IDT Entry Definition
283 typedef struct _KIDTENTRY
288 USHORT ExtendedOffset
;
289 } KIDTENTRY
, *PKIDTENTRY
;
291 typedef struct _DESCRIPTOR
296 } KDESCRIPTOR
, *PKDESCRIPTOR
;
298 #ifndef NTOS_MODE_USER
300 // Macro to get current KPRCB
304 KeGetCurrentPrcb(VOID
)
306 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
310 // FN/FX (FPU) Save Area Structures
312 typedef struct _FNSAVE_FORMAT
321 UCHAR RegisterArea
[80];
322 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
324 typedef struct _FXSAVE_FORMAT
336 UCHAR RegisterArea
[128];
337 UCHAR Reserved3
[128];
338 UCHAR Reserved4
[224];
339 UCHAR Align16Byte
[8];
340 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
342 typedef struct _FX_SAVE_AREA
346 FNSAVE_FORMAT FnArea
;
347 FXSAVE_FORMAT FxArea
;
351 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
354 // Special Registers Structure (outside of CONTEXT)
356 typedef struct _KSPECIAL_REGISTERS
373 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
376 // Processor State Data
378 typedef struct _KPROCESSOR_STATE
380 CONTEXT ContextFrame
;
381 KSPECIAL_REGISTERS SpecialRegisters
;
382 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
385 // Processor Region Control Block
388 typedef struct _KPRCB
392 struct _KTHREAD
*CurrentThread
;
393 struct _KTHREAD
*NextThread
;
394 struct _KTHREAD
*IdleThread
;
402 KPROCESSOR_STATE ProcessorState
;
403 ULONG KernelReserved
[16];
404 ULONG HalReserved
[16];
405 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
411 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
412 struct _KTHREAD
*NpxThread
;
413 ULONG InterruptCount
;
419 ULONG AdjustDpcThreshold
;
422 UCHAR DebuggerSavedIRQL
;
423 #if (NTDDI_VERSION >= NTDDI_WS03)
425 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
430 ULONG NodeShiftedColor
;
434 struct _KNODE
*ParentNode
;
435 ULONG MultiThreadProcessorSet
;
436 struct _KPRCB
*MultiThreadSetMaster
;
437 #if (NTDDI_VERSION >= NTDDI_WS03)
438 ULONG SecondaryColorMask
;
439 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
445 ULONG ThreadStartCount
[2];
447 ULONG CcFastReadNoWait
;
448 ULONG CcFastReadWait
;
449 ULONG CcFastReadNotPossible
;
450 ULONG CcCopyReadNoWait
;
451 ULONG CcCopyReadWait
;
452 ULONG CcCopyReadNoWaitMiss
;
453 #if (NTDDI_VERSION < NTDDI_LONGHORN)
454 ULONG KeAlignmentFixupCount
;
457 #if (NTDDI_VERSION < NTDDI_LONGHORN)
458 ULONG KeDcacheFlushCount
;
459 ULONG KeExceptionDispatchCount
;
460 ULONG KeFirstLevelTbFills
;
461 ULONG KeFloatingEmulationCount
;
462 ULONG KeIcacheFlushCount
;
463 ULONG KeSecondLevelTbFills
;
466 volatile ULONG IoReadOperationCount
;
467 volatile ULONG IoWriteOperationCount
;
468 volatile ULONG IoOtherOperationCount
;
469 LARGE_INTEGER IoReadTransferCount
;
470 LARGE_INTEGER IoWriteTransferCount
;
471 LARGE_INTEGER IoOtherTransferCount
;
472 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
473 ULONG CcFastMdlReadNoWait
;
474 ULONG CcFastMdlReadWait
;
475 ULONG CcFastMdlReadNotPossible
;
476 ULONG CcMapDataNoWait
;
478 ULONG CcPinMappedDataCount
;
479 ULONG CcPinReadNoWait
;
481 ULONG CcMdlReadNoWait
;
483 ULONG CcLazyWriteHotSpots
;
484 ULONG CcLazyWriteIos
;
485 ULONG CcLazyWritePages
;
488 ULONG CcLostDelayedWrites
;
489 ULONG CcFastReadResourceMiss
;
490 ULONG CcCopyReadWaitMiss
;
491 ULONG CcFastMdlReadResourceMiss
;
492 ULONG CcMapDataNoWaitMiss
;
493 ULONG CcMapDataWaitMiss
;
494 ULONG CcPinReadNoWaitMiss
;
495 ULONG CcPinReadWaitMiss
;
496 ULONG CcMdlReadNoWaitMiss
;
497 ULONG CcMdlReadWaitMiss
;
498 ULONG CcReadAheadIos
;
499 ULONG KeAlignmentFixupCount
;
500 ULONG KeExceptionDispatchCount
;
504 ULONG SpareCounter1
[8];
506 PP_LOOKASIDE_LIST PPLookasideList
[16];
507 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
508 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
509 volatile ULONG PacketBarrier
;
510 volatile ULONG ReverseStall
;
513 volatile PVOID CurrentPacket
[3];
514 volatile ULONG TargetSet
;
515 volatile PKIPI_WORKER WorkerRoutine
;
516 volatile ULONG IpiFrozen
;
518 volatile ULONG RequestSummary
;
519 volatile struct _KPRCB
*SignalDone
;
521 struct _KDPC_DATA DpcData
[2];
523 ULONG MaximumDpcQueueDepth
;
524 ULONG DpcRequestRate
;
525 ULONG MinimumDpcRate
;
526 volatile UCHAR DpcInterruptRequested
;
527 volatile UCHAR DpcThreadRequested
;
528 volatile UCHAR DpcRoutineActive
;
529 volatile UCHAR DpcThreadActive
;
532 volatile ULONG TimerHand
;
533 volatile ULONG TimerRequest
;
536 UCHAR ThreadDpcEnable
;
537 volatile BOOLEAN QuantumEnd
;
539 volatile UCHAR IdleSchedule
;
540 LONG DpcSetEventRequest
;
541 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
551 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
553 UCHAR ClockCheckSlot
;
554 UCHAR ClockPollCycle
;
556 LONG DpcWatchdogPeriod
;
557 LONG DpcWatchDogCount
;
558 LONG ThreadWatchdogPeriod
;
559 LONG ThreadWatchDogCount
;
564 LIST_ENTRY WaitListHead
;
567 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
568 SINGLE_LIST_ENTRY DeferredReadyListHead
;
569 ULONGLONG StartCycles
;
571 ULONGLONG PrcbPad71
[3];
572 LIST_ENTRY DispatcherReadyListHead
[32];
574 LIST_ENTRY DispatcherReadyListHead
[32];
575 SINGLE_LIST_ENTRY DeferredReadyListHead
;
578 PVOID ChainedInterruptList
;
579 LONG LookasideIrpFloat
;
580 volatile LONG MmPageFaultCount
;
581 volatile LONG MmCopyOnWriteCount
;
582 volatile LONG MmTransitionCount
;
583 volatile LONG MmCacheTransitionCount
;
584 volatile LONG MmDemandZeroCount
;
585 volatile LONG MmPageReadCount
;
586 volatile LONG MmPageReadIoCount
;
587 volatile LONG MmCacheReadCount
;
588 volatile LONG MmCacheIoCount
;
589 volatile LONG MmDirtyPagesWriteCount
;
590 volatile LONG MmDirtyWriteIoCount
;
591 volatile LONG MmMappedPagesWriteCount
;
592 volatile LONG MmMappedWriteIoCount
;
593 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
595 ULONG CachedResidentAvailable
;
600 ULONG SpareFields0
[1];
602 CHAR VendorString
[13];
604 UCHAR LogicalProcessorsPerPhysicalProcessor
;
607 LARGE_INTEGER UpdateSignature
;
608 volatile LARGE_INTEGER IsrTime
;
609 LARGE_INTEGER SpareField1
;
610 FX_SAVE_AREA NpxSaveArea
;
611 PROCESSOR_POWER_STATE PowerState
;
612 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
614 KTIMER DpcWatchdogTimer
;
617 SLIST_HEADER InterruptObjectPool
;
618 LARGE_INTEGER HyperCallPagePhysical
;
619 LARGE_INTEGER HyperCallPageVirtual
;
621 CACHE_DESCRIPTOR Cache
[5];
623 ULONG CacheProcessorMask
[5];
624 UCHAR LogicalProcessorsPerCore
;
626 ULONG PackageProcessorSet
;
627 ULONG CoreProcessorSet
;
632 // Processor Control Region
634 typedef struct _KIPCR
641 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
642 PVOID Used_StackBase
;
643 PVOID PerfGlobalGroupMask
;
645 ULONG ContextSwitches
;
646 KAFFINITY SetMemberCopy
;
656 PVOID KdVersionBlock
;
663 ULONG StallScaleFactor
;
667 UCHAR L2CacheAssociativity
;
669 ULONG KernelReserved
[14];
670 ULONG SecondLevelCacheSize
;
671 ULONG HalReserved
[16];
674 ULONG KernelReserved2
[17];
682 typedef struct _KiIoAccessMap
684 UCHAR DirectionMap
[32];
723 KIIO_ACCESS_MAP IoMaps
[1];
724 UCHAR IntDirectionMap
[32];
728 // i386 CPUs don't have exception frames
730 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;