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
30 #define I386_ACTIVE_TSS 0xB
31 #define I386_CALL_GATE 0xC
32 #define I386_INTERRUPT_GATE 0xE
33 #define I386_TRAP_GATE 0xF
41 #define IPI_PACKET_READY 4
42 #define IPI_SYNCH_REQUEST 10
45 // FN/FX (FPU) Save Area Structures
47 typedef struct _FNSAVE_FORMAT
56 UCHAR RegisterArea
[80];
57 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
59 typedef struct _FXSAVE_FORMAT
71 UCHAR RegisterArea
[128];
75 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
77 typedef struct _FX_SAVE_AREA
86 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
89 // FIXME: Trap Frame Definition
91 typedef struct _KTRAP_FRAME
111 ULONG PreviousPreviousMode
;
112 struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
128 } KTRAP_FRAME
, *PKTRAP_FRAME
;
131 // LDT Entry Definition
133 typedef struct _LDT_ENTRY
154 ULONG Reserved_0
: 1;
155 ULONG Default_Big
: 1;
156 ULONG Granularity
: 1;
160 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
163 // GDT Entry Definition
165 typedef struct _KGDTENTRY
186 ULONG Reserved_0
: 1;
187 ULONG Default_Big
: 1;
188 ULONG Granularity
: 1;
192 } KGDTENTRY
, *PKGDTENTRY
;
195 // IDT Entry Access Definition
197 typedef struct _KIDT_ACCESS
205 UCHAR SystemSegmentFlag
:1;
211 } KIDT_ACCESS
, *PKIDT_ACCESS
;
214 // IDT Entry Definition
216 typedef struct _KIDTENTRY
221 USHORT ExtendedOffset
;
222 } KIDTENTRY
, *PKIDTENTRY
;
225 // Page Table Entry Definition
227 typedef struct _HARDWARE_PTE_X86
232 ULONG WriteThrough
: 1;
233 ULONG CacheDisable
: 1;
238 ULONG CopyOnWrite
: 1;
241 ULONG PageFrameNumber
: 20;
242 } HARDWARE_PTE_X86
, *PHARDWARE_PTE_X86
;
244 typedef struct _DESCRIPTOR
249 } KDESCRIPTOR
, *PKDESCRIPTOR
;
252 // Special Registers Structure (outside of CONTEXT)
254 typedef struct _KSPECIAL_REGISTERS
271 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
274 // Processor State Data
277 typedef struct _KPROCESSOR_STATE
279 PCONTEXT ContextFrame
;
280 KSPECIAL_REGISTERS SpecialRegisters
;
284 // Processor Region Control Block
286 typedef struct _KPRCB
290 struct _KTHREAD
*CurrentThread
;
291 struct _KTHREAD
*NextThread
;
292 struct _KTHREAD
*IdleThread
;
300 KPROCESSOR_STATE ProcessorState
;
301 ULONG KernelReserved
[16];
302 ULONG HalReserved
[16];
304 PVOID LockQueue
[33]; // Used for Queued Spinlocks
305 struct _KTHREAD
*NpxThread
;
306 ULONG InterruptCount
;
312 ULONG AdjustDpcThreshold
;
315 UCHAR DebuggerSavedIRQL
;
317 struct _KNODE
*ParentNode
;
318 ULONG MultiThreadProcessorSet
;
319 struct _KPRCB
*MultiThreadSetMaster
;
320 ULONG ThreadStartCount
[2];
321 ULONG CcFastReadNoWait
;
322 ULONG CcFastReadWait
;
323 ULONG CcFastReadNotPossible
;
324 ULONG CcCopyReadNoWait
;
325 ULONG CcCopyReadWait
;
326 ULONG CcCopyReadNoWaitMiss
;
327 ULONG KeAlignmentFixupCount
;
328 ULONG KeContextSwitches
;
329 ULONG KeDcacheFlushCount
;
330 ULONG KeExceptionDispatchCount
;
331 ULONG KeFirstLevelTbFills
;
332 ULONG KeFloatingEmulationCount
;
333 ULONG KeIcacheFlushCount
;
334 ULONG KeSecondLevelTbFills
;
336 ULONG IoReadOperationCount
;
337 ULONG IoWriteOperationCount
;
338 ULONG IoOtherOperationCount
;
339 LARGE_INTEGER IoReadTransferCount
;
340 LARGE_INTEGER IoWriteTransferCount
;
341 LARGE_INTEGER IoOtherTransferCount
;
342 ULONG SpareCounter1
[8];
343 PP_LOOKASIDE_LIST PPLookasideList
[16];
344 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
345 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
350 PVOID CurrentPacket
[3];
352 ULONG_PTR WorkerRoutine
;
355 ULONG RequestSummary
;
356 struct _KPRCB
*SignalDone
;
358 struct _KDPC_DATA DpcData
[2];
360 ULONG MaximumDpcQueueDepth
;
361 ULONG DpcRequestRate
;
362 ULONG MinimumDpcRate
;
363 UCHAR DpcInterruptRequested
;
364 UCHAR DpcThreadRequested
;
365 UCHAR DpcRoutineActive
;
366 UCHAR DpcThreadActive
;
372 struct _KEVENT
*DpcEvent
;
373 UCHAR ThreadDpcEnable
;
377 ULONG DpcSetEventRequest
;
380 struct _KDPC
* CallDpc
;
382 LIST_ENTRY WaitListHead
;
384 ULONG SelectNextLast
;
385 LIST_ENTRY DispatcherReadyListHead
[32];
386 SINGLE_LIST_ENTRY DeferredReadyListHead
;
388 PVOID ChainedInterruptList
;
389 LONG LookasideIrpFloat
;
390 LONG MmPageFaultCount
;
391 LONG MmCopyOnWriteCount
;
392 LONG MmTransitionCount
;
393 LONG MmCacheTransitionCount
;
394 LONG MmDemandZeroCount
;
395 LONG MmPageReadCount
;
396 LONG MmPageReadIoCount
;
397 LONG MmCacheReadCount
;
399 LONG MmDirtyPagesWriteCount
;
400 LONG MmDirtyWriteIoCount
;
401 LONG MmMappedPagesWriteCount
;
402 LONG MmMappedWriteIoCount
;
403 ULONG SpareFields0
[1];
404 CHAR VendorString
[13];
406 UCHAR LogicalProcessorsPerPhysicalProcessor
;
409 LARGE_INTEGER UpdateSignature
;
410 LARGE_INTEGER IsrTime
;
411 LARGE_INTEGER SpareField1
;
412 FX_SAVE_AREA NpxSaveArea
;
413 PROCESSOR_POWER_STATE PowerState
;
417 // Processor Control Region
419 typedef struct _KIPCR
426 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
427 PVOID Used_StackBase
;
428 PVOID PerfGlobalGroupMask
;
430 ULONG ContextSwitches
;
431 KAFFINITY SetMemberCopy
;
435 struct _KPCR
*Self
; /* 1C */
436 struct _KPRCB
*Prcb
; /* 20 */
439 ULONG IrrActive
; /* 2C */
441 PVOID KdVersionBlock
; /* 34 */
442 PUSHORT IDT
; /* 38 */
443 PUSHORT GDT
; /* 3C */
444 struct _KTSS
*TSS
; /* 40 */
445 USHORT MajorVersion
; /* 44 */
446 USHORT MinorVersion
; /* 46 */
447 KAFFINITY SetMember
; /* 48 */
448 ULONG StallScaleFactor
; /* 4C */
449 UCHAR SparedUnused
; /* 50 */
450 UCHAR Number
; /* 51 */
451 UCHAR Reserved
; /* 52 */
452 UCHAR L2CacheAssociativity
; /* 53 */
453 ULONG VdmAlert
; /* 54 */
454 ULONG KernelReserved
[14]; /* 58 */
455 ULONG L2CacheSize
; /* 90 */
456 ULONG HalReserved
[16]; /* 94 */
457 ULONG InterruptMode
; /* D4 */
458 UCHAR KernelReserved2
[0x48]; /* D8 */
459 KPRCB PrcbData
; /* 120 */
466 typedef struct _KiIoAccessMap
468 UCHAR DirectionMap
[32];
472 #include <pshpack1.h>
500 KIIO_ACCESS_MAP IoMaps
[1];
501 UCHAR IntDirectionMap
[32];
506 // i386 CPUs don't have exception frames
508 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;