3 Copyright (c) Alex Ionescu. All rights reserved.
11 i386 Type definitions for the Kernel services.
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
19 #ifndef _I386_KETYPES_H
20 #define _I386_KETYPES_H
27 // X86 80386 Segment Types
29 #define I386_TASK_GATE 0x5
31 #define I386_ACTIVE_TSS 0xB
32 #define I386_CALL_GATE 0xC
33 #define I386_INTERRUPT_GATE 0xE
34 #define I386_TRAP_GATE 0xF
42 #define IPI_PACKET_READY 4
43 #define IPI_SYNCH_REQUEST 10
46 // FN/FX (FPU) Save Area Structures
48 typedef struct _FNSAVE_FORMAT
57 UCHAR RegisterArea
[80];
58 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
60 typedef struct _FXSAVE_FORMAT
72 UCHAR RegisterArea
[128];
76 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
78 typedef struct _FX_SAVE_AREA
87 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
90 // Trap Frame Definition
92 typedef struct _KTRAP_FRAME
112 ULONG PreviousPreviousMode
;
113 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
129 } KTRAP_FRAME
, *PKTRAP_FRAME
;
132 // LDT Entry Definition
134 typedef struct _LDT_ENTRY
155 ULONG Reserved_0
: 1;
156 ULONG Default_Big
: 1;
157 ULONG Granularity
: 1;
161 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
164 // GDT Entry Definition
166 typedef struct _KGDTENTRY
187 ULONG Reserved_0
: 1;
188 ULONG Default_Big
: 1;
189 ULONG Granularity
: 1;
193 } KGDTENTRY
, *PKGDTENTRY
;
196 // IDT Entry Access Definition
198 typedef struct _KIDT_ACCESS
206 UCHAR SystemSegmentFlag
:1;
212 } KIDT_ACCESS
, *PKIDT_ACCESS
;
215 // IDT Entry Definition
217 typedef struct _KIDTENTRY
222 USHORT ExtendedOffset
;
223 } KIDTENTRY
, *PKIDTENTRY
;
226 // Page Table Entry Definition
228 typedef struct _HARDWARE_PTE_X86
233 ULONG WriteThrough
: 1;
234 ULONG CacheDisable
: 1;
239 ULONG CopyOnWrite
: 1;
242 ULONG PageFrameNumber
: 20;
243 } HARDWARE_PTE_X86
, *PHARDWARE_PTE_X86
;
245 typedef struct _DESCRIPTOR
250 } KDESCRIPTOR
, *PKDESCRIPTOR
;
253 // Special Registers Structure (outside of CONTEXT)
255 typedef struct _KSPECIAL_REGISTERS
272 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
275 // Processor State Data
278 typedef struct _KPROCESSOR_STATE
280 PCONTEXT ContextFrame
;
281 KSPECIAL_REGISTERS SpecialRegisters
;
285 // Processor Region Control Block
287 typedef struct _KPRCB
291 struct _KTHREAD
*CurrentThread
;
292 struct _KTHREAD
*NextThread
;
293 struct _KTHREAD
*IdleThread
;
301 KPROCESSOR_STATE ProcessorState
;
302 ULONG KernelReserved
[16];
303 ULONG HalReserved
[16];
305 PVOID LockQueue
[33]; // Used for Queued Spinlocks
306 struct _KTHREAD
*NpxThread
;
307 ULONG InterruptCount
;
313 ULONG AdjustDpcThreshold
;
316 UCHAR DebuggerSavedIRQL
;
318 struct _KNODE
*ParentNode
;
319 ULONG MultiThreadProcessorSet
;
320 struct _KPRCB
*MultiThreadSetMaster
;
321 ULONG ThreadStartCount
[2];
322 ULONG CcFastReadNoWait
;
323 ULONG CcFastReadWait
;
324 ULONG CcFastReadNotPossible
;
325 ULONG CcCopyReadNoWait
;
326 ULONG CcCopyReadWait
;
327 ULONG CcCopyReadNoWaitMiss
;
328 ULONG KeAlignmentFixupCount
;
329 ULONG KeContextSwitches
;
330 ULONG KeDcacheFlushCount
;
331 ULONG KeExceptionDispatchCount
;
332 ULONG KeFirstLevelTbFills
;
333 ULONG KeFloatingEmulationCount
;
334 ULONG KeIcacheFlushCount
;
335 ULONG KeSecondLevelTbFills
;
337 ULONG IoReadOperationCount
;
338 ULONG IoWriteOperationCount
;
339 ULONG IoOtherOperationCount
;
340 LARGE_INTEGER IoReadTransferCount
;
341 LARGE_INTEGER IoWriteTransferCount
;
342 LARGE_INTEGER IoOtherTransferCount
;
343 ULONG SpareCounter1
[8];
344 PP_LOOKASIDE_LIST PPLookasideList
[16];
345 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
346 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
351 PVOID CurrentPacket
[3];
353 ULONG_PTR WorkerRoutine
;
356 ULONG RequestSummary
;
357 struct _KPRCB
*SignalDone
;
359 struct _KDPC_DATA DpcData
[2];
361 ULONG MaximumDpcQueueDepth
;
362 ULONG DpcRequestRate
;
363 ULONG MinimumDpcRate
;
364 UCHAR DpcInterruptRequested
;
365 UCHAR DpcThreadRequested
;
366 UCHAR DpcRoutineActive
;
367 UCHAR DpcThreadActive
;
373 struct _KEVENT
*DpcEvent
;
374 UCHAR ThreadDpcEnable
;
378 ULONG DpcSetEventRequest
;
381 struct _KDPC
* CallDpc
;
383 LIST_ENTRY WaitListHead
;
385 ULONG SelectNextLast
;
386 LIST_ENTRY DispatcherReadyListHead
[32];
387 SINGLE_LIST_ENTRY DeferredReadyListHead
;
389 PVOID ChainedInterruptList
;
390 LONG LookasideIrpFloat
;
391 LONG MmPageFaultCount
;
392 LONG MmCopyOnWriteCount
;
393 LONG MmTransitionCount
;
394 LONG MmCacheTransitionCount
;
395 LONG MmDemandZeroCount
;
396 LONG MmPageReadCount
;
397 LONG MmPageReadIoCount
;
398 LONG MmCacheReadCount
;
400 LONG MmDirtyPagesWriteCount
;
401 LONG MmDirtyWriteIoCount
;
402 LONG MmMappedPagesWriteCount
;
403 LONG MmMappedWriteIoCount
;
404 ULONG SpareFields0
[1];
405 CHAR VendorString
[13];
407 UCHAR LogicalProcessorsPerPhysicalProcessor
;
410 LARGE_INTEGER UpdateSignature
;
411 LARGE_INTEGER IsrTime
;
412 LARGE_INTEGER SpareField1
;
413 FX_SAVE_AREA NpxSaveArea
;
414 PROCESSOR_POWER_STATE PowerState
;
418 // Processor Control Region
420 typedef struct _KIPCR
427 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
428 PVOID Used_StackBase
;
429 PVOID PerfGlobalGroupMask
;
431 ULONG ContextSwitches
;
432 KAFFINITY SetMemberCopy
;
436 struct _KPCR
*Self
; /* 1C */
437 struct _KPRCB
*Prcb
; /* 20 */
440 ULONG IrrActive
; /* 2C */
442 PVOID KdVersionBlock
; /* 34 */
443 PKIDTENTRY IDT
; /* 38 */
445 PUSHORT GDT
; /* 3C */
447 PKGDTENTRY GDT
; /* 3C */
449 struct _KTSS
*TSS
; /* 40 */
450 USHORT MajorVersion
; /* 44 */
451 USHORT MinorVersion
; /* 46 */
452 KAFFINITY SetMember
; /* 48 */
453 ULONG StallScaleFactor
; /* 4C */
454 UCHAR SparedUnused
; /* 50 */
455 UCHAR Number
; /* 51 */
456 UCHAR Reserved
; /* 52 */
457 UCHAR L2CacheAssociativity
; /* 53 */
458 ULONG VdmAlert
; /* 54 */
459 ULONG KernelReserved
[14]; /* 58 */
460 ULONG L2CacheSize
; /* 90 */
461 ULONG HalReserved
[16]; /* 94 */
462 ULONG InterruptMode
; /* D4 */
463 UCHAR KernelReserved2
[0x48]; /* D8 */
464 KPRCB PrcbData
; /* 120 */
471 typedef struct _KiIoAccessMap
473 UCHAR DirectionMap
[32];
477 #include <pshpack1.h>
505 KIIO_ACCESS_MAP IoMaps
[1];
506 UCHAR IntDirectionMap
[32];
511 // i386 CPUs don't have exception frames
513 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;