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 EFLAG_SIGN 0x8000
87 #define EFLAG_ZERO 0x4000
95 #define IPI_PACKET_READY 8
96 #define IPI_SYNCH_REQUEST 16
99 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
101 #define KSEG0_BASE 0x80000000
104 // Macro to get current KPRCB
106 #ifndef _REACTOS_ // fixme
107 #define KeGetCurrentPrcb() \
108 (PKPRCB)__readfsdword(KPCR_PRCB);
112 // Trap Frame Definition
114 typedef struct _KTRAP_FRAME
134 ULONG PreviousPreviousMode
;
135 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
151 } KTRAP_FRAME
, *PKTRAP_FRAME
;
154 // LDT Entry Definition
156 #ifndef _LDT_ENTRY_DEFINED
157 #define _LDT_ENTRY_DEFINED
158 typedef struct _LDT_ENTRY
185 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
189 // GDT Entry Definition
191 typedef struct _KGDTENTRY
218 } KGDTENTRY
, *PKGDTENTRY
;
221 // IDT Entry Access Definition
223 typedef struct _KIDT_ACCESS
231 UCHAR SystemSegmentFlag
:1;
237 } KIDT_ACCESS
, *PKIDT_ACCESS
;
240 // IDT Entry Definition
242 typedef struct _KIDTENTRY
247 USHORT ExtendedOffset
;
248 } KIDTENTRY
, *PKIDTENTRY
;
250 #include <pshpack2.h>
251 typedef struct _DESCRIPTOR
256 } KDESCRIPTOR
, *PKDESCRIPTOR
;
259 #ifndef NTOS_MODE_USER
262 // FN/FX (FPU) Save Area Structures
264 typedef struct _FNSAVE_FORMAT
273 UCHAR RegisterArea
[80];
274 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
276 typedef struct _FXSAVE_FORMAT
288 UCHAR RegisterArea
[128];
289 UCHAR Reserved3
[128];
290 UCHAR Reserved4
[224];
291 UCHAR Align16Byte
[8];
292 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
294 typedef struct _FX_SAVE_AREA
298 FNSAVE_FORMAT FnArea
;
299 FXSAVE_FORMAT FxArea
;
303 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
306 // Special Registers Structure (outside of CONTEXT)
308 typedef struct _KSPECIAL_REGISTERS
325 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
328 // Processor State Data
331 typedef struct _KPROCESSOR_STATE
333 CONTEXT ContextFrame
;
334 KSPECIAL_REGISTERS SpecialRegisters
;
335 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
338 // Processor Region Control Block
340 typedef struct _KPRCB
344 struct _KTHREAD
*CurrentThread
;
345 struct _KTHREAD
*NextThread
;
346 struct _KTHREAD
*IdleThread
;
354 KPROCESSOR_STATE ProcessorState
;
355 ULONG KernelReserved
[16];
356 ULONG HalReserved
[16];
357 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
364 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
365 struct _KTHREAD
*NpxThread
;
366 ULONG InterruptCount
;
372 ULONG AdjustDpcThreshold
;
375 UCHAR DebuggerSavedIRQL
;
376 #if (NTDDI_VERSION >= NTDDI_WS03)
378 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
383 ULONG NodeShiftedColor
;
387 struct _KNODE
*ParentNode
;
388 ULONG MultiThreadProcessorSet
;
389 struct _KPRCB
*MultiThreadSetMaster
;
390 #if (NTDDI_VERSION >= NTDDI_WS03)
391 ULONG SecondaryColorMask
;
392 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
398 ULONG ThreadStartCount
[2];
400 ULONG CcFastReadNoWait
;
401 ULONG CcFastReadWait
;
402 ULONG CcFastReadNotPossible
;
403 ULONG CcCopyReadNoWait
;
404 ULONG CcCopyReadWait
;
405 ULONG CcCopyReadNoWaitMiss
;
406 #if (NTDDI_VERSION < NTDDI_LONGHORN)
407 ULONG KeAlignmentFixupCount
;
410 #if (NTDDI_VERSION < NTDDI_LONGHORN)
411 ULONG KeContextSwitches
;
412 ULONG KeDcacheFlushCount
;
413 ULONG KeExceptionDispatchCount
;
414 ULONG KeFirstLevelTbFills
;
415 ULONG KeFloatingEmulationCount
;
416 ULONG KeIcacheFlushCount
;
417 ULONG KeSecondLevelTbFills
;
420 ULONG IoReadOperationCount
;
421 ULONG IoWriteOperationCount
;
422 ULONG IoOtherOperationCount
;
423 LARGE_INTEGER IoReadTransferCount
;
424 LARGE_INTEGER IoWriteTransferCount
;
425 LARGE_INTEGER IoOtherTransferCount
;
426 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
427 ULONG CcFastMdlReadNoWait
;
428 ULONG CcFastMdlReadWait
;
429 ULONG CcFastMdlReadNotPossible
;
430 ULONG CcMapDataNoWait
;
432 ULONG CcPinMappedDataCount
;
433 ULONG CcPinReadNoWait
;
435 ULONG CcMdlReadNoWait
;
437 ULONG CcLazyWriteHotSpots
;
438 ULONG CcLazyWriteIos
;
439 ULONG CcLazyWritePages
;
442 ULONG CcLostDelayedWrites
;
443 ULONG CcFastReadResourceMiss
;
444 ULONG CcCopyReadWaitMiss
;
445 ULONG CcFastMdlReadResourceMiss
;
446 ULONG CcMapDataNoWaitMiss
;
447 ULONG CcMapDataWaitMiss
;
448 ULONG CcPinReadNoWaitMiss
;
449 ULONG CcPinReadWaitMiss
;
450 ULONG CcMdlReadNoWaitMiss
;
451 ULONG CcMdlReadWaitMiss
;
452 ULONG CcReadAheadIos
;
453 ULONG KeAlignmentFixupCount
;
454 ULONG KeExceptionDispatchCount
;
458 ULONG SpareCounter1
[8];
460 PP_LOOKASIDE_LIST PPLookasideList
[16];
461 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
462 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
467 PVOID CurrentPacket
[3];
469 PKIPI_WORKER WorkerRoutine
;
472 ULONG RequestSummary
;
473 struct _KPRCB
*SignalDone
;
475 struct _KDPC_DATA DpcData
[2];
477 ULONG MaximumDpcQueueDepth
;
478 ULONG DpcRequestRate
;
479 ULONG MinimumDpcRate
;
480 UCHAR DpcInterruptRequested
;
481 UCHAR DpcThreadRequested
;
482 UCHAR DpcRoutineActive
;
483 UCHAR DpcThreadActive
;
490 UCHAR ThreadDpcEnable
;
494 LONG DpcSetEventRequest
;
495 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
505 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
507 UCHAR ClockCheckSlot
;
508 UCHAR ClockPollCycle
;
510 LONG DpcWatchdogPeriod
;
511 LONG DpcWatchDogCount
;
512 LONG ThreadWatchdogPeriod
;
513 LONG ThreadWatchDogCount
;
518 LIST_ENTRY WaitListHead
;
521 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
522 SINGLE_LIST_ENTRY DeferredReadyListHead
;
523 ULONGLONG StartCycles
;
525 ULONGLONG PrcbPad71
[3];
526 LIST_ENTRY DispatcherReadyListHead
[32];
528 LIST_ENTRY DispatcherReadyListHead
[32];
529 SINGLE_LIST_ENTRY DeferredReadyListHead
;
532 PVOID ChainedInterruptList
;
533 LONG LookasideIrpFloat
;
534 LONG MmPageFaultCount
;
535 LONG MmCopyOnWriteCount
;
536 LONG MmTransitionCount
;
537 LONG MmCacheTransitionCount
;
538 LONG MmDemandZeroCount
;
539 LONG MmPageReadCount
;
540 LONG MmPageReadIoCount
;
541 LONG MmCacheReadCount
;
543 LONG MmDirtyPagesWriteCount
;
544 LONG MmDirtyWriteIoCount
;
545 LONG MmMappedPagesWriteCount
;
546 LONG MmMappedWriteIoCount
;
547 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
549 ULONG CachedResidentAvailable
;
554 ULONG SpareFields0
[1];
556 CHAR VendorString
[13];
558 UCHAR LogicalProcessorsPerPhysicalProcessor
;
561 LARGE_INTEGER UpdateSignature
;
562 LARGE_INTEGER IsrTime
;
563 LARGE_INTEGER SpareField1
;
564 FX_SAVE_AREA NpxSaveArea
;
565 PROCESSOR_POWER_STATE PowerState
;
566 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
568 KTIMER DpcWatchdogTimer
;
571 SLIST_HEADER InterruptObjectPool
;
572 LARGE_INTEGER HyperCallPagePhysical
;
573 LARGE_INTEGER HyperCallPageVirtual
;
575 CACHE_DESCRIPTOR Cache
[5];
577 ULONG CacheProcessorMask
[5];
578 UCHAR LogicalProcessorsPerCore
;
580 ULONG PackageProcessorSet
;
581 ULONG CoreProcessorSet
;
586 // Processor Control Region
588 typedef struct _KIPCR
595 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
596 PVOID Used_StackBase
;
597 PVOID PerfGlobalGroupMask
;
599 ULONG ContextSwitches
;
600 KAFFINITY SetMemberCopy
;
610 PVOID KdVersionBlock
;
621 ULONG StallScaleFactor
;
625 UCHAR L2CacheAssociativity
;
627 ULONG KernelReserved
[14];
628 ULONG SecondLevelCacheSize
;
629 ULONG HalReserved
[16];
632 ULONG KernelReserved2
[17];
640 typedef struct _KiIoAccessMap
642 UCHAR DirectionMap
[32];
646 #include <pshpack1.h>
674 KIIO_ACCESS_MAP IoMaps
[1];
675 UCHAR IntDirectionMap
[32];
680 // i386 CPUs don't have exception frames
682 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;