3 Copyright (c) Alex Ionescu. All rights reserved.
4 Copyright (c) Timo Kreuzer. All rights reserved.
12 amd64 Type definitions for the Kernel services.
16 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
17 Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 30-Jul-2008
21 #ifndef _AMD64_KETYPES_H
22 #define _AMD64_KETYPES_H
29 // KPCR Access for non-IA64 builds
31 //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
32 //#define PCR ((volatile KPCR * const)K0IPCR)
34 //#if defined(CONFIG_SMP) || defined(NT_BUILD)
36 //#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
42 #define MACHINE_TYPE_ISA 0x0000
43 #define MACHINE_TYPE_EISA 0x0001
44 #define MACHINE_TYPE_MCA 0x0002
47 // X86 80386 Segment Types
49 #define I386_TASK_GATE 0x5
51 #define I386_ACTIVE_TSS 0xB
52 #define I386_CALL_GATE 0xC
53 #define I386_INTERRUPT_GATE 0xE
54 #define I386_TRAP_GATE 0xF
59 #define RPL_MASK 0x0003
60 #define MODE_MASK 0x0001
61 #define KGDT_R0_CODE 0x8
62 #define KGDT_R0_DATA 0x10
63 #define KGDT_R3_CODE 0x18
64 #define KGDT_R3_DATA 0x20
66 #define KGDT_R0_PCR 0x30
67 #define KGDT_R3_TEB 0x38
69 #define KGDT_DF_TSS 0x50
70 #define KGDT_NMI_TSS 0x58
83 #define CR4_FXSR 0x200
84 #define CR4_XMMEXCPT 0x400
89 #define EFLAGS_CF 0x01L
90 #define EFLAGS_ZF 0x40L
91 #define EFLAGS_TF 0x100L
92 #define EFLAGS_INTERRUPT_MASK 0x200L
93 #define EFLAGS_DF 0x400L
94 #define EFLAGS_NESTED_TASK 0x4000L
95 #define EFLAGS_V86_MASK 0x20000
96 #define EFLAGS_ALIGN_CHECK 0x40000
97 #define EFLAGS_VIF 0x80000
98 #define EFLAGS_VIP 0x100000
99 #define EFLAGS_USER_SANITIZE 0x3F4DD7
100 #define EFLAG_SIGN 0x8000
101 #define EFLAG_ZERO 0x4000
109 #define IPI_PACKET_READY 8
110 #define IPI_SYNCH_REQUEST 16
115 #define PRCB_MAJOR_VERSION 1
116 #define PRCB_BUILD_DEBUG 1
117 #define PRCB_BUILD_UNIPROCESSOR 2
122 #define INITIAL_STALL_COUNT 0x64
127 #define IO_ACCESS_MAP_NONE 0
128 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
129 #define KiComputeIopmOffset(MapNumber) \
130 (MapNumber == IO_ACCESS_MAP_NONE) ? \
131 (USHORT)(sizeof(KTSS)) : \
132 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
135 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
137 #define KSEG0_BASE 0xfffff80000000000ULL
140 // Synchronization-level IRQL
143 #define SYNCH_LEVEL DISPATCH_LEVEL
145 #define SYNCH_LEVEL (IPI_LEVEL - 1)
149 // Trap Frame Definition
151 typedef struct _KTRAP_FRAME
171 ULONG PreviousPreviousMode
;
172 struct _EXCEPTION_REGISTRATION_RECORD FAR
*ExceptionList
;
188 } KTRAP_FRAME
, *PKTRAP_FRAME
;
191 // LDT Entry Definition
193 #ifndef _LDT_ENTRY_DEFINED
194 #define _LDT_ENTRY_DEFINED
195 typedef struct _LDT_ENTRY
222 } LDT_ENTRY
, *PLDT_ENTRY
, *LPLDT_ENTRY
;
226 // GDT Entry Definition
228 typedef struct _KGDTENTRY
255 } KGDTENTRY
, *PKGDTENTRY
;
258 // IDT Entry Access Definition
260 typedef struct _KIDT_ACCESS
268 UCHAR SystemSegmentFlag
:1;
274 } KIDT_ACCESS
, *PKIDT_ACCESS
;
277 // IDT Entry Definition
279 typedef struct _KIDTENTRY
284 USHORT ExtendedOffset
;
285 } KIDTENTRY
, *PKIDTENTRY
;
287 typedef struct _DESCRIPTOR
292 } KDESCRIPTOR
, *PKDESCRIPTOR
;
294 #ifndef NTOS_MODE_USER
296 // Macro to get current KPRCB
300 KeGetCurrentPrcb(VOID
)
302 // return (struct _KPRCB *)(ULONG_PTR)__readgsqword(FIELD_OFFSET(KPCR, Prcb));
307 // FN/FX (FPU) Save Area Structures
309 typedef struct _FNSAVE_FORMAT
318 UCHAR RegisterArea
[80];
319 } FNSAVE_FORMAT
, *PFNSAVE_FORMAT
;
321 typedef struct _FXSAVE_FORMAT
333 UCHAR RegisterArea
[128];
334 UCHAR Reserved3
[128];
335 UCHAR Reserved4
[224];
336 UCHAR Align16Byte
[8];
337 } FXSAVE_FORMAT
, *PFXSAVE_FORMAT
;
339 typedef struct _FX_SAVE_AREA
343 FNSAVE_FORMAT FnArea
;
344 FXSAVE_FORMAT FxArea
;
348 } FX_SAVE_AREA
, *PFX_SAVE_AREA
;
351 // Special Registers Structure (outside of CONTEXT)
353 typedef struct _KSPECIAL_REGISTERS
370 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
373 // Processor State Data
375 typedef struct _KPROCESSOR_STATE
377 CONTEXT ContextFrame
;
378 KSPECIAL_REGISTERS SpecialRegisters
;
379 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
382 // Processor Region Control Block
385 typedef struct _KPRCB
389 struct _KTHREAD
*CurrentThread
;
390 struct _KTHREAD
*NextThread
;
391 struct _KTHREAD
*IdleThread
;
399 KPROCESSOR_STATE ProcessorState
;
400 ULONG KernelReserved
[16];
401 ULONG HalReserved
[16];
402 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
408 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
];
409 struct _KTHREAD
*NpxThread
;
410 ULONG InterruptCount
;
416 ULONG AdjustDpcThreshold
;
419 UCHAR DebuggerSavedIRQL
;
420 #if (NTDDI_VERSION >= NTDDI_WS03)
422 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
427 ULONG NodeShiftedColor
;
431 struct _KNODE
*ParentNode
;
432 ULONG MultiThreadProcessorSet
;
433 struct _KPRCB
*MultiThreadSetMaster
;
434 #if (NTDDI_VERSION >= NTDDI_WS03)
435 ULONG SecondaryColorMask
;
436 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
442 ULONG ThreadStartCount
[2];
444 ULONG CcFastReadNoWait
;
445 ULONG CcFastReadWait
;
446 ULONG CcFastReadNotPossible
;
447 ULONG CcCopyReadNoWait
;
448 ULONG CcCopyReadWait
;
449 ULONG CcCopyReadNoWaitMiss
;
450 #if (NTDDI_VERSION < NTDDI_LONGHORN)
451 ULONG KeAlignmentFixupCount
;
454 #if (NTDDI_VERSION < NTDDI_LONGHORN)
455 ULONG KeDcacheFlushCount
;
456 ULONG KeExceptionDispatchCount
;
457 ULONG KeFirstLevelTbFills
;
458 ULONG KeFloatingEmulationCount
;
459 ULONG KeIcacheFlushCount
;
460 ULONG KeSecondLevelTbFills
;
463 volatile ULONG IoReadOperationCount
;
464 volatile ULONG IoWriteOperationCount
;
465 volatile ULONG IoOtherOperationCount
;
466 LARGE_INTEGER IoReadTransferCount
;
467 LARGE_INTEGER IoWriteTransferCount
;
468 LARGE_INTEGER IoOtherTransferCount
;
469 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
470 ULONG CcFastMdlReadNoWait
;
471 ULONG CcFastMdlReadWait
;
472 ULONG CcFastMdlReadNotPossible
;
473 ULONG CcMapDataNoWait
;
475 ULONG CcPinMappedDataCount
;
476 ULONG CcPinReadNoWait
;
478 ULONG CcMdlReadNoWait
;
480 ULONG CcLazyWriteHotSpots
;
481 ULONG CcLazyWriteIos
;
482 ULONG CcLazyWritePages
;
485 ULONG CcLostDelayedWrites
;
486 ULONG CcFastReadResourceMiss
;
487 ULONG CcCopyReadWaitMiss
;
488 ULONG CcFastMdlReadResourceMiss
;
489 ULONG CcMapDataNoWaitMiss
;
490 ULONG CcMapDataWaitMiss
;
491 ULONG CcPinReadNoWaitMiss
;
492 ULONG CcPinReadWaitMiss
;
493 ULONG CcMdlReadNoWaitMiss
;
494 ULONG CcMdlReadWaitMiss
;
495 ULONG CcReadAheadIos
;
496 ULONG KeAlignmentFixupCount
;
497 ULONG KeExceptionDispatchCount
;
501 ULONG SpareCounter1
[8];
503 PP_LOOKASIDE_LIST PPLookasideList
[16];
504 PP_LOOKASIDE_LIST PPNPagedLookasideList
[32];
505 PP_LOOKASIDE_LIST PPPagedLookasideList
[32];
506 volatile ULONG PacketBarrier
;
507 volatile ULONG ReverseStall
;
510 volatile PVOID CurrentPacket
[3];
511 volatile ULONG TargetSet
;
512 volatile PKIPI_WORKER WorkerRoutine
;
513 volatile ULONG IpiFrozen
;
515 volatile ULONG RequestSummary
;
516 volatile struct _KPRCB
*SignalDone
;
518 struct _KDPC_DATA DpcData
[2];
520 ULONG MaximumDpcQueueDepth
;
521 ULONG DpcRequestRate
;
522 ULONG MinimumDpcRate
;
523 volatile UCHAR DpcInterruptRequested
;
524 volatile UCHAR DpcThreadRequested
;
525 volatile UCHAR DpcRoutineActive
;
526 volatile UCHAR DpcThreadActive
;
529 volatile ULONG TimerHand
;
530 volatile ULONG TimerRequest
;
533 UCHAR ThreadDpcEnable
;
534 volatile BOOLEAN QuantumEnd
;
536 volatile UCHAR IdleSchedule
;
537 LONG DpcSetEventRequest
;
538 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
548 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
550 UCHAR ClockCheckSlot
;
551 UCHAR ClockPollCycle
;
553 LONG DpcWatchdogPeriod
;
554 LONG DpcWatchDogCount
;
555 LONG ThreadWatchdogPeriod
;
556 LONG ThreadWatchDogCount
;
561 LIST_ENTRY WaitListHead
;
564 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
565 SINGLE_LIST_ENTRY DeferredReadyListHead
;
566 ULONGLONG StartCycles
;
568 ULONGLONG PrcbPad71
[3];
569 LIST_ENTRY DispatcherReadyListHead
[32];
571 LIST_ENTRY DispatcherReadyListHead
[32];
572 SINGLE_LIST_ENTRY DeferredReadyListHead
;
575 PVOID ChainedInterruptList
;
576 LONG LookasideIrpFloat
;
577 volatile LONG MmPageFaultCount
;
578 volatile LONG MmCopyOnWriteCount
;
579 volatile LONG MmTransitionCount
;
580 volatile LONG MmCacheTransitionCount
;
581 volatile LONG MmDemandZeroCount
;
582 volatile LONG MmPageReadCount
;
583 volatile LONG MmPageReadIoCount
;
584 volatile LONG MmCacheReadCount
;
585 volatile LONG MmCacheIoCount
;
586 volatile LONG MmDirtyPagesWriteCount
;
587 volatile LONG MmDirtyWriteIoCount
;
588 volatile LONG MmMappedPagesWriteCount
;
589 volatile LONG MmMappedWriteIoCount
;
590 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
592 ULONG CachedResidentAvailable
;
597 ULONG SpareFields0
[1];
599 CHAR VendorString
[13];
601 UCHAR LogicalProcessorsPerPhysicalProcessor
;
604 LARGE_INTEGER UpdateSignature
;
605 volatile LARGE_INTEGER IsrTime
;
606 LARGE_INTEGER SpareField1
;
607 FX_SAVE_AREA NpxSaveArea
;
608 PROCESSOR_POWER_STATE PowerState
;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
611 KTIMER DpcWatchdogTimer
;
614 SLIST_HEADER InterruptObjectPool
;
615 LARGE_INTEGER HyperCallPagePhysical
;
616 LARGE_INTEGER HyperCallPageVirtual
;
618 CACHE_DESCRIPTOR Cache
[5];
620 ULONG CacheProcessorMask
[5];
621 UCHAR LogicalProcessorsPerCore
;
623 ULONG PackageProcessorSet
;
624 ULONG CoreProcessorSet
;
629 // Processor Control Region
631 typedef struct _KIPCR
638 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
639 PVOID Used_StackBase
;
640 PVOID PerfGlobalGroupMask
;
642 ULONG ContextSwitches
;
643 KAFFINITY SetMemberCopy
;
653 PVOID KdVersionBlock
;
660 ULONG StallScaleFactor
;
664 UCHAR L2CacheAssociativity
;
666 ULONG KernelReserved
[14];
667 ULONG SecondLevelCacheSize
;
668 ULONG HalReserved
[16];
671 ULONG KernelReserved2
[17];
679 typedef struct _KiIoAccessMap
681 UCHAR DirectionMap
[32];
720 KIIO_ACCESS_MAP IoMaps
[1];
721 UCHAR IntDirectionMap
[32];
725 // i386 CPUs don't have exception frames
727 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;