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 MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
257 #define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
258 #define APIC_BASE 0xFFFFFFFFFFFE0000ULL
263 #define IO_ACCESS_MAP_NONE 0
264 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
265 #define KiComputeIopmOffset(MapNumber) \
266 (MapNumber == IO_ACCESS_MAP_NONE) ? \
267 (USHORT)(sizeof(KTSS)) : \
268 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
271 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
273 #define KSEG0_BASE 0xfffff80000000000ULL
276 // Synchronization-level IRQL
278 #define SYNCH_LEVEL 12
280 #define NMI_STACK_SIZE 0x2000
281 #define ISR_STACK_SIZE 0x6000
284 // Number of pool lookaside lists per pool in the PRCB
286 #define NUMBER_POOL_LOOKASIDE_LISTS 32
289 // Structure for CPUID
291 typedef union _CPU_INFO
301 } CPU_INFO
, *PCPU_INFO
;
304 // Trap Frame Definition
306 typedef struct _KTRAP_FRAME
315 UCHAR FaultIndicator
;
316 UCHAR ExceptionActive
;
339 UINT64 ContextRecord
;
340 UINT64 TimeStampCKCL
;
353 UINT64 LastBranchToRip
;
354 UINT64 LastBranchFromRip
;
355 UINT64 LastExceptionToRip
;
356 UINT64 LastExceptionFromRip
;
360 UINT64 LastBranchControl
;
376 UINT64 ExceptionFrame
;
377 UINT64 TimeStampKlog
;
390 } KTRAP_FRAME
, *PKTRAP_FRAME
;
395 #ifndef _LDT_ENTRY_DEFINED
396 #define _LDT_ENTRY_DEFINED
397 typedef ULONG LDT_ENTRY
;
401 // GDT Entry Definition
403 typedef union _KGDTENTRY64
436 } KGDTENTRY64
, *PKGDTENTRY64
;
437 #define KGDTENTRY KGDTENTRY64
438 #define PKGDTENTRY PKGDTENTRY64
441 // IDT Entry Access Definition
443 typedef struct _KIDT_ACCESS
451 UCHAR SystemSegmentFlag
:1;
457 } KIDT_ACCESS
, *PKIDT_ACCESS
;
460 // IDT Entry Definition
462 typedef union _KIDTENTRY64
478 } KIDTENTRY64
, *PKIDTENTRY64
;
479 #define KIDTENTRY KIDTENTRY64
480 #define PKIDTENTRY PKIDTENTRY64
482 typedef struct _KDESCRIPTOR
487 } KDESCRIPTOR
, *PKDESCRIPTOR
;
489 #ifndef NTOS_MODE_USER
492 // Special Registers Structure (outside of CONTEXT)
494 typedef struct _KSPECIAL_REGISTERS
511 ULONG64 DebugControl
;
512 ULONG64 LastBranchToRip
;
513 ULONG64 LastBranchFromRip
;
514 ULONG64 LastExceptionToRip
;
515 ULONG64 LastExceptionFromRip
;
522 ULONG64 MsrSyscallMask
;
523 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
526 // Processor State Data
528 typedef struct _KPROCESSOR_STATE
530 KSPECIAL_REGISTERS SpecialRegisters
;
531 CONTEXT ContextFrame
;
532 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
534 #if (NTDDI_VERSION < NTDDI_LONGHORN)
535 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
538 typedef struct _KREQUEST_PACKET
540 PVOID CurrentPacket
[3];
542 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
544 typedef struct _REQUEST_MAILBOX
546 INT64 RequestSummary
;
547 KREQUEST_PACKET RequestPacket
;
549 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
552 // Processor Region Control Block
555 typedef struct _KPRCB
558 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
564 UCHAR InterruptRequest
;
566 struct _KTHREAD
*CurrentThread
;
567 struct _KTHREAD
*NextThread
;
568 struct _KTHREAD
*IdleThread
;
569 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
579 KPROCESSOR_STATE ProcessorState
;
582 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
596 UINT64 HalReserved
[8];
601 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
602 UCHAR CoresPerPhysicalProcessor
;
603 UCHAR LogicalProcessorsPerCore
;
606 UCHAR LogicalProcessorsPerPhysicalProcessor
;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
616 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
623 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
624 PP_LOOKASIDE_LIST PPLookasideList
[16];
625 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
626 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
627 UINT64 PacketBarrier
;
628 SINGLE_LIST_ENTRY DeferredReadyListHead
;
629 LONG MmPageFaultCount
;
630 LONG MmCopyOnWriteCount
;
631 LONG MmTransitionCount
;
632 #if (NTDDI_VERSION < NTDDI_LONGHORN)
633 LONG MmCacheTransitionCount
;
635 LONG MmDemandZeroCount
;
636 LONG MmPageReadCount
;
637 LONG MmPageReadIoCount
;
638 #if (NTDDI_VERSION < NTDDI_LONGHORN)
639 LONG MmCacheReadCount
;
642 LONG MmDirtyPagesWriteCount
;
643 LONG MmDirtyWriteIoCount
;
644 LONG MmMappedPagesWriteCount
;
645 LONG MmMappedWriteIoCount
;
646 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
648 ULONG KeContextSwitches
;
649 ULONG CcFastReadNoWait
;
650 ULONG CcFastReadWait
;
651 ULONG CcFastReadNotPossible
;
652 ULONG CcCopyReadNoWait
;
653 ULONG CcCopyReadWait
;
654 ULONG CcCopyReadNoWaitMiss
;
655 LONG LookasideIrpFloat
;
657 LONG LookasideIrpFloat
;
660 LONG IoReadOperationCount
;
661 LONG IoWriteOperationCount
;
662 LONG IoOtherOperationCount
;
663 LARGE_INTEGER IoReadTransferCount
;
664 LARGE_INTEGER IoWriteTransferCount
;
665 LARGE_INTEGER IoOtherTransferCount
;
666 #if (NTDDI_VERSION < NTDDI_LONGHORN)
667 ULONG KeContextSwitches
;
673 REQUEST_MAILBOX RequestMailbox
[64];
674 UINT64 SenderSummary
;
676 KDPC_DATA DpcData
[2];
678 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
683 LONG MaximumDpcQueueDepth
;
684 ULONG DpcRequestRate
;
685 ULONG MinimumDpcRate
;
686 UCHAR DpcInterruptRequested
;
687 UCHAR DpcThreadRequested
;
688 UCHAR DpcRoutineActive
;
689 UCHAR DpcThreadActive
;
695 UCHAR ThreadDpcEnable
;
699 LONG DpcSetEventRequest
;
700 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
701 ULONG KeExceptionDispatchCount
;
707 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
711 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
713 UCHAR ClockCheckSlot
;
714 UCHAR ClockPollCycle
;
716 LONG DpcWatchdogPeriod
;
717 LONG DpcWatchdogCount
;
722 LIST_ENTRY WaitListHead
;
723 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
728 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
729 UINT64 PrcbPad71
[12];
731 LIST_ENTRY DispatcherReadyListHead
[32];
732 ULONG InterruptCount
;
737 ULONG AdjustDpcThreshold
;
739 UCHAR DebuggerSavedIRQL
;
741 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
751 struct _KNODE
*ParentNode
;
752 UINT64 MultiThreadProcessorSet
;
753 struct _KPRCB
*MultiThreadSetMaster
;
754 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
756 LONG MmSpinLockOrdering
;
759 ULONG NodeShiftedColor
;
760 ULONG SecondaryColorMask
;
763 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
765 ULONG CcFastMdlReadNoWait
;
766 ULONG CcFastMdlReadWait
;
767 ULONG CcFastMdlReadNotPossible
;
768 ULONG CcMapDataNoWait
;
770 ULONG CcPinMappedDataCount
;
771 ULONG CcPinReadNoWait
;
773 ULONG CcMdlReadNoWait
;
775 ULONG CcLazyWriteHotSpots
;
776 ULONG CcLazyWriteIos
;
777 ULONG CcLazyWritePages
;
780 ULONG CcLostDelayedWrites
;
781 ULONG CcFastReadResourceMiss
;
782 ULONG CcCopyReadWaitMiss
;
783 ULONG CcFastMdlReadResourceMiss
;
784 ULONG CcMapDataNoWaitMiss
;
785 ULONG CcMapDataWaitMiss
;
786 ULONG CcPinReadNoWaitMiss
;
787 ULONG CcPinReadWaitMiss
;
788 ULONG CcMdlReadNoWaitMiss
;
789 ULONG CcMdlReadWaitMiss
;
790 ULONG CcReadAheadIos
;
791 LONG MmCacheTransitionCount
;
792 LONG MmCacheReadCount
;
795 PROCESSOR_POWER_STATE PowerState
;
796 ULONG KeAlignmentFixupCount
;
797 UCHAR VendorString
[13];
800 LARGE_INTEGER UpdateSignature
;
802 KTIMER DpcWatchdogTimer
;
803 CACHE_DESCRIPTOR Cache
[5];
806 ULONG CachedResidentAvailable
;
810 SLIST_HEADER InterruptObjectPool
;
811 SLIST_HEADER HypercallPageList
;
812 PVOID HypercallPageVirtual
;
813 PVOID VirtualApicAssist
;
814 UINT64
* StatisticsPage
;
816 UINT64 CacheProcessorMask
[5];
817 UINT64 PackageProcessorSet
;
818 UINT64 CoreProcessorSet
;
824 ULONG NodeShiftedColor
;
825 ULONG SecondaryColorMask
;
827 ULONG CcFastReadNoWait
;
828 ULONG CcFastReadWait
;
829 ULONG CcFastReadNotPossible
;
830 ULONG CcCopyReadNoWait
;
831 ULONG CcCopyReadWait
;
832 ULONG CcCopyReadNoWaitMiss
;
833 ULONG KeAlignmentFixupCount
;
834 ULONG KeDcacheFlushCount
;
835 ULONG KeExceptionDispatchCount
;
836 ULONG KeFirstLevelTbFills
;
837 ULONG KeFloatingEmulationCount
;
838 ULONG KeIcacheFlushCount
;
839 ULONG KeSecondLevelTbFills
;
840 UCHAR VendorString
[13];
843 LARGE_INTEGER UpdateSignature
;
844 PROCESSOR_POWER_STATE PowerState
;
845 CACHE_DESCRIPTOR Cache
[5];
851 // Processor Control Region
853 typedef struct _KIPCR
860 union _KGDTENTRY64
*GdtBase
;
861 struct _KTSS64
*TssBase
;
864 struct _KPRCB
*CurrentPrcb
;
865 PKSPIN_LOCK_QUEUE LockArray
;
869 union _KIDTENTRY64
*IdtBase
;
872 UCHAR SecondLevelCacheAssociativity
;
873 UCHAR ObsoleteNumber
;
878 ULONG StallScaleFactor
;
880 ULONG KernelReserved
[15];
881 ULONG SecondLevelCacheSize
;
882 ULONG HalReserved
[16];
885 PVOID KdVersionBlock
; // 0x108
888 ULONG Fill2
[2]; // 0x178
892 ULONG ContextSwitches
;
900 typedef struct _KiIoAccessMap
902 UCHAR DirectionMap
[32];
908 typedef struct _KTSS64
910 /* 000 */ ULONG Reserved0
;
911 /* 004 */ UINT64 Rsp0
;
912 /* 00c */ UINT64 Rsp1
;
913 /* 014 */ UINT64 Rsp2
;
914 /* 01c */ UINT64 Ist
[8];
915 /* 05c */ UINT64 Reserved1
;
916 /* 064 */ USHORT Reserved2
;
917 /* 066 */ USHORT IoMapBase
;
921 #define PKTSS PKTSS64
926 typedef struct _KEXCEPTION_FRAME
933 #if (NTDDI_VERSION >= NTDDI_WIN8)
936 ULONG64 InitialStack
;
949 #if (NTDDI_VERSION < NTDDI_WIN8)
950 ULONG64 CallbackStack
;
952 ULONG64 OutputBuffer
;
953 ULONG64 OutputLength
;
954 #if (NTDDI_VERSION >= NTDDI_WIN8)
967 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
969 typedef struct _MACHINE_FRAME
979 } MACHINE_FRAME
, *PMACHINE_FRAME
;
982 // Defines the Callback Stack Layout for User Mode Callbacks
984 typedef KEXCEPTION_FRAME KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
987 // User side callout frame
989 typedef struct _UCALLOUT_FRAME
998 MACHINE_FRAME MachineFrame
;
999 } UCALLOUT_FRAME
, *PUCALLOUT_FRAME
; // size = 0x0058
1001 typedef struct _DISPATCHER_CONTEXT
1005 PVOID FunctionEntry
;
1006 PVOID EstablisherFrame
;
1008 PVOID ContextRecord
;
1009 PVOID LanguageHandler
;
1013 } DISPATCHER_CONTEXT
, *PDISPATCHER_CONTEXT
;
1015 typedef struct _KSTART_FRAME
1023 } KSTART_FRAME
, *PKSTART_FRAME
;
1025 typedef struct _KSWITCH_FRAME
1036 } KSWITCH_FRAME
, *PKSWITCH_FRAME
;
1038 #define PROCESSOR_START_FLAG_FORCE_ENABLE_NX 0x0001
1039 typedef struct _KPROCESSOR_START_BLOCK
1041 ULONG CompletionFlag
; // 0x0004
1042 ULONG Flags
; // 0x0008
1043 ULONG Gdt32
; // 0x000C
1044 ULONG Idt32
; // 0x0012
1045 PVOID Gdt
; // 0x0018
1047 ULONG64 TiledMemoryMap
; // 0x0058
1048 UCHAR PmTarget
[6]; // 0x0060
1049 UCHAR LmIdentityTarget
[6]; // 0x0066
1050 ULONG64 LmTarget
; // 0x0070
1051 struct _KPROCESSOR_START_BLOCK
*SelfMap
; // 0x0078
1052 ULONG64 MsrPat
; // 0x0080
1053 ULONG64 MsrEFER
; // 0x0088
1054 KPROCESSOR_STATE ProcessorState
; // 0x0090
1055 } KPROCESSOR_START_BLOCK
, *PKPROCESSOR_START_BLOCK
; // size 00640
1058 // Inline function to get current KPRCB
1062 KeGetCurrentPrcb(VOID
)
1064 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));