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
29 #define MACHINE_TYPE_ISA 0x0000
30 #define MACHINE_TYPE_EISA 0x0001
31 #define MACHINE_TYPE_MCA 0x0002
34 // X86 80386 Segment Types
36 #define I386_TASK_GATE 0x5
38 #define I386_ACTIVE_TSS 0xB
39 #define I386_CALL_GATE 0xC
40 #define I386_INTERRUPT_GATE 0xE
41 #define I386_TRAP_GATE 0xF
46 #define RPL_MASK 0x0003
47 #define MODE_MASK 0x0001
48 #define KGDT_R0_CODE 0x8
49 #define KGDT_R0_DATA 0x10
50 #define KGDT_R3_CODE 0x18
51 #define KGDT_R3_DATA 0x20
53 #define KGDT_R0_PCR 0x30
54 #define KGDT_R3_TEB 0x38
56 #define KGDT_DF_TSS 0x50
57 #define KGDT_NMI_TSS 0x58
70 #define CR4_FXSR 0x200
71 #define CR4_XMMEXCPT 0x400
76 #define EFLAGS_CF 0x01L
77 #define EFLAGS_ZF 0x40L
78 #define EFLAGS_TF 0x100L
79 #define EFLAGS_INTERRUPT_MASK 0x200L
80 #define EFLAGS_DF 0x400L
81 #define EFLAGS_NESTED_TASK 0x4000L
82 #define EFLAGS_V86_MASK 0x20000
83 #define EFLAGS_ALIGN_CHECK 0x40000
84 #define EFLAGS_VIF 0x80000
85 #define EFLAGS_VIP 0x100000
86 #define EFLAGS_USER_SANITIZE 0x3F4DD7
87 #define EFLAG_SIGN 0x8000
88 #define EFLAG_ZERO 0x4000
96 #define IPI_PACKET_READY 8
97 #define IPI_SYNCH_REQUEST 16
102 #define PRCB_MAJOR_VERSION 1
103 #define PRCB_BUILD_DEBUG 1
104 #define PRCB_BUILD_UNIPROCESSOR 2
109 #define INITIAL_STALL_COUNT 0x64
112 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
114 #define KSEG0_BASE 0x80000000
117 // Synchronization-level IRQL
120 #define SYNCH_LEVEL DISPATCH_LEVEL
122 #define SYNCH_LEVEL (IPI_LEVEL - 1)
126 // Trap Frame Definition
128 typedef struct _KTRAP_FRAME
148 ULONG PreviousPreviousMode
;
149 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
165 } KTRAP_FRAME
, *PKTRAP_FRAME
;
168 // LDT Entry Definition
170 #ifndef _LDT_ENTRY_DEFINED
171 #define _LDT_ENTRY_DEFINED
172 typedef struct _LDT_ENTRY
199 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
203 // GDT Entry Definition
205 typedef struct _KGDTENTRY
232 } KGDTENTRY
, *PKGDTENTRY
;
235 // IDT Entry Access Definition
237 typedef struct _KIDT_ACCESS
245 UCHAR SystemSegmentFlag
:1;
251 } KIDT_ACCESS
, *PKIDT_ACCESS
;
254 // IDT Entry Definition
256 typedef struct _KIDTENTRY
261 USHORT ExtendedOffset
;
262 } KIDTENTRY
, *PKIDTENTRY
;
264 typedef struct _DESCRIPTOR
269 } KDESCRIPTOR
, *PKDESCRIPTOR
;
271 #ifndef NTOS_MODE_USER
273 // Macro to get current KPRCB
277 KeGetCurrentPrcb(VOID
)
279 return (struct _KPRCB
*)(ULONG_PTR
)__readfsdword(FIELD_OFFSET(KPCR
, Prcb
));
283 // FN/FX (FPU) Save Area Structures
285 typedef struct _FNSAVE_FORMAT
294 UCHAR RegisterArea
[80];
295 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
297 typedef struct _FXSAVE_FORMAT
309 UCHAR RegisterArea
[128];
310 UCHAR Reserved3
[128];
311 UCHAR Reserved4
[224];
312 UCHAR Align16Byte
[8];
313 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
315 typedef struct _FX_SAVE_AREA
319 FNSAVE_FORMAT FnArea
;
320 FXSAVE_FORMAT FxArea
;
324 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
327 // Special Registers Structure (outside of CONTEXT)
329 typedef struct _KSPECIAL_REGISTERS
346 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
349 // Processor State Data
351 typedef struct _KPROCESSOR_STATE
353 CONTEXT ContextFrame
;
354 KSPECIAL_REGISTERS SpecialRegisters
;
355 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
358 // Processor Region Control Block
361 typedef struct _KPRCB
365 struct _KTHREAD
*CurrentThread
;
366 struct _KTHREAD
*NextThread
;
367 struct _KTHREAD
*IdleThread
;
375 KPROCESSOR_STATE ProcessorState
;
376 ULONG KernelReserved
[16];
377 ULONG HalReserved
[16];
378 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
384 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
385 struct _KTHREAD
*NpxThread
;
386 ULONG InterruptCount
;
392 ULONG AdjustDpcThreshold
;
395 UCHAR DebuggerSavedIRQL
;
396 #if (NTDDI_VERSION >= NTDDI_WS03)
398 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
403 ULONG NodeShiftedColor
;
407 struct _KNODE
*ParentNode
;
408 ULONG MultiThreadProcessorSet
;
409 struct _KPRCB
*MultiThreadSetMaster
;
410 #if (NTDDI_VERSION >= NTDDI_WS03)
411 ULONG SecondaryColorMask
;
412 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
418 ULONG ThreadStartCount
[2];
420 ULONG CcFastReadNoWait
;
421 ULONG CcFastReadWait
;
422 ULONG CcFastReadNotPossible
;
423 ULONG CcCopyReadNoWait
;
424 ULONG CcCopyReadWait
;
425 ULONG CcCopyReadNoWaitMiss
;
426 #if (NTDDI_VERSION < NTDDI_LONGHORN)
427 ULONG KeAlignmentFixupCount
;
430 #if (NTDDI_VERSION < NTDDI_LONGHORN)
431 ULONG KeDcacheFlushCount
;
432 ULONG KeExceptionDispatchCount
;
433 ULONG KeFirstLevelTbFills
;
434 ULONG KeFloatingEmulationCount
;
435 ULONG KeIcacheFlushCount
;
436 ULONG KeSecondLevelTbFills
;
439 volatile ULONG IoReadOperationCount
;
440 volatile ULONG IoWriteOperationCount
;
441 volatile ULONG IoOtherOperationCount
;
442 LARGE_INTEGER IoReadTransferCount
;
443 LARGE_INTEGER IoWriteTransferCount
;
444 LARGE_INTEGER IoOtherTransferCount
;
445 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
446 ULONG CcFastMdlReadNoWait
;
447 ULONG CcFastMdlReadWait
;
448 ULONG CcFastMdlReadNotPossible
;
449 ULONG CcMapDataNoWait
;
451 ULONG CcPinMappedDataCount
;
452 ULONG CcPinReadNoWait
;
454 ULONG CcMdlReadNoWait
;
456 ULONG CcLazyWriteHotSpots
;
457 ULONG CcLazyWriteIos
;
458 ULONG CcLazyWritePages
;
461 ULONG CcLostDelayedWrites
;
462 ULONG CcFastReadResourceMiss
;
463 ULONG CcCopyReadWaitMiss
;
464 ULONG CcFastMdlReadResourceMiss
;
465 ULONG CcMapDataNoWaitMiss
;
466 ULONG CcMapDataWaitMiss
;
467 ULONG CcPinReadNoWaitMiss
;
468 ULONG CcPinReadWaitMiss
;
469 ULONG CcMdlReadNoWaitMiss
;
470 ULONG CcMdlReadWaitMiss
;
471 ULONG CcReadAheadIos
;
472 ULONG KeAlignmentFixupCount
;
473 ULONG KeExceptionDispatchCount
;
477 ULONG SpareCounter1
[8];
479 PP_LOOKASIDE_LIST PPLookasideList
[16];
480 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
481 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
482 volatile ULONG PacketBarrier
;
483 volatile ULONG ReverseStall
;
486 volatile PVOID CurrentPacket
[3];
487 volatile ULONG TargetSet
;
488 volatile PKIPI_WORKER WorkerRoutine
;
489 volatile ULONG IpiFrozen
;
491 volatile ULONG RequestSummary
;
492 volatile struct _KPRCB
*SignalDone
;
494 struct _KDPC_DATA DpcData
[2];
496 ULONG MaximumDpcQueueDepth
;
497 ULONG DpcRequestRate
;
498 ULONG MinimumDpcRate
;
499 volatile UCHAR DpcInterruptRequested
;
500 volatile UCHAR DpcThreadRequested
;
501 volatile UCHAR DpcRoutineActive
;
502 volatile UCHAR DpcThreadActive
;
505 volatile ULONG TimerHand
;
506 volatile ULONG TimerRequest
;
509 UCHAR ThreadDpcEnable
;
510 volatile BOOLEAN QuantumEnd
;
512 volatile UCHAR IdleSchedule
;
513 LONG DpcSetEventRequest
;
514 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
524 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
526 UCHAR ClockCheckSlot
;
527 UCHAR ClockPollCycle
;
529 LONG DpcWatchdogPeriod
;
530 LONG DpcWatchDogCount
;
531 LONG ThreadWatchdogPeriod
;
532 LONG ThreadWatchDogCount
;
537 LIST_ENTRY WaitListHead
;
540 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
541 SINGLE_LIST_ENTRY DeferredReadyListHead
;
542 ULONGLONG StartCycles
;
544 ULONGLONG PrcbPad71
[3];
545 LIST_ENTRY DispatcherReadyListHead
[32];
547 LIST_ENTRY DispatcherReadyListHead
[32];
548 SINGLE_LIST_ENTRY DeferredReadyListHead
;
551 PVOID ChainedInterruptList
;
552 LONG LookasideIrpFloat
;
553 volatile LONG MmPageFaultCount
;
554 volatile LONG MmCopyOnWriteCount
;
555 volatile LONG MmTransitionCount
;
556 volatile LONG MmCacheTransitionCount
;
557 volatile LONG MmDemandZeroCount
;
558 volatile LONG MmPageReadCount
;
559 volatile LONG MmPageReadIoCount
;
560 volatile LONG MmCacheReadCount
;
561 volatile LONG MmCacheIoCount
;
562 volatile LONG MmDirtyPagesWriteCount
;
563 volatile LONG MmDirtyWriteIoCount
;
564 volatile LONG MmMappedPagesWriteCount
;
565 volatile LONG MmMappedWriteIoCount
;
566 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
568 ULONG CachedResidentAvailable
;
573 ULONG SpareFields0
[1];
575 CHAR VendorString
[13];
577 UCHAR LogicalProcessorsPerPhysicalProcessor
;
580 LARGE_INTEGER UpdateSignature
;
581 volatile LARGE_INTEGER IsrTime
;
582 LARGE_INTEGER SpareField1
;
583 FX_SAVE_AREA NpxSaveArea
;
584 PROCESSOR_POWER_STATE PowerState
;
585 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
587 KTIMER DpcWatchdogTimer
;
590 SLIST_HEADER InterruptObjectPool
;
591 LARGE_INTEGER HyperCallPagePhysical
;
592 LARGE_INTEGER HyperCallPageVirtual
;
594 CACHE_DESCRIPTOR Cache
[5];
596 ULONG CacheProcessorMask
[5];
597 UCHAR LogicalProcessorsPerCore
;
599 ULONG PackageProcessorSet
;
600 ULONG CoreProcessorSet
;
605 // Processor Control Region
607 typedef struct _KIPCR
614 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
615 PVOID Used_StackBase
;
616 PVOID PerfGlobalGroupMask
;
618 ULONG ContextSwitches
;
619 KAFFINITY SetMemberCopy
;
629 PVOID KdVersionBlock
;
640 ULONG StallScaleFactor
;
644 UCHAR L2CacheAssociativity
;
646 ULONG KernelReserved
[14];
647 ULONG SecondLevelCacheSize
;
648 ULONG HalReserved
[16];
651 ULONG KernelReserved2
[17];
659 typedef struct _KiIoAccessMap
661 UCHAR DirectionMap
[32];
700 KIIO_ACCESS_MAP IoMaps
[1];
701 UCHAR IntDirectionMap
[32];
705 // i386 CPUs don't have exception frames
707 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;