3 Copyright (c) Alex Ionescu. All rights reserved.
11 amd64 Type definitions for the Kernel services.
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
16 Timo Kreuzer (timo.kreuzer@reactos.org) - Updated - 14-Aug-2008
20 #ifndef _AMD64_KETYPES_H
21 #define _AMD64_KETYPES_H
28 // KPCR Access for non-IA64 builds
30 //#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
31 //#define PCR ((volatile KPCR * const)K0IPCR)
32 #define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
33 //#if defined(CONFIG_SMP) || defined(NT_BUILD)
35 //#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
52 #define MACHINE_TYPE_ISA 0x0000
53 #define MACHINE_TYPE_EISA 0x0001
54 #define MACHINE_TYPE_MCA 0x0002
57 // X86 80386 Segment Types
59 #define I386_TASK_GATE 0x5
61 #define I386_ACTIVE_TSS 0xB
62 #define I386_CALL_GATE 0xC
63 #define I386_INTERRUPT_GATE 0xE
64 #define I386_TRAP_GATE 0xF
69 #define RPL_MASK 0x0003
70 #define MODE_MASK 0x0001
71 #define KGDT64_NULL 0x0000
72 #define KGDT64_R0_CODE 0x0010
73 #define KGDT64_R0_DATA 0x0018
74 #define KGDT64_R3_CMCODE 0x0020
75 #define KGDT64_R3_DATA 0x0028
76 #define KGDT64_R3_CODE 0x0030
77 #define KGDT64_SYS_TSS 0x0040
78 #define KGDT64_R3_CMTEB 0x0050
79 #define KGDT64_R0_LDT 0x0060
92 #define CR4_FXSR 0x200
93 #define CR4_XMMEXCPT 0x400
94 #define CR4_CHANNELS 0x800
95 #define CR4_XSAVE 0x40000
100 #define DR7_LEGAL 0xFFFF0355
101 #define DR7_ACTIVE 0x00000355
102 #define DR7_TRACE_BRANCH 0x00000200
103 #define DR7_LAST_BRANCH 0x00000100
108 #define DEBUG_ACTIVE_DR7 0x0001
109 #define DEBUG_ACTIVE_INSTRUMENTED 0x0002
110 #define DEBUG_ACTIVE_DBG_INSTRUMENTED 0x0003
111 #define DEBUG_ACTIVE_MINIMAL_THREAD 0x0004
112 #define DEBUG_ACTIVE_PRIMARY_THREAD 0x0080
113 #define DEBUG_ACTIVE_PRIMARY_THREAD_BIT 0x0007
114 #define DEBUG_ACTIVE_PRIMARY_THREAD_LOCK_BIT 0x001F
115 #define DEBUG_ACTIVE_SCHEDULED_THREAD 0x0040
116 #define DEBUG_ACTIVE_SCHEDULED_THREAD_BIT 0x0006
117 #define DEBUG_ACTIVE_SCHEDULED_THREAD_LOCK_BIT 0x001E
118 #define DEBUG_ACTIVE_SCHEDULED_THREAD_LOCK 0x40000000
123 #define EFLAGS_CF 0x01L
124 #define EFLAGS_ZF 0x40L
125 #define EFLAGS_TF 0x100L
126 #define EFLAGS_INTERRUPT_MASK 0x200L
127 #define EFLAGS_DF 0x400L
128 #define EFLAGS_NESTED_TASK 0x4000L
129 #define EFLAGS_V86_MASK 0x20000
130 #define EFLAGS_ALIGN_CHECK 0x40000
131 #define EFLAGS_VIF 0x80000
132 #define EFLAGS_VIP 0x100000
133 #define EFLAGS_USER_SANITIZE 0x3F4DD7
134 #define EFLAG_SIGN 0x8000
135 #define EFLAG_ZERO 0x4000
136 #define EFLAGS_TF_MASK 0x0100
137 #define EFLAGS_TF_SHIFT 0x0008
138 #define EFLAGS_ID_MASK 0x200000
139 #define EFLAGS_IF_MASK 0x0200
140 #define EFLAGS_IF_SHIFT 0x0009
143 // MXCSR Floating Control/Status Bit Masks
145 #define XSW_INVALID_OPERATION 0x0001
146 #define XSW_DENORMAL 0x0002
147 #define XSW_ZERO_DIVIDE 0x0004
148 #define XSW_OVERFLOW 0x0008
149 #define XSW_UNDERFLOW 0x0010
150 #define XSW_PRECISION 0x0020
151 #define XCW_INVALID_OPERATION 0x0080
152 #define XCW_DENORMAL 0x0100
153 #define XCW_ZERO_DIVIDE 0x0200
154 #define XCW_OVERFLOW 0x0400
155 #define XCW_UNDERFLOW 0x0800
156 #define XCW_PRECISION 0x1000
157 #define XCW_ROUND_CONTROL 0x6000
158 #define XCW_FLUSH_ZERO 0x8000
159 #define XSW_ERROR_MASK 0x003F
160 #define XSW_ERROR_SHIFT 7
163 // Legacy floating status word bit masks.
165 #define FSW_INVALID_OPERATION 0x0001
166 #define FSW_DENORMAL 0x0002
167 #define FSW_ZERO_DIVIDE 0x0004
168 #define FSW_OVERFLOW 0x0008
169 #define FSW_UNDERFLOW 0x0010
170 #define FSW_PRECISION 0x0020
171 #define FSW_STACK_FAULT 0x0040
172 #define FSW_ERROR_SUMMARY 0x0080
173 #define FSW_CONDITION_CODE_0 0x0100
174 #define FSW_CONDITION_CODE_1 0x0200
175 #define FSW_CONDITION_CODE_2 0x0400
176 #define FSW_CONDITION_CODE_3 0x4000
177 #define FSW_ERROR_MASK 0x003F
180 // Machine Specific Registers
182 #define MSR_EFER 0xC0000080
183 #define MSR_STAR 0xC0000081
184 #define MSR_LSTAR 0xC0000082
185 #define MSR_CSTAR 0xC0000083
186 #define MSR_SYSCALL_MASK 0xC0000084
187 #define MSR_FS_BASE 0xC0000100
188 #define MSR_GS_BASE 0xC0000101
189 #define MSR_GS_SWAP 0xC0000102
190 #define MSR_MCG_STATUS 0x017A
191 #define MSR_AMD_ACCESS 0x9C5A203A
192 #define MSR_IA32_MISC_ENABLE 0x01A0
193 #define MSR_LAST_BRANCH_FROM 0x01DB
194 #define MSR_LAST_BRANCH_TO 0x01DC
195 #define MSR_LAST_EXCEPTION_FROM 0x01DD
196 #define MSR_LAST_EXCEPTION_TO 0x01DE
199 // Caching values for the PAT MSR
211 #define MSR_SCE 0x0001
212 #define MSR_LME 0x0100
213 #define MSR_LMA 0x0400
214 #define MSR_NXE 0x0800
215 #define MSR_PAT 0x0277
216 #define MSR_DEBUG_CTL 0x01D9
219 // Flags in MSR_IA32_MISC_ENABLE
221 #define MSR_XD_ENABLE_MASK 0xFFFFFFFB
224 // Flags in MSR_DEBUG_CTL
226 #define MSR_DEBUG_CTL_LBR equ 0x0001
227 #define MSR_DEBUG_CTL_BTF equ 0x0002
235 #define IPI_PACKET_READY 8
236 #define IPI_SYNCH_REQUEST 16
241 #define PRCB_MAJOR_VERSION 1
242 #define PRCB_BUILD_DEBUG 1
243 #define PRCB_BUILD_UNIPROCESSOR 2
246 // Exception active flags
248 #define KEXCEPTION_ACTIVE_INTERRUPT_FRAME 0x0000
249 #define KEXCEPTION_ACTIVE_EXCEPTION_FRAME 0x0001
250 #define KEXCEPTION_ACTIVE_SERVICE_FRAME 0x0002
255 #define INITIAL_STALL_COUNT 100
256 #define HYPERSPACE_BASE 0xfffff70000000000ULL
257 #define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
258 #define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
259 #define APIC_BASE 0xFFFFFFFFFFFE0000ULL
264 #define IO_ACCESS_MAP_NONE 0
265 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
266 #define KiComputeIopmOffset(MapNumber) \
267 (MapNumber == IO_ACCESS_MAP_NONE) ? \
268 (USHORT)(sizeof(KTSS)) : \
269 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
272 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
274 #define KSEG0_BASE 0xfffff80000000000ULL
277 // Synchronization-level IRQL
279 #define SYNCH_LEVEL 12
281 #define NMI_STACK_SIZE 0x2000
282 #define ISR_STACK_SIZE 0x6000
285 // Number of pool lookaside lists per pool in the PRCB
287 #define NUMBER_POOL_LOOKASIDE_LISTS 32
290 // Structure for CPUID
292 typedef union _CPU_INFO
302 } CPU_INFO
, *PCPU_INFO
;
305 // Trap Frame Definition
307 typedef struct _KTRAP_FRAME
316 UCHAR FaultIndicator
;
317 UCHAR ExceptionActive
;
340 UINT64 ContextRecord
;
341 UINT64 TimeStampCKCL
;
354 UINT64 LastBranchToRip
;
355 UINT64 LastBranchFromRip
;
356 UINT64 LastExceptionToRip
;
357 UINT64 LastExceptionFromRip
;
361 UINT64 LastBranchControl
;
377 UINT64 ExceptionFrame
;
378 UINT64 TimeStampKlog
;
391 } KTRAP_FRAME
, *PKTRAP_FRAME
;
396 #ifndef _LDT_ENTRY_DEFINED
397 #define _LDT_ENTRY_DEFINED
398 typedef ULONG LDT_ENTRY
;
402 // GDT Entry Definition
404 typedef union _KGDTENTRY64
437 } KGDTENTRY64
, *PKGDTENTRY64
;
438 #define KGDTENTRY KGDTENTRY64
439 #define PKGDTENTRY PKGDTENTRY64
442 // IDT Entry Access Definition
444 typedef struct _KIDT_ACCESS
452 UCHAR SystemSegmentFlag
:1;
458 } KIDT_ACCESS
, *PKIDT_ACCESS
;
461 // IDT Entry Definition
463 typedef union _KIDTENTRY64
479 } KIDTENTRY64
, *PKIDTENTRY64
;
480 #define KIDTENTRY KIDTENTRY64
481 #define PKIDTENTRY PKIDTENTRY64
483 typedef struct _KDESCRIPTOR
488 } KDESCRIPTOR
, *PKDESCRIPTOR
;
490 #ifndef NTOS_MODE_USER
493 // Special Registers Structure (outside of CONTEXT)
495 typedef struct _KSPECIAL_REGISTERS
512 ULONG64 DebugControl
;
513 ULONG64 LastBranchToRip
;
514 ULONG64 LastBranchFromRip
;
515 ULONG64 LastExceptionToRip
;
516 ULONG64 LastExceptionFromRip
;
523 ULONG64 MsrSyscallMask
;
524 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
527 // Processor State Data
529 typedef struct _KPROCESSOR_STATE
531 KSPECIAL_REGISTERS SpecialRegisters
;
532 CONTEXT ContextFrame
;
533 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
535 #if (NTDDI_VERSION < NTDDI_LONGHORN)
536 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
539 typedef struct _KREQUEST_PACKET
541 PVOID CurrentPacket
[3];
543 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
545 typedef struct _REQUEST_MAILBOX
547 INT64 RequestSummary
;
548 KREQUEST_PACKET RequestPacket
;
550 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
553 // Processor Region Control Block
556 typedef struct _KPRCB
559 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
565 UCHAR InterruptRequest
;
567 struct _KTHREAD
*CurrentThread
;
568 struct _KTHREAD
*NextThread
;
569 struct _KTHREAD
*IdleThread
;
570 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
580 KPROCESSOR_STATE ProcessorState
;
583 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
597 UINT64 HalReserved
[8];
602 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
603 UCHAR CoresPerPhysicalProcessor
;
604 UCHAR LogicalProcessorsPerCore
;
607 UCHAR LogicalProcessorsPerPhysicalProcessor
;
610 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
617 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
624 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
625 PP_LOOKASIDE_LIST PPLookasideList
[16];
626 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
627 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
628 UINT64 PacketBarrier
;
629 SINGLE_LIST_ENTRY DeferredReadyListHead
;
630 LONG MmPageFaultCount
;
631 LONG MmCopyOnWriteCount
;
632 LONG MmTransitionCount
;
633 #if (NTDDI_VERSION < NTDDI_LONGHORN)
634 LONG MmCacheTransitionCount
;
636 LONG MmDemandZeroCount
;
637 LONG MmPageReadCount
;
638 LONG MmPageReadIoCount
;
639 #if (NTDDI_VERSION < NTDDI_LONGHORN)
640 LONG MmCacheReadCount
;
643 LONG MmDirtyPagesWriteCount
;
644 LONG MmDirtyWriteIoCount
;
645 LONG MmMappedPagesWriteCount
;
646 LONG MmMappedWriteIoCount
;
647 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
649 ULONG KeContextSwitches
;
650 ULONG CcFastReadNoWait
;
651 ULONG CcFastReadWait
;
652 ULONG CcFastReadNotPossible
;
653 ULONG CcCopyReadNoWait
;
654 ULONG CcCopyReadWait
;
655 ULONG CcCopyReadNoWaitMiss
;
656 LONG LookasideIrpFloat
;
658 LONG LookasideIrpFloat
;
661 LONG IoReadOperationCount
;
662 LONG IoWriteOperationCount
;
663 LONG IoOtherOperationCount
;
664 LARGE_INTEGER IoReadTransferCount
;
665 LARGE_INTEGER IoWriteTransferCount
;
666 LARGE_INTEGER IoOtherTransferCount
;
667 #if (NTDDI_VERSION < NTDDI_LONGHORN)
668 ULONG KeContextSwitches
;
674 REQUEST_MAILBOX RequestMailbox
[64];
675 UINT64 SenderSummary
;
677 KDPC_DATA DpcData
[2];
679 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
684 LONG MaximumDpcQueueDepth
;
685 ULONG DpcRequestRate
;
686 ULONG MinimumDpcRate
;
687 UCHAR DpcInterruptRequested
;
688 UCHAR DpcThreadRequested
;
689 UCHAR DpcRoutineActive
;
690 UCHAR DpcThreadActive
;
696 UCHAR ThreadDpcEnable
;
700 LONG DpcSetEventRequest
;
701 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
702 ULONG KeExceptionDispatchCount
;
708 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
712 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
714 UCHAR ClockCheckSlot
;
715 UCHAR ClockPollCycle
;
717 LONG DpcWatchdogPeriod
;
718 LONG DpcWatchdogCount
;
723 LIST_ENTRY WaitListHead
;
724 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
729 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
730 UINT64 PrcbPad71
[12];
732 LIST_ENTRY DispatcherReadyListHead
[32];
733 ULONG InterruptCount
;
738 ULONG AdjustDpcThreshold
;
740 UCHAR DebuggerSavedIRQL
;
742 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
752 struct _KNODE
*ParentNode
;
753 UINT64 MultiThreadProcessorSet
;
754 struct _KPRCB
*MultiThreadSetMaster
;
755 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
757 LONG MmSpinLockOrdering
;
760 ULONG NodeShiftedColor
;
761 ULONG SecondaryColorMask
;
764 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
766 ULONG CcFastMdlReadNoWait
;
767 ULONG CcFastMdlReadWait
;
768 ULONG CcFastMdlReadNotPossible
;
769 ULONG CcMapDataNoWait
;
771 ULONG CcPinMappedDataCount
;
772 ULONG CcPinReadNoWait
;
774 ULONG CcMdlReadNoWait
;
776 ULONG CcLazyWriteHotSpots
;
777 ULONG CcLazyWriteIos
;
778 ULONG CcLazyWritePages
;
781 ULONG CcLostDelayedWrites
;
782 ULONG CcFastReadResourceMiss
;
783 ULONG CcCopyReadWaitMiss
;
784 ULONG CcFastMdlReadResourceMiss
;
785 ULONG CcMapDataNoWaitMiss
;
786 ULONG CcMapDataWaitMiss
;
787 ULONG CcPinReadNoWaitMiss
;
788 ULONG CcPinReadWaitMiss
;
789 ULONG CcMdlReadNoWaitMiss
;
790 ULONG CcMdlReadWaitMiss
;
791 ULONG CcReadAheadIos
;
792 LONG MmCacheTransitionCount
;
793 LONG MmCacheReadCount
;
796 PROCESSOR_POWER_STATE PowerState
;
797 ULONG KeAlignmentFixupCount
;
798 UCHAR VendorString
[13];
801 LARGE_INTEGER UpdateSignature
;
803 KTIMER DpcWatchdogTimer
;
804 CACHE_DESCRIPTOR Cache
[5];
807 ULONG CachedResidentAvailable
;
811 SLIST_HEADER InterruptObjectPool
;
812 SLIST_HEADER HypercallPageList
;
813 PVOID HypercallPageVirtual
;
814 PVOID VirtualApicAssist
;
815 UINT64
* StatisticsPage
;
817 UINT64 CacheProcessorMask
[5];
818 UINT64 PackageProcessorSet
;
819 UINT64 CoreProcessorSet
;
825 ULONG NodeShiftedColor
;
826 ULONG SecondaryColorMask
;
828 ULONG CcFastReadNoWait
;
829 ULONG CcFastReadWait
;
830 ULONG CcFastReadNotPossible
;
831 ULONG CcCopyReadNoWait
;
832 ULONG CcCopyReadWait
;
833 ULONG CcCopyReadNoWaitMiss
;
834 ULONG KeAlignmentFixupCount
;
835 ULONG KeDcacheFlushCount
;
836 ULONG KeExceptionDispatchCount
;
837 ULONG KeFirstLevelTbFills
;
838 ULONG KeFloatingEmulationCount
;
839 ULONG KeIcacheFlushCount
;
840 ULONG KeSecondLevelTbFills
;
841 UCHAR VendorString
[13];
844 LARGE_INTEGER UpdateSignature
;
845 PROCESSOR_POWER_STATE PowerState
;
846 CACHE_DESCRIPTOR Cache
[5];
852 // Processor Control Region
854 typedef struct _KIPCR
861 union _KGDTENTRY64
*GdtBase
;
862 struct _KTSS64
*TssBase
;
865 struct _KPRCB
*CurrentPrcb
;
866 PKSPIN_LOCK_QUEUE LockArray
;
870 union _KIDTENTRY64
*IdtBase
;
873 UCHAR SecondLevelCacheAssociativity
;
874 UCHAR ObsoleteNumber
;
879 ULONG StallScaleFactor
;
881 ULONG KernelReserved
[15];
882 ULONG SecondLevelCacheSize
;
883 ULONG HalReserved
[16];
886 PVOID KdVersionBlock
; // 0x108
889 ULONG Fill2
[2]; // 0x178
893 ULONG ContextSwitches
;
901 typedef struct _KiIoAccessMap
903 UCHAR DirectionMap
[32];
909 typedef struct _KTSS64
911 /* 000 */ ULONG Reserved0
;
912 /* 004 */ UINT64 Rsp0
;
913 /* 00c */ UINT64 Rsp1
;
914 /* 014 */ UINT64 Rsp2
;
915 /* 01c */ UINT64 Ist
[8];
916 /* 05c */ UINT64 Reserved1
;
917 /* 064 */ USHORT Reserved2
;
918 /* 066 */ USHORT IoMapBase
;
922 #define PKTSS PKTSS64
927 typedef struct _KEXCEPTION_FRAME
946 //ULONG64 CallbackStack;
947 ULONG64 OutputBuffer
;
948 ULONG64 OutputLength
;
960 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
962 typedef struct _MACHINE_FRAME
972 } MACHINE_FRAME
, *PMACHINE_FRAME
;
975 // Defines the Callback Stack Layout for User Mode Callbacks
977 typedef KEXCEPTION_FRAME KCALLOUT_FRAME
, PKCALLOUT_FRAME
;
980 // User side callout frame
982 typedef struct _UCALLOUT_FRAME
991 MACHINE_FRAME MachineFrame
;
992 } UCALLOUT_FRAME
, *PUCALLOUT_FRAME
; // size = 0x0058
994 typedef struct _DISPATCHER_CONTEXT
999 PVOID EstablisherFrame
;
1001 PVOID ContextRecord
;
1002 PVOID LanguageHandler
;
1006 } DISPATCHER_CONTEXT
, *PDISPATCHER_CONTEXT
;
1008 typedef struct _KSTART_FRAME
1016 } KSTART_FRAME
, *PKSTART_FRAME
;
1018 typedef struct _KSWITCH_FRAME
1029 } KSWITCH_FRAME
, *PKSWITCH_FRAME
;
1031 #define PROCESSOR_START_FLAG_FORCE_ENABLE_NX 0x0001
1032 typedef struct _KPROCESSOR_START_BLOCK
1034 ULONG CompletionFlag
; // 0x0004
1035 ULONG Flags
; // 0x0008
1036 ULONG Gdt32
; // 0x000C
1037 ULONG Idt32
; // 0x0012
1038 PVOID Gdt
; // 0x0018
1040 ULONG64 TiledMemoryMap
; // 0x0058
1041 UCHAR PmTarget
[6]; // 0x0060
1042 UCHAR LmIdentityTarget
[6]; // 0x0066
1043 ULONG64 LmTarget
; // 0x0070
1044 struct _KPROCESSOR_START_BLOCK
*SelfMap
; // 0x0078
1045 ULONG64 MsrPat
; // 0x0080
1046 ULONG64 MsrEFER
; // 0x0088
1047 KPROCESSOR_STATE ProcessorState
; // 0x0090
1048 } KPROCESSOR_START_BLOCK
, *PKPROCESSOR_START_BLOCK
; // size 00640
1051 // Inline function to get current KPRCB
1055 KeGetCurrentPrcb(VOID
)
1057 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));