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 INITIAL_STALL_COUNT 0x64
105 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
107 #define KSEG0_BASE 0x80000000
110 // Macro to get current KPRCB
112 #ifndef _REACTOS_ // fixme
113 #define KeGetCurrentPrcb() \
114 (PKPRCB)__readfsdword(KPCR_PRCB);
118 // Trap Frame Definition
120 typedef struct _KTRAP_FRAME
140 ULONG PreviousPreviousMode
;
141 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
157 } KTRAP_FRAME
, *PKTRAP_FRAME
;
160 // LDT Entry Definition
162 #ifndef _LDT_ENTRY_DEFINED
163 #define _LDT_ENTRY_DEFINED
164 typedef struct _LDT_ENTRY
191 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
195 // GDT Entry Definition
197 typedef struct _KGDTENTRY
224 } KGDTENTRY
, *PKGDTENTRY
;
227 // IDT Entry Access Definition
229 typedef struct _KIDT_ACCESS
237 UCHAR SystemSegmentFlag
:1;
243 } KIDT_ACCESS
, *PKIDT_ACCESS
;
246 // IDT Entry Definition
248 typedef struct _KIDTENTRY
253 USHORT ExtendedOffset
;
254 } KIDTENTRY
, *PKIDTENTRY
;
256 #include <pshpack2.h>
257 typedef struct _DESCRIPTOR
262 } KDESCRIPTOR
, *PKDESCRIPTOR
;
265 #ifndef NTOS_MODE_USER
268 // FN/FX (FPU) Save Area Structures
270 typedef struct _FNSAVE_FORMAT
279 UCHAR RegisterArea
[80];
280 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
282 typedef struct _FXSAVE_FORMAT
294 UCHAR RegisterArea
[128];
295 UCHAR Reserved3
[128];
296 UCHAR Reserved4
[224];
297 UCHAR Align16Byte
[8];
298 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
300 typedef struct _FX_SAVE_AREA
304 FNSAVE_FORMAT FnArea
;
305 FXSAVE_FORMAT FxArea
;
309 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
312 // Special Registers Structure (outside of CONTEXT)
314 typedef struct _KSPECIAL_REGISTERS
331 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
334 // Processor State Data
337 typedef struct _KPROCESSOR_STATE
339 CONTEXT ContextFrame
;
340 KSPECIAL_REGISTERS SpecialRegisters
;
341 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
344 // Processor Region Control Block
346 typedef struct _KPRCB
350 struct _KTHREAD
*CurrentThread
;
351 struct _KTHREAD
*NextThread
;
352 struct _KTHREAD
*IdleThread
;
360 KPROCESSOR_STATE ProcessorState
;
361 ULONG KernelReserved
[16];
362 ULONG HalReserved
[16];
363 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
369 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
370 struct _KTHREAD
*NpxThread
;
371 ULONG InterruptCount
;
377 ULONG AdjustDpcThreshold
;
380 UCHAR DebuggerSavedIRQL
;
381 #if (NTDDI_VERSION >= NTDDI_WS03)
383 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
388 ULONG NodeShiftedColor
;
392 struct _KNODE
*ParentNode
;
393 ULONG MultiThreadProcessorSet
;
394 struct _KPRCB
*MultiThreadSetMaster
;
395 #if (NTDDI_VERSION >= NTDDI_WS03)
396 ULONG SecondaryColorMask
;
397 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
403 ULONG ThreadStartCount
[2];
405 ULONG CcFastReadNoWait
;
406 ULONG CcFastReadWait
;
407 ULONG CcFastReadNotPossible
;
408 ULONG CcCopyReadNoWait
;
409 ULONG CcCopyReadWait
;
410 ULONG CcCopyReadNoWaitMiss
;
411 #if (NTDDI_VERSION < NTDDI_LONGHORN)
412 ULONG KeAlignmentFixupCount
;
415 #if (NTDDI_VERSION < NTDDI_LONGHORN)
416 ULONG KeDcacheFlushCount
;
417 ULONG KeExceptionDispatchCount
;
418 ULONG KeFirstLevelTbFills
;
419 ULONG KeFloatingEmulationCount
;
420 ULONG KeIcacheFlushCount
;
421 ULONG KeSecondLevelTbFills
;
424 volatile ULONG IoReadOperationCount
;
425 volatile ULONG IoWriteOperationCount
;
426 volatile ULONG IoOtherOperationCount
;
427 LARGE_INTEGER IoReadTransferCount
;
428 LARGE_INTEGER IoWriteTransferCount
;
429 LARGE_INTEGER IoOtherTransferCount
;
430 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
431 ULONG CcFastMdlReadNoWait
;
432 ULONG CcFastMdlReadWait
;
433 ULONG CcFastMdlReadNotPossible
;
434 ULONG CcMapDataNoWait
;
436 ULONG CcPinMappedDataCount
;
437 ULONG CcPinReadNoWait
;
439 ULONG CcMdlReadNoWait
;
441 ULONG CcLazyWriteHotSpots
;
442 ULONG CcLazyWriteIos
;
443 ULONG CcLazyWritePages
;
446 ULONG CcLostDelayedWrites
;
447 ULONG CcFastReadResourceMiss
;
448 ULONG CcCopyReadWaitMiss
;
449 ULONG CcFastMdlReadResourceMiss
;
450 ULONG CcMapDataNoWaitMiss
;
451 ULONG CcMapDataWaitMiss
;
452 ULONG CcPinReadNoWaitMiss
;
453 ULONG CcPinReadWaitMiss
;
454 ULONG CcMdlReadNoWaitMiss
;
455 ULONG CcMdlReadWaitMiss
;
456 ULONG CcReadAheadIos
;
457 ULONG KeAlignmentFixupCount
;
458 ULONG KeExceptionDispatchCount
;
462 ULONG SpareCounter1
[8];
464 PP_LOOKASIDE_LIST PPLookasideList
[16];
465 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
466 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
467 volatile ULONG PacketBarrier
;
468 volatile ULONG ReverseStall
;
471 volatile PVOID CurrentPacket
[3];
472 volatile ULONG TargetSet
;
473 volatile PKIPI_WORKER WorkerRoutine
;
474 volatile ULONG IpiFrozen
;
476 volatile ULONG RequestSummary
;
477 volatile struct _KPRCB
*SignalDone
;
479 struct _KDPC_DATA DpcData
[2];
481 ULONG MaximumDpcQueueDepth
;
482 ULONG DpcRequestRate
;
483 ULONG MinimumDpcRate
;
484 volatile UCHAR DpcInterruptRequested
;
485 volatile UCHAR DpcThreadRequested
;
486 volatile UCHAR DpcRoutineActive
;
487 volatile UCHAR DpcThreadActive
;
490 volatile ULONG TimerHand
;
491 volatile ULONG TimerRequest
;
494 UCHAR ThreadDpcEnable
;
495 volatile BOOLEAN QuantumEnd
;
497 volatile UCHAR IdleSchedule
;
498 LONG DpcSetEventRequest
;
499 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
509 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
511 UCHAR ClockCheckSlot
;
512 UCHAR ClockPollCycle
;
514 LONG DpcWatchdogPeriod
;
515 LONG DpcWatchDogCount
;
516 LONG ThreadWatchdogPeriod
;
517 LONG ThreadWatchDogCount
;
522 LIST_ENTRY WaitListHead
;
525 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
526 SINGLE_LIST_ENTRY DeferredReadyListHead
;
527 ULONGLONG StartCycles
;
529 ULONGLONG PrcbPad71
[3];
530 LIST_ENTRY DispatcherReadyListHead
[32];
532 LIST_ENTRY DispatcherReadyListHead
[32];
533 SINGLE_LIST_ENTRY DeferredReadyListHead
;
536 PVOID ChainedInterruptList
;
537 LONG LookasideIrpFloat
;
538 volatile LONG MmPageFaultCount
;
539 volatile LONG MmCopyOnWriteCount
;
540 volatile LONG MmTransitionCount
;
541 volatile LONG MmCacheTransitionCount
;
542 volatile LONG MmDemandZeroCount
;
543 volatile LONG MmPageReadCount
;
544 volatile LONG MmPageReadIoCount
;
545 volatile LONG MmCacheReadCount
;
546 volatile LONG MmCacheIoCount
;
547 volatile LONG MmDirtyPagesWriteCount
;
548 volatile LONG MmDirtyWriteIoCount
;
549 volatile LONG MmMappedPagesWriteCount
;
550 volatile LONG MmMappedWriteIoCount
;
551 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
553 ULONG CachedResidentAvailable
;
558 ULONG SpareFields0
[1];
560 CHAR VendorString
[13];
562 UCHAR LogicalProcessorsPerPhysicalProcessor
;
565 LARGE_INTEGER UpdateSignature
;
566 volatile LARGE_INTEGER IsrTime
;
567 LARGE_INTEGER SpareField1
;
568 FX_SAVE_AREA NpxSaveArea
;
569 PROCESSOR_POWER_STATE PowerState
;
570 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
572 KTIMER DpcWatchdogTimer
;
575 SLIST_HEADER InterruptObjectPool
;
576 LARGE_INTEGER HyperCallPagePhysical
;
577 LARGE_INTEGER HyperCallPageVirtual
;
579 CACHE_DESCRIPTOR Cache
[5];
581 ULONG CacheProcessorMask
[5];
582 UCHAR LogicalProcessorsPerCore
;
584 ULONG PackageProcessorSet
;
585 ULONG CoreProcessorSet
;
590 // Processor Control Region
592 typedef struct _KIPCR
599 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
600 PVOID Used_StackBase
;
601 PVOID PerfGlobalGroupMask
;
603 ULONG ContextSwitches
;
604 KAFFINITY SetMemberCopy
;
614 PVOID KdVersionBlock
;
625 ULONG StallScaleFactor
;
629 UCHAR L2CacheAssociativity
;
631 ULONG KernelReserved
[14];
632 ULONG SecondLevelCacheSize
;
633 ULONG HalReserved
[16];
636 ULONG KernelReserved2
[17];
644 typedef struct _KiIoAccessMap
646 UCHAR DirectionMap
[32];
650 #include <pshpack1.h>
678 KIIO_ACCESS_MAP IoMaps
[1];
679 UCHAR IntDirectionMap
[32];
684 // i386 CPUs don't have exception frames
686 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;