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, Self)))
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))
155 // Size of the XMM register save area in the FXSAVE format
157 #define SIZE_OF_FX_REGISTERS 128
160 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
162 #define KSEG0_BASE 0x80000000
165 // Synchronization-level IRQL
168 #define SYNCH_LEVEL DISPATCH_LEVEL
170 #if (NTDDI_VERSION < NTDDI_WS03)
171 #define SYNCH_LEVEL (IPI_LEVEL - 1)
173 #define SYNCH_LEVEL (IPI_LEVEL - 2)
178 // Trap Frame Definition
180 typedef struct _KTRAP_FRAME
200 ULONG PreviousPreviousMode
;
201 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
217 } KTRAP_FRAME
, *PKTRAP_FRAME
;
220 // Defines the Callback Stack Layout for User Mode Callbacks
222 typedef struct _KCALLOUT_FRAME
234 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
237 // LDT Entry Definition
239 #ifndef _LDT_ENTRY_DEFINED
240 #define _LDT_ENTRY_DEFINED
241 typedef struct _LDT_ENTRY
268 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
272 // GDT Entry Definition
274 typedef struct _KGDTENTRY
301 } KGDTENTRY
, *PKGDTENTRY
;
304 // IDT Entry Access Definition
306 typedef struct _KIDT_ACCESS
314 UCHAR SystemSegmentFlag
:1;
320 } KIDT_ACCESS
, *PKIDT_ACCESS
;
323 // IDT Entry Definition
325 typedef struct _KIDTENTRY
330 USHORT ExtendedOffset
;
331 } KIDTENTRY
, *PKIDTENTRY
;
333 typedef struct _DESCRIPTOR
338 } KDESCRIPTOR
, *PKDESCRIPTOR
;
340 #ifndef NTOS_MODE_USER
342 // Macro to get current KPRCB
346 KeGetCurrentPrcb(VOID
)
348 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
352 // FN/FX (FPU) Save Area Structures
354 typedef struct _FNSAVE_FORMAT
363 UCHAR RegisterArea
[80];
364 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
366 typedef struct _FXSAVE_FORMAT
378 UCHAR RegisterArea
[SIZE_OF_FX_REGISTERS
];
379 UCHAR Reserved3
[128];
380 UCHAR Reserved4
[224];
381 UCHAR Align16Byte
[8];
382 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
384 typedef struct _FX_SAVE_AREA
388 FNSAVE_FORMAT FnArea
;
389 FXSAVE_FORMAT FxArea
;
393 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
396 // Special Registers Structure (outside of CONTEXT)
398 typedef struct _KSPECIAL_REGISTERS
415 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
418 // Processor State Data
420 typedef struct _KPROCESSOR_STATE
422 CONTEXT ContextFrame
;
423 KSPECIAL_REGISTERS SpecialRegisters
;
424 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
427 // Processor Region Control Block
430 typedef struct _KPRCB
434 struct _KTHREAD
*CurrentThread
;
435 struct _KTHREAD
*NextThread
;
436 struct _KTHREAD
*IdleThread
;
444 KPROCESSOR_STATE ProcessorState
;
445 ULONG KernelReserved
[16];
446 ULONG HalReserved
[16];
447 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
453 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
454 struct _KTHREAD
*NpxThread
;
455 ULONG InterruptCount
;
461 ULONG AdjustDpcThreshold
;
464 UCHAR DebuggerSavedIRQL
;
465 #if (NTDDI_VERSION >= NTDDI_WS03)
467 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
472 ULONG NodeShiftedColor
;
476 struct _KNODE
*ParentNode
;
477 ULONG MultiThreadProcessorSet
;
478 struct _KPRCB
*MultiThreadSetMaster
;
479 #if (NTDDI_VERSION >= NTDDI_WS03)
480 ULONG SecondaryColorMask
;
481 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
487 ULONG ThreadStartCount
[2];
489 ULONG CcFastReadNoWait
;
490 ULONG CcFastReadWait
;
491 ULONG CcFastReadNotPossible
;
492 ULONG CcCopyReadNoWait
;
493 ULONG CcCopyReadWait
;
494 ULONG CcCopyReadNoWaitMiss
;
495 #if (NTDDI_VERSION < NTDDI_LONGHORN)
496 ULONG KeAlignmentFixupCount
;
499 #if (NTDDI_VERSION < NTDDI_LONGHORN)
500 ULONG KeDcacheFlushCount
;
501 ULONG KeExceptionDispatchCount
;
502 ULONG KeFirstLevelTbFills
;
503 ULONG KeFloatingEmulationCount
;
504 ULONG KeIcacheFlushCount
;
505 ULONG KeSecondLevelTbFills
;
508 volatile ULONG IoReadOperationCount
;
509 volatile ULONG IoWriteOperationCount
;
510 volatile ULONG IoOtherOperationCount
;
511 LARGE_INTEGER IoReadTransferCount
;
512 LARGE_INTEGER IoWriteTransferCount
;
513 LARGE_INTEGER IoOtherTransferCount
;
514 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
515 ULONG CcFastMdlReadNoWait
;
516 ULONG CcFastMdlReadWait
;
517 ULONG CcFastMdlReadNotPossible
;
518 ULONG CcMapDataNoWait
;
520 ULONG CcPinMappedDataCount
;
521 ULONG CcPinReadNoWait
;
523 ULONG CcMdlReadNoWait
;
525 ULONG CcLazyWriteHotSpots
;
526 ULONG CcLazyWriteIos
;
527 ULONG CcLazyWritePages
;
530 ULONG CcLostDelayedWrites
;
531 ULONG CcFastReadResourceMiss
;
532 ULONG CcCopyReadWaitMiss
;
533 ULONG CcFastMdlReadResourceMiss
;
534 ULONG CcMapDataNoWaitMiss
;
535 ULONG CcMapDataWaitMiss
;
536 ULONG CcPinReadNoWaitMiss
;
537 ULONG CcPinReadWaitMiss
;
538 ULONG CcMdlReadNoWaitMiss
;
539 ULONG CcMdlReadWaitMiss
;
540 ULONG CcReadAheadIos
;
541 ULONG KeAlignmentFixupCount
;
542 ULONG KeExceptionDispatchCount
;
546 ULONG SpareCounter1
[8];
548 PP_LOOKASIDE_LIST PPLookasideList
[16];
549 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
550 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
551 volatile ULONG PacketBarrier
;
552 volatile ULONG ReverseStall
;
555 volatile PVOID CurrentPacket
[3];
556 volatile ULONG TargetSet
;
557 volatile PKIPI_WORKER WorkerRoutine
;
558 volatile ULONG IpiFrozen
;
560 volatile ULONG RequestSummary
;
561 volatile struct _KPRCB
*SignalDone
;
563 struct _KDPC_DATA DpcData
[2];
565 ULONG MaximumDpcQueueDepth
;
566 ULONG DpcRequestRate
;
567 ULONG MinimumDpcRate
;
568 volatile UCHAR DpcInterruptRequested
;
569 volatile UCHAR DpcThreadRequested
;
570 volatile UCHAR DpcRoutineActive
;
571 volatile UCHAR DpcThreadActive
;
574 volatile ULONG TimerHand
;
575 volatile ULONG TimerRequest
;
578 UCHAR ThreadDpcEnable
;
579 volatile BOOLEAN QuantumEnd
;
581 volatile UCHAR IdleSchedule
;
582 LONG DpcSetEventRequest
;
583 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
593 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
595 UCHAR ClockCheckSlot
;
596 UCHAR ClockPollCycle
;
598 LONG DpcWatchdogPeriod
;
599 LONG DpcWatchDogCount
;
600 LONG ThreadWatchdogPeriod
;
601 LONG ThreadWatchDogCount
;
606 LIST_ENTRY WaitListHead
;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
610 SINGLE_LIST_ENTRY DeferredReadyListHead
;
611 ULONGLONG StartCycles
;
613 ULONGLONG PrcbPad71
[3];
614 LIST_ENTRY DispatcherReadyListHead
[32];
616 LIST_ENTRY DispatcherReadyListHead
[32];
617 SINGLE_LIST_ENTRY DeferredReadyListHead
;
620 PVOID ChainedInterruptList
;
621 LONG LookasideIrpFloat
;
622 volatile LONG MmPageFaultCount
;
623 volatile LONG MmCopyOnWriteCount
;
624 volatile LONG MmTransitionCount
;
625 volatile LONG MmCacheTransitionCount
;
626 volatile LONG MmDemandZeroCount
;
627 volatile LONG MmPageReadCount
;
628 volatile LONG MmPageReadIoCount
;
629 volatile LONG MmCacheReadCount
;
630 volatile LONG MmCacheIoCount
;
631 volatile LONG MmDirtyPagesWriteCount
;
632 volatile LONG MmDirtyWriteIoCount
;
633 volatile LONG MmMappedPagesWriteCount
;
634 volatile LONG MmMappedWriteIoCount
;
635 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
637 ULONG CachedResidentAvailable
;
642 ULONG SpareFields0
[1];
644 UCHAR VendorString
[13];
646 UCHAR LogicalProcessorsPerPhysicalProcessor
;
649 LARGE_INTEGER UpdateSignature
;
650 volatile LARGE_INTEGER IsrTime
;
651 LARGE_INTEGER SpareField1
;
652 FX_SAVE_AREA NpxSaveArea
;
653 PROCESSOR_POWER_STATE PowerState
;
654 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
656 KTIMER DpcWatchdogTimer
;
659 SLIST_HEADER InterruptObjectPool
;
660 LARGE_INTEGER HyperCallPagePhysical
;
661 LARGE_INTEGER HyperCallPageVirtual
;
663 CACHE_DESCRIPTOR Cache
[5];
665 ULONG CacheProcessorMask
[5];
666 UCHAR LogicalProcessorsPerCore
;
668 ULONG PackageProcessorSet
;
669 ULONG CoreProcessorSet
;
674 // Processor Control Region
676 typedef struct _KIPCR
683 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
684 PVOID Used_StackBase
;
685 PVOID PerfGlobalGroupMask
;
687 ULONG ContextSwitches
;
688 KAFFINITY SetMemberCopy
;
698 PVOID KdVersionBlock
;
705 ULONG StallScaleFactor
;
709 UCHAR SecondLevelCacheAssociativity
;
711 ULONG KernelReserved
[14];
712 ULONG SecondLevelCacheSize
;
713 ULONG HalReserved
[16];
716 ULONG KernelReserved2
[17];
724 typedef struct _KiIoAccessMap
726 UCHAR DirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
727 UCHAR IoMap
[IOPM_FULL_SIZE
];
765 KIIO_ACCESS_MAP IoMaps
[IOPM_COUNT
];
766 UCHAR IntDirectionMap
[IOPM_DIRECTION_MAP_SIZE
];
770 // i386 CPUs don't have exception frames
772 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;