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
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
114 #define IPI_PACKET_READY 8
115 #define IPI_SYNCH_REQUEST 16
120 #define PRCB_MAJOR_VERSION 1
121 #define PRCB_BUILD_DEBUG 1
122 #define PRCB_BUILD_UNIPROCESSOR 2
127 #define INITIAL_STALL_COUNT 100
132 #define IO_ACCESS_MAP_NONE 0
133 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
134 #define KiComputeIopmOffset(MapNumber) \
135 (MapNumber == IO_ACCESS_MAP_NONE) ? \
136 (USHORT)(sizeof(KTSS)) : \
137 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
140 // Size of the XMM register save area in the FXSAVE format
142 #define SIZE_OF_FX_REGISTERS 128
145 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
147 #define KSEG0_BASE 0x80000000
150 // Synchronization-level IRQL
153 #define SYNCH_LEVEL DISPATCH_LEVEL
155 #if (NTDDI_VERSION < NTDDI_WS03)
156 #define SYNCH_LEVEL (IPI_LEVEL - 1)
158 #define SYNCH_LEVEL (IPI_LEVEL - 2)
163 // Trap Frame Definition
165 typedef struct _KTRAP_FRAME
185 ULONG PreviousPreviousMode
;
186 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
202 } KTRAP_FRAME
, *PKTRAP_FRAME
;
205 // Defines the Callback Stack Layout for User Mode Callbacks
207 typedef struct _KCALLOUT_FRAME
219 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
222 // LDT Entry Definition
224 #ifndef _LDT_ENTRY_DEFINED
225 #define _LDT_ENTRY_DEFINED
226 typedef struct _LDT_ENTRY
253 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
257 // GDT Entry Definition
259 typedef struct _KGDTENTRY
286 } KGDTENTRY
, *PKGDTENTRY
;
289 // IDT Entry Access Definition
291 typedef struct _KIDT_ACCESS
299 UCHAR SystemSegmentFlag
:1;
305 } KIDT_ACCESS
, *PKIDT_ACCESS
;
308 // IDT Entry Definition
310 typedef struct _KIDTENTRY
315 USHORT ExtendedOffset
;
316 } KIDTENTRY
, *PKIDTENTRY
;
318 typedef struct _DESCRIPTOR
323 } KDESCRIPTOR
, *PKDESCRIPTOR
;
325 #ifndef NTOS_MODE_USER
327 // Macro to get current KPRCB
331 KeGetCurrentPrcb(VOID
)
333 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
337 // FN/FX (FPU) Save Area Structures
339 typedef struct _FNSAVE_FORMAT
348 UCHAR RegisterArea
[80];
349 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
351 typedef struct _FXSAVE_FORMAT
363 UCHAR RegisterArea
[SIZE_OF_FX_REGISTERS
];
364 UCHAR Reserved3
[128];
365 UCHAR Reserved4
[224];
366 UCHAR Align16Byte
[8];
367 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
369 typedef struct _FX_SAVE_AREA
373 FNSAVE_FORMAT FnArea
;
374 FXSAVE_FORMAT FxArea
;
378 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
381 // Special Registers Structure (outside of CONTEXT)
383 typedef struct _KSPECIAL_REGISTERS
400 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
403 // Processor State Data
405 typedef struct _KPROCESSOR_STATE
407 CONTEXT ContextFrame
;
408 KSPECIAL_REGISTERS SpecialRegisters
;
409 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
412 // Processor Region Control Block
415 typedef struct _KPRCB
419 struct _KTHREAD
*CurrentThread
;
420 struct _KTHREAD
*NextThread
;
421 struct _KTHREAD
*IdleThread
;
429 KPROCESSOR_STATE ProcessorState
;
430 ULONG KernelReserved
[16];
431 ULONG HalReserved
[16];
432 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
438 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
439 struct _KTHREAD
*NpxThread
;
440 ULONG InterruptCount
;
446 ULONG AdjustDpcThreshold
;
449 UCHAR DebuggerSavedIRQL
;
450 #if (NTDDI_VERSION >= NTDDI_WS03)
452 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
457 ULONG NodeShiftedColor
;
461 struct _KNODE
*ParentNode
;
462 ULONG MultiThreadProcessorSet
;
463 struct _KPRCB
*MultiThreadSetMaster
;
464 #if (NTDDI_VERSION >= NTDDI_WS03)
465 ULONG SecondaryColorMask
;
466 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
472 ULONG ThreadStartCount
[2];
474 ULONG CcFastReadNoWait
;
475 ULONG CcFastReadWait
;
476 ULONG CcFastReadNotPossible
;
477 ULONG CcCopyReadNoWait
;
478 ULONG CcCopyReadWait
;
479 ULONG CcCopyReadNoWaitMiss
;
480 #if (NTDDI_VERSION < NTDDI_LONGHORN)
481 ULONG KeAlignmentFixupCount
;
484 #if (NTDDI_VERSION < NTDDI_LONGHORN)
485 ULONG KeDcacheFlushCount
;
486 ULONG KeExceptionDispatchCount
;
487 ULONG KeFirstLevelTbFills
;
488 ULONG KeFloatingEmulationCount
;
489 ULONG KeIcacheFlushCount
;
490 ULONG KeSecondLevelTbFills
;
493 volatile ULONG IoReadOperationCount
;
494 volatile ULONG IoWriteOperationCount
;
495 volatile ULONG IoOtherOperationCount
;
496 LARGE_INTEGER IoReadTransferCount
;
497 LARGE_INTEGER IoWriteTransferCount
;
498 LARGE_INTEGER IoOtherTransferCount
;
499 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
500 ULONG CcFastMdlReadNoWait
;
501 ULONG CcFastMdlReadWait
;
502 ULONG CcFastMdlReadNotPossible
;
503 ULONG CcMapDataNoWait
;
505 ULONG CcPinMappedDataCount
;
506 ULONG CcPinReadNoWait
;
508 ULONG CcMdlReadNoWait
;
510 ULONG CcLazyWriteHotSpots
;
511 ULONG CcLazyWriteIos
;
512 ULONG CcLazyWritePages
;
515 ULONG CcLostDelayedWrites
;
516 ULONG CcFastReadResourceMiss
;
517 ULONG CcCopyReadWaitMiss
;
518 ULONG CcFastMdlReadResourceMiss
;
519 ULONG CcMapDataNoWaitMiss
;
520 ULONG CcMapDataWaitMiss
;
521 ULONG CcPinReadNoWaitMiss
;
522 ULONG CcPinReadWaitMiss
;
523 ULONG CcMdlReadNoWaitMiss
;
524 ULONG CcMdlReadWaitMiss
;
525 ULONG CcReadAheadIos
;
526 ULONG KeAlignmentFixupCount
;
527 ULONG KeExceptionDispatchCount
;
531 ULONG SpareCounter1
[8];
533 PP_LOOKASIDE_LIST PPLookasideList
[16];
534 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
535 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
536 volatile ULONG PacketBarrier
;
537 volatile ULONG ReverseStall
;
540 volatile PVOID CurrentPacket
[3];
541 volatile ULONG TargetSet
;
542 volatile PKIPI_WORKER WorkerRoutine
;
543 volatile ULONG IpiFrozen
;
545 volatile ULONG RequestSummary
;
546 volatile struct _KPRCB
*SignalDone
;
548 struct _KDPC_DATA DpcData
[2];
550 ULONG MaximumDpcQueueDepth
;
551 ULONG DpcRequestRate
;
552 ULONG MinimumDpcRate
;
553 volatile UCHAR DpcInterruptRequested
;
554 volatile UCHAR DpcThreadRequested
;
555 volatile UCHAR DpcRoutineActive
;
556 volatile UCHAR DpcThreadActive
;
559 volatile ULONG TimerHand
;
560 volatile ULONG TimerRequest
;
563 UCHAR ThreadDpcEnable
;
564 volatile BOOLEAN QuantumEnd
;
566 volatile UCHAR IdleSchedule
;
567 LONG DpcSetEventRequest
;
568 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
578 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
580 UCHAR ClockCheckSlot
;
581 UCHAR ClockPollCycle
;
583 LONG DpcWatchdogPeriod
;
584 LONG DpcWatchDogCount
;
585 LONG ThreadWatchdogPeriod
;
586 LONG ThreadWatchDogCount
;
591 LIST_ENTRY WaitListHead
;
594 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
595 SINGLE_LIST_ENTRY DeferredReadyListHead
;
596 ULONGLONG StartCycles
;
598 ULONGLONG PrcbPad71
[3];
599 LIST_ENTRY DispatcherReadyListHead
[32];
601 LIST_ENTRY DispatcherReadyListHead
[32];
602 SINGLE_LIST_ENTRY DeferredReadyListHead
;
605 PVOID ChainedInterruptList
;
606 LONG LookasideIrpFloat
;
607 volatile LONG MmPageFaultCount
;
608 volatile LONG MmCopyOnWriteCount
;
609 volatile LONG MmTransitionCount
;
610 volatile LONG MmCacheTransitionCount
;
611 volatile LONG MmDemandZeroCount
;
612 volatile LONG MmPageReadCount
;
613 volatile LONG MmPageReadIoCount
;
614 volatile LONG MmCacheReadCount
;
615 volatile LONG MmCacheIoCount
;
616 volatile LONG MmDirtyPagesWriteCount
;
617 volatile LONG MmDirtyWriteIoCount
;
618 volatile LONG MmMappedPagesWriteCount
;
619 volatile LONG MmMappedWriteIoCount
;
620 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
622 ULONG CachedResidentAvailable
;
627 ULONG SpareFields0
[1];
629 CHAR VendorString
[13];
631 UCHAR LogicalProcessorsPerPhysicalProcessor
;
634 LARGE_INTEGER UpdateSignature
;
635 volatile LARGE_INTEGER IsrTime
;
636 LARGE_INTEGER SpareField1
;
637 FX_SAVE_AREA NpxSaveArea
;
638 PROCESSOR_POWER_STATE PowerState
;
639 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
641 KTIMER DpcWatchdogTimer
;
644 SLIST_HEADER InterruptObjectPool
;
645 LARGE_INTEGER HyperCallPagePhysical
;
646 LARGE_INTEGER HyperCallPageVirtual
;
648 CACHE_DESCRIPTOR Cache
[5];
650 ULONG CacheProcessorMask
[5];
651 UCHAR LogicalProcessorsPerCore
;
653 ULONG PackageProcessorSet
;
654 ULONG CoreProcessorSet
;
659 // Processor Control Region
661 typedef struct _KIPCR
668 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
669 PVOID Used_StackBase
;
670 PVOID PerfGlobalGroupMask
;
672 ULONG ContextSwitches
;
673 KAFFINITY SetMemberCopy
;
683 PVOID KdVersionBlock
;
690 ULONG StallScaleFactor
;
694 UCHAR L2CacheAssociativity
;
696 ULONG KernelReserved
[14];
697 ULONG SecondLevelCacheSize
;
698 ULONG HalReserved
[16];
701 ULONG KernelReserved2
[17];
709 typedef struct _KiIoAccessMap
711 UCHAR DirectionMap
[32];
750 KIIO_ACCESS_MAP IoMaps
[1];
751 UCHAR IntDirectionMap
[32];
755 // i386 CPUs don't have exception frames
757 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;