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)
32 #define KeGetPcr() PCR
34 #define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
40 #define MACHINE_TYPE_ISA 0x0000
41 #define MACHINE_TYPE_EISA 0x0001
42 #define MACHINE_TYPE_MCA 0x0002
45 // X86 80386 Segment Types
47 #define I386_TASK_GATE 0x5
49 #define I386_ACTIVE_TSS 0xB
50 #define I386_CALL_GATE 0xC
51 #define I386_INTERRUPT_GATE 0xE
52 #define I386_TRAP_GATE 0xF
57 #define RPL_MASK 0x0003
58 #define MODE_MASK 0x0001
59 #define KGDT_R0_CODE 0x8
60 #define KGDT_R0_DATA 0x10
61 #define KGDT_R3_CODE 0x18
62 #define KGDT_R3_DATA 0x20
64 #define KGDT_R0_PCR 0x30
65 #define KGDT_R3_TEB 0x38
67 #define KGDT_DF_TSS 0x50
68 #define KGDT_NMI_TSS 0x58
81 #define CR4_FXSR 0x200
82 #define CR4_XMMEXCPT 0x400
87 #define EFLAGS_CF 0x01L
88 #define EFLAGS_ZF 0x40L
89 #define EFLAGS_TF 0x100L
90 #define EFLAGS_INTERRUPT_MASK 0x200L
91 #define EFLAGS_DF 0x400L
92 #define EFLAGS_NESTED_TASK 0x4000L
93 #define EFLAGS_V86_MASK 0x20000
94 #define EFLAGS_ALIGN_CHECK 0x40000
95 #define EFLAGS_VIF 0x80000
96 #define EFLAGS_VIP 0x100000
97 #define EFLAGS_USER_SANITIZE 0x3F4DD7
98 #define EFLAG_SIGN 0x8000
99 #define EFLAG_ZERO 0x4000
107 #define IPI_PACKET_READY 8
108 #define IPI_SYNCH_REQUEST 16
113 #define PRCB_MAJOR_VERSION 1
114 #define PRCB_BUILD_DEBUG 1
115 #define PRCB_BUILD_UNIPROCESSOR 2
120 #define INITIAL_STALL_COUNT 0x64
125 #define IO_ACCESS_MAP_NONE 0
126 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
127 #define KiComputeIopmOffset(MapNumber) \
128 (MapNumber == IO_ACCESS_MAP_NONE) ? \
129 (USHORT)(sizeof(KTSS)) : \
130 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
133 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
135 #define KSEG0_BASE 0x80000000
138 // Synchronization-level IRQL
141 #define SYNCH_LEVEL DISPATCH_LEVEL
143 #define SYNCH_LEVEL (IPI_LEVEL - 1)
147 // Trap Frame Definition
149 typedef struct _KTRAP_FRAME
169 ULONG PreviousPreviousMode
;
170 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
186 } KTRAP_FRAME
, *PKTRAP_FRAME
;
189 // LDT Entry Definition
191 #ifndef _LDT_ENTRY_DEFINED
192 #define _LDT_ENTRY_DEFINED
193 typedef struct _LDT_ENTRY
220 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
224 // GDT Entry Definition
226 typedef struct _KGDTENTRY
253 } KGDTENTRY
, *PKGDTENTRY
;
256 // IDT Entry Access Definition
258 typedef struct _KIDT_ACCESS
266 UCHAR SystemSegmentFlag
:1;
272 } KIDT_ACCESS
, *PKIDT_ACCESS
;
275 // IDT Entry Definition
277 typedef struct _KIDTENTRY
282 USHORT ExtendedOffset
;
283 } KIDTENTRY
, *PKIDTENTRY
;
285 typedef struct _DESCRIPTOR
290 } KDESCRIPTOR
, *PKDESCRIPTOR
;
292 #ifndef NTOS_MODE_USER
294 // Macro to get current KPRCB
298 KeGetCurrentPrcb(VOID
)
300 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
304 // FN/FX (FPU) Save Area Structures
306 typedef struct _FNSAVE_FORMAT
315 UCHAR RegisterArea
[80];
316 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
318 typedef struct _FXSAVE_FORMAT
330 UCHAR RegisterArea
[128];
331 UCHAR Reserved3
[128];
332 UCHAR Reserved4
[224];
333 UCHAR Align16Byte
[8];
334 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
336 typedef struct _FX_SAVE_AREA
340 FNSAVE_FORMAT FnArea
;
341 FXSAVE_FORMAT FxArea
;
345 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
348 // Special Registers Structure (outside of CONTEXT)
350 typedef struct _KSPECIAL_REGISTERS
367 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
370 // Processor State Data
372 typedef struct _KPROCESSOR_STATE
374 CONTEXT ContextFrame
;
375 KSPECIAL_REGISTERS SpecialRegisters
;
376 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
379 // Processor Region Control Block
382 typedef struct _KPRCB
386 struct _KTHREAD
*CurrentThread
;
387 struct _KTHREAD
*NextThread
;
388 struct _KTHREAD
*IdleThread
;
396 KPROCESSOR_STATE ProcessorState
;
397 ULONG KernelReserved
[16];
398 ULONG HalReserved
[16];
399 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
405 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
406 struct _KTHREAD
*NpxThread
;
407 ULONG InterruptCount
;
413 ULONG AdjustDpcThreshold
;
416 UCHAR DebuggerSavedIRQL
;
417 #if (NTDDI_VERSION >= NTDDI_WS03)
419 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
424 ULONG NodeShiftedColor
;
428 struct _KNODE
*ParentNode
;
429 ULONG MultiThreadProcessorSet
;
430 struct _KPRCB
*MultiThreadSetMaster
;
431 #if (NTDDI_VERSION >= NTDDI_WS03)
432 ULONG SecondaryColorMask
;
433 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
439 ULONG ThreadStartCount
[2];
441 ULONG CcFastReadNoWait
;
442 ULONG CcFastReadWait
;
443 ULONG CcFastReadNotPossible
;
444 ULONG CcCopyReadNoWait
;
445 ULONG CcCopyReadWait
;
446 ULONG CcCopyReadNoWaitMiss
;
447 #if (NTDDI_VERSION < NTDDI_LONGHORN)
448 ULONG KeAlignmentFixupCount
;
451 #if (NTDDI_VERSION < NTDDI_LONGHORN)
452 ULONG KeDcacheFlushCount
;
453 ULONG KeExceptionDispatchCount
;
454 ULONG KeFirstLevelTbFills
;
455 ULONG KeFloatingEmulationCount
;
456 ULONG KeIcacheFlushCount
;
457 ULONG KeSecondLevelTbFills
;
460 volatile ULONG IoReadOperationCount
;
461 volatile ULONG IoWriteOperationCount
;
462 volatile ULONG IoOtherOperationCount
;
463 LARGE_INTEGER IoReadTransferCount
;
464 LARGE_INTEGER IoWriteTransferCount
;
465 LARGE_INTEGER IoOtherTransferCount
;
466 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
467 ULONG CcFastMdlReadNoWait
;
468 ULONG CcFastMdlReadWait
;
469 ULONG CcFastMdlReadNotPossible
;
470 ULONG CcMapDataNoWait
;
472 ULONG CcPinMappedDataCount
;
473 ULONG CcPinReadNoWait
;
475 ULONG CcMdlReadNoWait
;
477 ULONG CcLazyWriteHotSpots
;
478 ULONG CcLazyWriteIos
;
479 ULONG CcLazyWritePages
;
482 ULONG CcLostDelayedWrites
;
483 ULONG CcFastReadResourceMiss
;
484 ULONG CcCopyReadWaitMiss
;
485 ULONG CcFastMdlReadResourceMiss
;
486 ULONG CcMapDataNoWaitMiss
;
487 ULONG CcMapDataWaitMiss
;
488 ULONG CcPinReadNoWaitMiss
;
489 ULONG CcPinReadWaitMiss
;
490 ULONG CcMdlReadNoWaitMiss
;
491 ULONG CcMdlReadWaitMiss
;
492 ULONG CcReadAheadIos
;
493 ULONG KeAlignmentFixupCount
;
494 ULONG KeExceptionDispatchCount
;
498 ULONG SpareCounter1
[8];
500 PP_LOOKASIDE_LIST PPLookasideList
[16];
501 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
502 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
503 volatile ULONG PacketBarrier
;
504 volatile ULONG ReverseStall
;
507 volatile PVOID CurrentPacket
[3];
508 volatile ULONG TargetSet
;
509 volatile PKIPI_WORKER WorkerRoutine
;
510 volatile ULONG IpiFrozen
;
512 volatile ULONG RequestSummary
;
513 volatile struct _KPRCB
*SignalDone
;
515 struct _KDPC_DATA DpcData
[2];
517 ULONG MaximumDpcQueueDepth
;
518 ULONG DpcRequestRate
;
519 ULONG MinimumDpcRate
;
520 volatile UCHAR DpcInterruptRequested
;
521 volatile UCHAR DpcThreadRequested
;
522 volatile UCHAR DpcRoutineActive
;
523 volatile UCHAR DpcThreadActive
;
526 volatile ULONG TimerHand
;
527 volatile ULONG TimerRequest
;
530 UCHAR ThreadDpcEnable
;
531 volatile BOOLEAN QuantumEnd
;
533 volatile UCHAR IdleSchedule
;
534 LONG DpcSetEventRequest
;
535 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
545 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
547 UCHAR ClockCheckSlot
;
548 UCHAR ClockPollCycle
;
550 LONG DpcWatchdogPeriod
;
551 LONG DpcWatchDogCount
;
552 LONG ThreadWatchdogPeriod
;
553 LONG ThreadWatchDogCount
;
558 LIST_ENTRY WaitListHead
;
561 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
562 SINGLE_LIST_ENTRY DeferredReadyListHead
;
563 ULONGLONG StartCycles
;
565 ULONGLONG PrcbPad71
[3];
566 LIST_ENTRY DispatcherReadyListHead
[32];
568 LIST_ENTRY DispatcherReadyListHead
[32];
569 SINGLE_LIST_ENTRY DeferredReadyListHead
;
572 PVOID ChainedInterruptList
;
573 LONG LookasideIrpFloat
;
574 volatile LONG MmPageFaultCount
;
575 volatile LONG MmCopyOnWriteCount
;
576 volatile LONG MmTransitionCount
;
577 volatile LONG MmCacheTransitionCount
;
578 volatile LONG MmDemandZeroCount
;
579 volatile LONG MmPageReadCount
;
580 volatile LONG MmPageReadIoCount
;
581 volatile LONG MmCacheReadCount
;
582 volatile LONG MmCacheIoCount
;
583 volatile LONG MmDirtyPagesWriteCount
;
584 volatile LONG MmDirtyWriteIoCount
;
585 volatile LONG MmMappedPagesWriteCount
;
586 volatile LONG MmMappedWriteIoCount
;
587 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
589 ULONG CachedResidentAvailable
;
594 ULONG SpareFields0
[1];
596 CHAR VendorString
[13];
598 UCHAR LogicalProcessorsPerPhysicalProcessor
;
601 LARGE_INTEGER UpdateSignature
;
602 volatile LARGE_INTEGER IsrTime
;
603 LARGE_INTEGER SpareField1
;
604 FX_SAVE_AREA NpxSaveArea
;
605 PROCESSOR_POWER_STATE PowerState
;
606 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
608 KTIMER DpcWatchdogTimer
;
611 SLIST_HEADER InterruptObjectPool
;
612 LARGE_INTEGER HyperCallPagePhysical
;
613 LARGE_INTEGER HyperCallPageVirtual
;
615 CACHE_DESCRIPTOR Cache
[5];
617 ULONG CacheProcessorMask
[5];
618 UCHAR LogicalProcessorsPerCore
;
620 ULONG PackageProcessorSet
;
621 ULONG CoreProcessorSet
;
626 // Processor Control Region
628 typedef struct _KIPCR
635 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
636 PVOID Used_StackBase
;
637 PVOID PerfGlobalGroupMask
;
639 ULONG ContextSwitches
;
640 KAFFINITY SetMemberCopy
;
650 PVOID KdVersionBlock
;
661 ULONG StallScaleFactor
;
665 UCHAR L2CacheAssociativity
;
667 ULONG KernelReserved
[14];
668 ULONG SecondLevelCacheSize
;
669 ULONG HalReserved
[16];
672 ULONG KernelReserved2
[17];
680 typedef struct _KiIoAccessMap
682 UCHAR DirectionMap
[32];
721 KIIO_ACCESS_MAP IoMaps
[1];
722 UCHAR IntDirectionMap
[32];
726 // i386 CPUs don't have exception frames
728 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;