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 ((KPCR * const)K0IPCR)
31 #if defined(CONFIG_SMP) || defined(NT_BUILD)
33 #define KeGetPcr() ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
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
70 // Define the number of GDTs that can be queried by user mode
72 #define KGDT_NUMBER 10
85 #define CR4_FXSR 0x200
86 #define CR4_XMMEXCPT 0x400
91 #define EFLAGS_CF 0x01L
92 #define EFLAGS_ZF 0x40L
93 #define EFLAGS_TF 0x100L
94 #define EFLAGS_INTERRUPT_MASK 0x200L
95 #define EFLAGS_DF 0x400L
96 #define EFLAGS_IOPL 0x3000L
97 #define EFLAGS_NESTED_TASK 0x4000L
98 #define EFLAGS_RF 0x10000
99 #define EFLAGS_V86_MASK 0x20000
100 #define EFLAGS_ALIGN_CHECK 0x40000
101 #define EFLAGS_VIF 0x80000
102 #define EFLAGS_VIP 0x100000
103 #define EFLAGS_ID 0x200000
104 #define EFLAGS_USER_SANITIZE 0x3F4DD7
105 #define EFLAG_SIGN 0x8000
106 #define EFLAG_ZERO 0x4000
109 // Legacy floating status word bit masks.
111 #define FSW_INVALID_OPERATION 0x1
112 #define FSW_DENORMAL 0x2
113 #define FSW_ZERO_DIVIDE 0x4
114 #define FSW_OVERFLOW 0x8
115 #define FSW_UNDERFLOW 0x10
116 #define FSW_PRECISION 0x20
117 #define FSW_STACK_FAULT 0x40
125 #define IPI_PACKET_READY 8
126 #define IPI_SYNCH_REQUEST 16
131 #define PRCB_MAJOR_VERSION 1
132 #define PRCB_BUILD_DEBUG 1
133 #define PRCB_BUILD_UNIPROCESSOR 2
138 #define INITIAL_STALL_COUNT 100
144 #define IOPM_SIZE 8192
145 #define IOPM_FULL_SIZE 8196
146 #define IO_ACCESS_MAP_NONE 0
147 #define IOPM_DIRECTION_MAP_SIZE 32
148 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
149 #define KiComputeIopmOffset(MapNumber) \
150 (MapNumber == IO_ACCESS_MAP_NONE) ? \
151 (USHORT)(sizeof(KTSS)) : \
152 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
154 typedef UCHAR KIO_ACCESS_MAP
[IOPM_SIZE
];
156 typedef KIO_ACCESS_MAP
*PKIO_ACCESS_MAP
;
159 // Size of the XMM register save area in the FXSAVE format
161 #define SIZE_OF_FX_REGISTERS 128
164 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
166 #define KSEG0_BASE 0x80000000
169 // Synchronization-level IRQL
172 #define SYNCH_LEVEL DISPATCH_LEVEL
174 #if (NTDDI_VERSION < NTDDI_WS03)
175 #define SYNCH_LEVEL (IPI_LEVEL - 1)
177 #define SYNCH_LEVEL (IPI_LEVEL - 2)
182 // Trap Frame Definition
184 typedef struct _KTRAP_FRAME
204 ULONG PreviousPreviousMode
;
205 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
221 } KTRAP_FRAME
, *PKTRAP_FRAME
;
224 // Defines the Callback Stack Layout for User Mode Callbacks
226 typedef struct _KCALLOUT_FRAME
238 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
241 // LDT Entry Definition
243 #ifndef _LDT_ENTRY_DEFINED
244 #define _LDT_ENTRY_DEFINED
245 typedef struct _LDT_ENTRY
272 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
276 // GDT Entry Definition
278 typedef struct _KGDTENTRY
305 } KGDTENTRY
, *PKGDTENTRY
;
308 // IDT Entry Access Definition
310 typedef struct _KIDT_ACCESS
318 UCHAR SystemSegmentFlag
:1;
324 } KIDT_ACCESS
, *PKIDT_ACCESS
;
327 // IDT Entry Definition
329 typedef struct _KIDTENTRY
334 USHORT ExtendedOffset
;
335 } KIDTENTRY
, *PKIDTENTRY
;
337 typedef struct _DESCRIPTOR
342 } KDESCRIPTOR
, *PKDESCRIPTOR
;
344 #ifndef NTOS_MODE_USER
346 // Macro to get current KPRCB
350 KeGetCurrentPrcb(VOID
)
352 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
356 // FN/FX (FPU) Save Area Structures
358 typedef struct _FNSAVE_FORMAT
367 UCHAR RegisterArea
[80];
368 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
370 typedef struct _FXSAVE_FORMAT
382 UCHAR RegisterArea
[SIZE_OF_FX_REGISTERS
];
383 UCHAR Reserved3
[128];
384 UCHAR Reserved4
[224];
385 UCHAR Align16Byte
[8];
386 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
388 typedef struct _FX_SAVE_AREA
392 FNSAVE_FORMAT FnArea
;
393 FXSAVE_FORMAT FxArea
;
397 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
400 // Special Registers Structure (outside of CONTEXT)
402 typedef struct _KSPECIAL_REGISTERS
419 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
422 // Processor State Data
424 typedef struct _KPROCESSOR_STATE
426 CONTEXT ContextFrame
;
427 KSPECIAL_REGISTERS SpecialRegisters
;
428 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
431 // Processor Region Control Block
434 typedef struct _KPRCB
438 struct _KTHREAD
*CurrentThread
;
439 struct _KTHREAD
*NextThread
;
440 struct _KTHREAD
*IdleThread
;
448 KPROCESSOR_STATE ProcessorState
;
449 ULONG KernelReserved
[16];
450 ULONG HalReserved
[16];
451 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
457 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
458 struct _KTHREAD
*NpxThread
;
459 ULONG InterruptCount
;
465 ULONG AdjustDpcThreshold
;
468 UCHAR DebuggerSavedIRQL
;
469 #if (NTDDI_VERSION >= NTDDI_WS03)
471 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
476 ULONG NodeShiftedColor
;
480 struct _KNODE
*ParentNode
;
481 ULONG MultiThreadProcessorSet
;
482 struct _KPRCB
*MultiThreadSetMaster
;
483 #if (NTDDI_VERSION >= NTDDI_WS03)
484 ULONG SecondaryColorMask
;
485 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
491 ULONG ThreadStartCount
[2];
493 ULONG CcFastReadNoWait
;
494 ULONG CcFastReadWait
;
495 ULONG CcFastReadNotPossible
;
496 ULONG CcCopyReadNoWait
;
497 ULONG CcCopyReadWait
;
498 ULONG CcCopyReadNoWaitMiss
;
499 #if (NTDDI_VERSION < NTDDI_LONGHORN)
500 ULONG KeAlignmentFixupCount
;
503 #if (NTDDI_VERSION < NTDDI_LONGHORN)
504 ULONG KeDcacheFlushCount
;
505 ULONG KeExceptionDispatchCount
;
506 ULONG KeFirstLevelTbFills
;
507 ULONG KeFloatingEmulationCount
;
508 ULONG KeIcacheFlushCount
;
509 ULONG KeSecondLevelTbFills
;
512 volatile ULONG IoReadOperationCount
;
513 volatile ULONG IoWriteOperationCount
;
514 volatile ULONG IoOtherOperationCount
;
515 LARGE_INTEGER IoReadTransferCount
;
516 LARGE_INTEGER IoWriteTransferCount
;
517 LARGE_INTEGER IoOtherTransferCount
;
518 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
519 ULONG CcFastMdlReadNoWait
;
520 ULONG CcFastMdlReadWait
;
521 ULONG CcFastMdlReadNotPossible
;
522 ULONG CcMapDataNoWait
;
524 ULONG CcPinMappedDataCount
;
525 ULONG CcPinReadNoWait
;
527 ULONG CcMdlReadNoWait
;
529 ULONG CcLazyWriteHotSpots
;
530 ULONG CcLazyWriteIos
;
531 ULONG CcLazyWritePages
;
534 ULONG CcLostDelayedWrites
;
535 ULONG CcFastReadResourceMiss
;
536 ULONG CcCopyReadWaitMiss
;
537 ULONG CcFastMdlReadResourceMiss
;
538 ULONG CcMapDataNoWaitMiss
;
539 ULONG CcMapDataWaitMiss
;
540 ULONG CcPinReadNoWaitMiss
;
541 ULONG CcPinReadWaitMiss
;
542 ULONG CcMdlReadNoWaitMiss
;
543 ULONG CcMdlReadWaitMiss
;
544 ULONG CcReadAheadIos
;
545 ULONG KeAlignmentFixupCount
;
546 ULONG KeExceptionDispatchCount
;
550 ULONG SpareCounter1
[8];
552 PP_LOOKASIDE_LIST PPLookasideList
[16];
553 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
554 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
555 volatile ULONG PacketBarrier
;
556 volatile ULONG ReverseStall
;
559 volatile PVOID CurrentPacket
[3];
560 volatile ULONG TargetSet
;
561 volatile PKIPI_WORKER WorkerRoutine
;
562 volatile ULONG IpiFrozen
;
564 volatile ULONG RequestSummary
;
565 volatile struct _KPRCB
*SignalDone
;
567 struct _KDPC_DATA DpcData
[2];
569 ULONG MaximumDpcQueueDepth
;
570 ULONG DpcRequestRate
;
571 ULONG MinimumDpcRate
;
572 volatile UCHAR DpcInterruptRequested
;
573 volatile UCHAR DpcThreadRequested
;
574 volatile UCHAR DpcRoutineActive
;
575 volatile UCHAR DpcThreadActive
;
578 volatile ULONG TimerHand
;
579 volatile ULONG TimerRequest
;
582 UCHAR ThreadDpcEnable
;
583 volatile BOOLEAN QuantumEnd
;
585 volatile UCHAR IdleSchedule
;
586 LONG DpcSetEventRequest
;
587 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
597 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
599 UCHAR ClockCheckSlot
;
600 UCHAR ClockPollCycle
;
602 LONG DpcWatchdogPeriod
;
603 LONG DpcWatchDogCount
;
604 LONG ThreadWatchdogPeriod
;
605 LONG ThreadWatchDogCount
;
610 LIST_ENTRY WaitListHead
;
613 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
614 SINGLE_LIST_ENTRY DeferredReadyListHead
;
615 ULONGLONG StartCycles
;
617 ULONGLONG PrcbPad71
[3];
618 LIST_ENTRY DispatcherReadyListHead
[32];
620 LIST_ENTRY DispatcherReadyListHead
[32];
621 SINGLE_LIST_ENTRY DeferredReadyListHead
;
624 PVOID ChainedInterruptList
;
625 LONG LookasideIrpFloat
;
626 volatile LONG MmPageFaultCount
;
627 volatile LONG MmCopyOnWriteCount
;
628 volatile LONG MmTransitionCount
;
629 volatile LONG MmCacheTransitionCount
;
630 volatile LONG MmDemandZeroCount
;
631 volatile LONG MmPageReadCount
;
632 volatile LONG MmPageReadIoCount
;
633 volatile LONG MmCacheReadCount
;
634 volatile LONG MmCacheIoCount
;
635 volatile LONG MmDirtyPagesWriteCount
;
636 volatile LONG MmDirtyWriteIoCount
;
637 volatile LONG MmMappedPagesWriteCount
;
638 volatile LONG MmMappedWriteIoCount
;
639 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
641 ULONG CachedResidentAvailable
;
646 ULONG SpareFields0
[1];
648 CHAR VendorString
[13];
650 UCHAR LogicalProcessorsPerPhysicalProcessor
;
653 LARGE_INTEGER UpdateSignature
;
654 volatile LARGE_INTEGER IsrTime
;
655 LARGE_INTEGER SpareField1
;
656 FX_SAVE_AREA NpxSaveArea
;
657 PROCESSOR_POWER_STATE PowerState
;
658 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
660 KTIMER DpcWatchdogTimer
;
663 SLIST_HEADER InterruptObjectPool
;
664 LARGE_INTEGER HyperCallPagePhysical
;
665 LARGE_INTEGER HyperCallPageVirtual
;
667 CACHE_DESCRIPTOR Cache
[5];
669 ULONG CacheProcessorMask
[5];
670 UCHAR LogicalProcessorsPerCore
;
672 ULONG PackageProcessorSet
;
673 ULONG CoreProcessorSet
;
678 // Processor Control Region
680 typedef struct _KIPCR
687 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
688 PVOID Used_StackBase
;
689 PVOID PerfGlobalGroupMask
;
691 ULONG ContextSwitches
;
692 KAFFINITY SetMemberCopy
;
702 PVOID KdVersionBlock
;
709 ULONG StallScaleFactor
;
713 UCHAR SecondLevelCacheAssociativity
;
715 ULONG KernelReserved
[14];
716 ULONG SecondLevelCacheSize
;
717 ULONG HalReserved
[16];
720 ULONG KernelReserved2
[17];
728 typedef struct _KiIoAccessMap
730 UCHAR DirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
731 UCHAR IoMap
[IOPM_FULL_SIZE
];
769 KIIO_ACCESS_MAP IoMaps
[IOPM_COUNT
];
770 UCHAR IntDirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
774 // i386 CPUs don't have exception frames
776 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;