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))
41 #define MACHINE_TYPE_ISA 0x0000
42 #define MACHINE_TYPE_EISA 0x0001
43 #define MACHINE_TYPE_MCA 0x0002
46 // X86 80386 Segment Types
48 #define I386_TASK_GATE 0x5
50 #define I386_ACTIVE_TSS 0xB
51 #define I386_CALL_GATE 0xC
52 #define I386_INTERRUPT_GATE 0xE
53 #define I386_TRAP_GATE 0xF
58 #define RPL_MASK 0x0003
59 #define MODE_MASK 0x0001
60 #define KGDT64_NULL 0x0000
61 #define KGDT64_R0_CODE 0x0010
62 #define KGDT64_R0_DATA 0x0018
63 #define KGDT64_R3_CMCODE 0x0020
64 #define KGDT64_R3_DATA 0x0028
65 #define KGDT64_R3_CODE 0x0030
66 #define KGDT64_SYS_TSS 0x0040
67 #define KGDT64_R3_CMTEB 0x0050
81 #define CR4_FXSR 0x200
82 #define CR4_XMMEXCPT 0x400
83 #define CR4_CHANNELS 0x800
88 #define EFLAGS_CF 0x01L
89 #define EFLAGS_ZF 0x40L
90 #define EFLAGS_TF 0x100L
91 #define EFLAGS_INTERRUPT_MASK 0x200L
92 #define EFLAGS_DF 0x400L
93 #define EFLAGS_NESTED_TASK 0x4000L
94 #define EFLAGS_V86_MASK 0x20000
95 #define EFLAGS_ALIGN_CHECK 0x40000
96 #define EFLAGS_VIF 0x80000
97 #define EFLAGS_VIP 0x100000
98 #define EFLAGS_USER_SANITIZE 0x3F4DD7
99 #define EFLAG_SIGN 0x8000
100 #define EFLAG_ZERO 0x4000
101 #define EFLAGS_TF_MASK 0x0100
102 #define EFLAGS_TF_SHIFT 0x0008
103 #define EFLAGS_ID_MASK 0x200000
104 #define EFLAGS_IF_MASK 0x0200
105 #define EFLAGS_IF_SHIFT 0x0009
108 // Machine Specific Registers
110 #define MSR_MCG_STATUS 0x017A
111 #define MSR_DEGUG_CTL 0x01D9
112 #define MSR_LAST_BRANCH_FROM 0x01DB
113 #define MSR_LAST_BRANCH_TO 0x01DC
114 #define MSR_LAST_EXCEPTION_FROM 0x01DD
115 #define MSR_LAST_EXCEPTION_TO 0x01DE
116 #define MSR_PAT 0x0277
117 #define MSR_AMD_ACCESS 0x9C5A203A
118 #define MSR_EFER 0xC0000080
119 #define MSR_STAR 0xC0000081
120 #define MSR_LSTAR 0xC0000082
121 #define MSR_CSTAR 0xC0000083
122 #define MSR_SYSCALL_MASK 0xC0000084
123 #define MSR_FS_BASE 0xC0000100
124 #define MSR_GS_BASE 0xC0000101
125 #define MSR_GS_SWAP 0xC0000102
128 // Caching values for the PAT MSR
140 #define MSR_LMA 0x0400
141 #define MSR_LME 0x0100
142 #define MSR_SCE 0x0001
143 #define MSR_NXE 0x0800
151 #define IPI_PACKET_READY 8
152 #define IPI_SYNCH_REQUEST 16
157 #define PRCB_MAJOR_VERSION 1
158 #define PRCB_BUILD_DEBUG 1
159 #define PRCB_BUILD_UNIPROCESSOR 2
164 #define NUMBER_SERVICE_TABLES 2
165 #define SERVICE_NUMBER_MASK 0xFFF
166 #define SERVICE_TABLE_SHIFT 7
167 #define SERVICE_TABLE_MASK 0x20
168 #define SERVICE_TABLE_TEST 0x20
173 #define INITIAL_STALL_COUNT 100
174 #define HYPERSPACE_BASE 0xfffff70000000000ULL
175 #define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
176 #define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
177 #define APIC_BASE 0xFFFFFFFFFFFE0000ULL
182 #define IO_ACCESS_MAP_NONE 0
183 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
184 #define KiComputeIopmOffset(MapNumber) \
185 (MapNumber == IO_ACCESS_MAP_NONE) ? \
186 (USHORT)(sizeof(KTSS)) : \
187 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
190 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
192 #define KSEG0_BASE 0xfffff80000000000ULL
195 // Synchronization-level IRQL
197 #define SYNCH_LEVEL 12
199 #define NMI_STACK_SIZE 0x2000
202 // Number of pool lookaside lists per pool in the PRCB
204 #define NUMBER_POOL_LOOKASIDE_LISTS 32
207 // Trap Frame Definition
209 typedef struct _KTRAP_FRAME
218 UCHAR FaultIndicator
;
219 UCHAR ExceptionActive
;
242 UINT64 ContextRecord
;
243 UINT64 TimeStampCKCL
;
256 UINT64 LastBranchToRip
;
257 UINT64 LastBranchFromRip
;
258 UINT64 LastExceptionToRip
;
259 UINT64 LastExceptionFromRip
;
263 UINT64 LastBranchControl
;
279 UINT64 ExceptionFrame
;
280 UINT64 TimeStampKlog
;
293 } KTRAP_FRAME
, *PKTRAP_FRAME
;
296 // Defines the Callback Stack Layout for User Mode Callbacks
298 typedef struct _KCALLOUT_FRAME
300 ULONG64 InitialStack
;
302 ULONG64 CallbackStack
;
307 ULONG64 ReturnAddress
;
309 ULONG64 ResultLength
;
310 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
315 #ifndef _LDT_ENTRY_DEFINED
316 #define _LDT_ENTRY_DEFINED
317 typedef ULONG LDT_ENTRY
;
321 // GDT Entry Definition
323 typedef union _KGDTENTRY64
356 } KGDTENTRY64
, *PKGDTENTRY64
;
357 #define KGDTENTRY KGDTENTRY64
358 #define PKGDTENTRY PKGDTENTRY64
361 // IDT Entry Access Definition
363 typedef struct _KIDT_ACCESS
371 UCHAR SystemSegmentFlag
:1;
377 } KIDT_ACCESS
, *PKIDT_ACCESS
;
380 // IDT Entry Definition
382 typedef union _KIDTENTRY64
398 } KIDTENTRY64
, *PKIDTENTRY64
;
399 #define KIDTENTRY KIDTENTRY64
400 #define PKIDTENTRY PKIDTENTRY64
402 typedef struct _KDESCRIPTOR
407 } KDESCRIPTOR
, *PKDESCRIPTOR
;
409 #ifndef NTOS_MODE_USER
412 // Special Registers Structure (outside of CONTEXT)
414 typedef struct _KSPECIAL_REGISTERS
426 struct _KDESCRIPTOR Gdtr
;
427 struct _KDESCRIPTOR Idtr
;
432 UINT64 LastBranchToRip
;
433 UINT64 LastBranchFromRip
;
434 UINT64 LastExceptionToRip
;
435 UINT64 LastExceptionFromRip
;
442 UINT64 MsrSyscallMask
;
443 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
446 // Processor State Data
448 typedef struct _KPROCESSOR_STATE
450 KSPECIAL_REGISTERS SpecialRegisters
;
451 CONTEXT ContextFrame
;
452 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
454 #if (NTDDI_VERSION < NTDDI_LONGHORN)
455 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
458 typedef struct _KREQUEST_PACKET
460 PVOID CurrentPacket
[3];
462 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
464 typedef struct _REQUEST_MAILBOX
466 INT64 RequestSummary
;
467 KREQUEST_PACKET RequestPacket
;
469 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
472 // Processor Region Control Block
475 typedef struct _KPRCB
478 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
484 UCHAR InterruptRequest
;
486 struct _KTHREAD
*CurrentThread
;
487 struct _KTHREAD
*NextThread
;
488 struct _KTHREAD
*IdleThread
;
489 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
499 KPROCESSOR_STATE ProcessorState
;
502 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
516 UINT64 HalReserved
[8];
521 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
522 UCHAR CoresPerPhysicalProcessor
;
523 UCHAR LogicalProcessorsPerCore
;
526 UCHAR LogicalProcessorsPerPhysicalProcessor
;
529 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
536 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
543 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
544 PP_LOOKASIDE_LIST PPLookasideList
[16];
545 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
546 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[NUMBER_POOL_LOOKASIDE_LISTS
];
547 UINT64 PacketBarrier
;
548 SINGLE_LIST_ENTRY DeferredReadyListHead
;
549 LONG MmPageFaultCount
;
550 LONG MmCopyOnWriteCount
;
551 LONG MmTransitionCount
;
552 #if (NTDDI_VERSION < NTDDI_LONGHORN)
553 LONG MmCacheTransitionCount
;
555 LONG MmDemandZeroCount
;
556 LONG MmPageReadCount
;
557 LONG MmPageReadIoCount
;
558 #if (NTDDI_VERSION < NTDDI_LONGHORN)
559 LONG MmCacheReadCount
;
562 LONG MmDirtyPagesWriteCount
;
563 LONG MmDirtyWriteIoCount
;
564 LONG MmMappedPagesWriteCount
;
565 LONG MmMappedWriteIoCount
;
566 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
568 ULONG KeContextSwitches
;
569 ULONG CcFastReadNoWait
;
570 ULONG CcFastReadWait
;
571 ULONG CcFastReadNotPossible
;
572 ULONG CcCopyReadNoWait
;
573 ULONG CcCopyReadWait
;
574 ULONG CcCopyReadNoWaitMiss
;
575 LONG LookasideIrpFloat
;
577 LONG LookasideIrpFloat
;
580 LONG IoReadOperationCount
;
581 LONG IoWriteOperationCount
;
582 LONG IoOtherOperationCount
;
583 LARGE_INTEGER IoReadTransferCount
;
584 LARGE_INTEGER IoWriteTransferCount
;
585 LARGE_INTEGER IoOtherTransferCount
;
586 #if (NTDDI_VERSION < NTDDI_LONGHORN)
587 ULONG KeContextSwitches
;
593 REQUEST_MAILBOX RequestMailbox
[64];
594 UINT64 SenderSummary
;
596 KDPC_DATA DpcData
[2];
598 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
603 LONG MaximumDpcQueueDepth
;
604 ULONG DpcRequestRate
;
605 ULONG MinimumDpcRate
;
606 UCHAR DpcInterruptRequested
;
607 UCHAR DpcThreadRequested
;
608 UCHAR DpcRoutineActive
;
609 UCHAR DpcThreadActive
;
615 UCHAR ThreadDpcEnable
;
619 LONG DpcSetEventRequest
;
620 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
621 ULONG KeExceptionDispatchCount
;
627 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
631 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
633 UCHAR ClockCheckSlot
;
634 UCHAR ClockPollCycle
;
636 LONG DpcWatchdogPeriod
;
637 LONG DpcWatchdogCount
;
642 LIST_ENTRY WaitListHead
;
643 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
648 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
649 UINT64 PrcbPad71
[12];
651 LIST_ENTRY DispatcherReadyListHead
[32];
652 ULONG InterruptCount
;
657 ULONG AdjustDpcThreshold
;
659 UCHAR DebuggerSavedIRQL
;
661 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
671 struct _KNODE
*ParentNode
;
672 UINT64 MultiThreadProcessorSet
;
673 struct _KPRCB
*MultiThreadSetMaster
;
674 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
676 LONG MmSpinLockOrdering
;
679 ULONG NodeShiftedColor
;
680 ULONG SecondaryColorMask
;
683 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
685 ULONG CcFastMdlReadNoWait
;
686 ULONG CcFastMdlReadWait
;
687 ULONG CcFastMdlReadNotPossible
;
688 ULONG CcMapDataNoWait
;
690 ULONG CcPinMappedDataCount
;
691 ULONG CcPinReadNoWait
;
693 ULONG CcMdlReadNoWait
;
695 ULONG CcLazyWriteHotSpots
;
696 ULONG CcLazyWriteIos
;
697 ULONG CcLazyWritePages
;
700 ULONG CcLostDelayedWrites
;
701 ULONG CcFastReadResourceMiss
;
702 ULONG CcCopyReadWaitMiss
;
703 ULONG CcFastMdlReadResourceMiss
;
704 ULONG CcMapDataNoWaitMiss
;
705 ULONG CcMapDataWaitMiss
;
706 ULONG CcPinReadNoWaitMiss
;
707 ULONG CcPinReadWaitMiss
;
708 ULONG CcMdlReadNoWaitMiss
;
709 ULONG CcMdlReadWaitMiss
;
710 ULONG CcReadAheadIos
;
711 LONG MmCacheTransitionCount
;
712 LONG MmCacheReadCount
;
715 PROCESSOR_POWER_STATE PowerState
;
716 ULONG KeAlignmentFixupCount
;
717 UCHAR VendorString
[13];
720 LARGE_INTEGER UpdateSignature
;
722 KTIMER DpcWatchdogTimer
;
723 CACHE_DESCRIPTOR Cache
[5];
726 ULONG CachedResidentAvailable
;
730 SLIST_HEADER InterruptObjectPool
;
731 SLIST_HEADER HypercallPageList
;
732 PVOID HypercallPageVirtual
;
733 PVOID VirtualApicAssist
;
734 UINT64
* StatisticsPage
;
736 UINT64 CacheProcessorMask
[5];
737 UINT64 PackageProcessorSet
;
738 UINT64 CoreProcessorSet
;
744 ULONG NodeShiftedColor
;
745 ULONG SecondaryColorMask
;
747 ULONG CcFastReadNoWait
;
748 ULONG CcFastReadWait
;
749 ULONG CcFastReadNotPossible
;
750 ULONG CcCopyReadNoWait
;
751 ULONG CcCopyReadWait
;
752 ULONG CcCopyReadNoWaitMiss
;
753 ULONG KeAlignmentFixupCount
;
754 ULONG KeDcacheFlushCount
;
755 ULONG KeExceptionDispatchCount
;
756 ULONG KeFirstLevelTbFills
;
757 ULONG KeFloatingEmulationCount
;
758 ULONG KeIcacheFlushCount
;
759 ULONG KeSecondLevelTbFills
;
760 UCHAR VendorString
[13];
763 LARGE_INTEGER UpdateSignature
;
764 PROCESSOR_POWER_STATE PowerState
;
765 CACHE_DESCRIPTOR Cache
[5];
772 // Processor Control Region
774 typedef struct _KIPCR
781 union _KGDTENTRY64
*GdtBase
;
782 struct _KTSS64
*TssBase
;
785 struct _KPRCB
*CurrentPrcb
;
786 PKSPIN_LOCK_QUEUE LockArray
;
790 union _KIDTENTRY64
*IdtBase
;
793 UCHAR SecondLevelCacheAssociativity
;
794 UCHAR ObsoleteNumber
;
799 ULONG StallScaleFactor
;
801 ULONG KernelReserved
[15];
802 ULONG SecondLevelCacheSize
;
803 ULONG HalReserved
[16];
806 PVOID KdVersionBlock
; // 0x108
809 ULONG Fill2
[2]; // 0x178
813 ULONG ContextSwitches
;
821 typedef struct _KiIoAccessMap
823 UCHAR DirectionMap
[32];
829 typedef struct _KTSS64
831 /* 000 */ ULONG Reserved0
;
832 /* 004 */ UINT64 Rsp0
;
833 /* 00c */ UINT64 Rsp1
;
834 /* 014 */ UINT64 Rsp2
;
835 /* 01c */ UINT64 Ist
[8];
836 /* 05c */ UINT64 Reserved1
;
837 /* 064 */ USHORT Reserved2
;
838 /* 066 */ USHORT IoMapBase
;
842 #define PKTSS PKTSS64
847 typedef struct _KEXCEPTION_FRAME
866 UINT64 CallbackStack
;
879 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
881 typedef struct _DISPATCHER_CONTEXT
886 PVOID EstablisherFrame
;
889 PVOID LanguageHandler
;
893 } DISPATCHER_CONTEXT
, *PDISPATCHER_CONTEXT
;
896 typedef struct _KSTART_FRAME
904 } KSTART_FRAME
, *PKSTART_FRAME
;
906 typedef struct _KSWITCH_FRAME
916 } KSWITCH_FRAME
, *PKSWITCH_FRAME
;
919 typedef struct _KTIMER_TABLE_ENTRY
924 } KTIMER_TABLE_ENTRY
, *PKTIMER_TABLE_ENTRY
;
926 typedef struct _KTIMER_TABLE
928 KTIMER
* TimerExpiry
[64];
929 KTIMER_TABLE_ENTRY TimerEntries
[256];
930 } KTIMER_TABLE
, *PKTIMER_TABLE
;
934 // Inline function to get current KPRCB
938 KeGetCurrentPrcb(VOID
)
940 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));