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 - 14-Aug-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)
33 #define PCR ((volatile KPCR * const)__readgsqword(FIELD_OFFSET(KPCR, Self)))
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 KGDT64_NULL 0x0000
62 #define KGDT64_R0_CODE 0x0010
63 #define KGDT64_R0_DATA 0x0018
64 #define KGDT64_R3_CMCODE 0x0020
65 #define KGDT64_R3_DATA 0x0028
66 #define KGDT64_R3_CODE 0x0030
67 #define KGDT64_SYS_TSS 0x0040
68 #define KGDT64_R3_CMTEB 0x0050
81 #define CR4_FXSR 0x200
82 #define CR4_XMMEXCPT 0x400
87 #define EFLAGS_CF 0x01
88 #define EFLAGS_PF 0x04
89 #define EFLAGS_AF 0x10
90 #define EFLAGS_ZF 0x40
91 #define EFLAGS_SF 0x80
92 #define EFLAGS_TF 0x100
93 #define EFLAGS_INTERRUPT_MASK 0x200
94 #define EFLAGS_DF 0x400
95 #define EFLAGS_OF 0x800
96 #define EFLAGS_IOPL_MASK 0x3000
97 #define EFLAGS_NESTED_TASK 0x4000
98 #define EFLAGS_RF 0x10000
99 #define EFLAGS_VM 0x20000
100 #define EFLAGS_ALIGN_CHECK 0x40000
101 #define EFLAGS_VIF 0x80000
102 #define EFLAGS_VIP 0x100000
103 #define EFLAGS_ID 0x200000
104 #define EFLAGS_USER_SANITIZE 0x3F4DD7
112 #define IPI_PACKET_READY 8
113 #define IPI_SYNCH_REQUEST 16
118 #define PRCB_MAJOR_VERSION 1
119 #define PRCB_BUILD_DEBUG 1
120 #define PRCB_BUILD_UNIPROCESSOR 2
125 #define INITIAL_STALL_COUNT 100
130 #define IO_ACCESS_MAP_NONE 0
131 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
132 #define KiComputeIopmOffset(MapNumber) \
133 (MapNumber == IO_ACCESS_MAP_NONE) ? \
134 (USHORT)(sizeof(KTSS)) : \
135 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
138 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
140 #define KSEG0_BASE 0xfffff80000000000ULL
143 // Synchronization-level IRQL
146 #define SYNCH_LEVEL DISPATCH_LEVEL
148 #define SYNCH_LEVEL (IPI_LEVEL - 2)
152 // Trap Frame Definition
154 typedef struct _KTRAP_FRAME
163 UCHAR FaultIndicator
;
164 UCHAR ExceptionActive
;
187 UINT64 ContextRecord
;
188 UINT64 TimeStampCKCL
;
201 UINT64 LastBranchToRip
;
202 UINT64 LastBranchFromRip
;
203 UINT64 LastExceptionToRip
;
204 UINT64 LastExceptionFromRip
;
208 UINT64 LastBranchControl
;
224 UINT64 ExceptionFrame
;
225 UINT64 TimeStampKlog
;
238 } KTRAP_FRAME
, *PKTRAP_FRAME
;
241 // Defines the Callback Stack Layout for User Mode Callbacks
243 typedef struct _KCALLOUT_FRAME
245 ULONG64 InitialStack
;
247 ULONG64 CallbackStack
;
252 ULONG64 ReturnAddress
;
254 ULONG64 ResultLength
;
255 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
260 #ifndef _LDT_ENTRY_DEFINED
261 #define _LDT_ENTRY_DEFINED
262 typedef ULONG LDT_ENTRY
;
266 // GDT Entry Definition
268 typedef union _KGDTENTRY64
301 } KGDTENTRY64
, *PKGDTENTRY64
;
302 #define KGDTENTRY KGDTENTRY64
303 #define PKGDTENTRY PKGDTENTRY64
306 // IDT Entry Access Definition
308 typedef struct _KIDT_ACCESS
316 UCHAR SystemSegmentFlag
:1;
322 } KIDT_ACCESS
, *PKIDT_ACCESS
;
325 // IDT Entry Definition
327 typedef union _KIDTENTRY64
343 } KIDTENTRY64
, *PKIDTENTRY64
;
344 #define KIDTENTRY KIDTENTRY64
345 #define PKIDTENTRY PKIDTENTRY64
347 typedef struct _KDESCRIPTOR
352 } KDESCRIPTOR
, *PKDESCRIPTOR
;
354 #ifndef NTOS_MODE_USER
357 // Special Registers Structure (outside of CONTEXT)
359 typedef struct _KSPECIAL_REGISTERS
371 struct _KDESCRIPTOR Gdtr
;
372 struct _KDESCRIPTOR Idtr
;
377 UINT64 LastBranchToRip
;
378 UINT64 LastBranchFromRip
;
379 UINT64 LastExceptionToRip
;
380 UINT64 LastExceptionFromRip
;
387 UINT64 MsrSyscallMask
;
388 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
391 // Processor State Data
393 typedef struct _KPROCESSOR_STATE
395 KSPECIAL_REGISTERS SpecialRegisters
;
396 CONTEXT ContextFrame
;
397 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
399 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
400 typedef struct _GENERAL_LOOKASIDE_POOL
404 SLIST_HEADER ListHead
;
405 SINGLE_LIST_ENTRY SingleListHead
;
409 ULONG TotalAllocates
;
412 ULONG AllocateMisses
;
434 LIST_ENTRY ListEntry
;
435 ULONG LastTotalAllocates
;
438 ULONG LastAllocateMisses
;
439 ULONG LastAllocateHits
;
442 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
444 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
447 typedef struct _KREQUEST_PACKET
449 PVOID CurrentPacket
[3];
451 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
453 typedef struct _REQUEST_MAILBOX
455 INT64 RequestSummary
;
456 KREQUEST_PACKET RequestPacket
;
458 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
461 // Processor Region Control Block
464 typedef struct _KPRCB
467 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
473 UCHAR InterruptRequest
;
475 struct _KTHREAD
*CurrentThread
;
476 struct _KTHREAD
*NextThread
;
477 struct _KTHREAD
*IdleThread
;
478 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
488 KPROCESSOR_STATE ProcessorState
;
491 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
505 UINT64 HalReserved
[8];
510 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
511 UCHAR CoresPerPhysicalProcessor
;
512 UCHAR LogicalProcessorsPerCore
;
515 UCHAR LogicalProcessorsPerPhysicalProcessor
;
518 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
525 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
532 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
533 PP_LOOKASIDE_LIST PPLookasideList
[16];
534 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[32];
535 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[32];
536 UINT64 PacketBarrier
;
537 SINGLE_LIST_ENTRY DeferredReadyListHead
;
538 LONG MmPageFaultCount
;
539 LONG MmCopyOnWriteCount
;
540 LONG MmTransitionCount
;
541 #if (NTDDI_VERSION < NTDDI_LONGHORN)
542 LONG MmCacheTransitionCount
;
544 LONG MmDemandZeroCount
;
545 LONG MmPageReadCount
;
546 LONG MmPageReadIoCount
;
547 #if (NTDDI_VERSION < NTDDI_LONGHORN)
548 LONG MmCacheReadCount
;
551 LONG MmDirtyPagesWriteCount
;
552 LONG MmDirtyWriteIoCount
;
553 LONG MmMappedPagesWriteCount
;
554 LONG MmMappedWriteIoCount
;
555 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
557 ULONG KeContextSwitches
;
558 ULONG CcFastReadNoWait
;
559 ULONG CcFastReadWait
;
560 ULONG CcFastReadNotPossible
;
561 ULONG CcCopyReadNoWait
;
562 ULONG CcCopyReadWait
;
563 ULONG CcCopyReadNoWaitMiss
;
564 LONG LookasideIrpFloat
;
566 LONG LookasideIrpFloat
;
569 LONG IoReadOperationCount
;
570 LONG IoWriteOperationCount
;
571 LONG IoOtherOperationCount
;
572 LARGE_INTEGER IoReadTransferCount
;
573 LARGE_INTEGER IoWriteTransferCount
;
574 LARGE_INTEGER IoOtherTransferCount
;
575 #if (NTDDI_VERSION < NTDDI_LONGHORN)
576 ULONG KeContextSwitches
;
582 REQUEST_MAILBOX RequestMailbox
[64];
583 UINT64 SenderSummary
;
585 KDPC_DATA DpcData
[2];
587 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
592 LONG MaximumDpcQueueDepth
;
593 ULONG DpcRequestRate
;
594 ULONG MinimumDpcRate
;
595 UCHAR DpcInterruptRequested
;
596 UCHAR DpcThreadRequested
;
597 UCHAR DpcRoutineActive
;
598 UCHAR DpcThreadActive
;
604 UCHAR ThreadDpcEnable
;
608 LONG DpcSetEventRequest
;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
610 ULONG KeExceptionDispatchCount
;
616 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
620 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
622 UCHAR ClockCheckSlot
;
623 UCHAR ClockPollCycle
;
625 LONG DpcWatchdogPeriod
;
626 LONG DpcWatchdogCount
;
631 LIST_ENTRY WaitListHead
;
632 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
637 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
638 UINT64 PrcbPad71
[12];
640 LIST_ENTRY DispatcherReadyListHead
[32];
641 ULONG InterruptCount
;
646 ULONG AdjustDpcThreshold
;
648 UCHAR DebuggerSavedIRQL
;
650 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
660 struct _KNODE
*ParentNode
;
661 UINT64 MultiThreadProcessorSet
;
662 struct _KPRCB
*MultiThreadSetMaster
;
663 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
665 LONG MmSpinLockOrdering
;
668 ULONG NodeShiftedColor
;
669 ULONG SecondaryColorMask
;
672 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
674 ULONG CcFastMdlReadNoWait
;
675 ULONG CcFastMdlReadWait
;
676 ULONG CcFastMdlReadNotPossible
;
677 ULONG CcMapDataNoWait
;
679 ULONG CcPinMappedDataCount
;
680 ULONG CcPinReadNoWait
;
682 ULONG CcMdlReadNoWait
;
684 ULONG CcLazyWriteHotSpots
;
685 ULONG CcLazyWriteIos
;
686 ULONG CcLazyWritePages
;
689 ULONG CcLostDelayedWrites
;
690 ULONG CcFastReadResourceMiss
;
691 ULONG CcCopyReadWaitMiss
;
692 ULONG CcFastMdlReadResourceMiss
;
693 ULONG CcMapDataNoWaitMiss
;
694 ULONG CcMapDataWaitMiss
;
695 ULONG CcPinReadNoWaitMiss
;
696 ULONG CcPinReadWaitMiss
;
697 ULONG CcMdlReadNoWaitMiss
;
698 ULONG CcMdlReadWaitMiss
;
699 ULONG CcReadAheadIos
;
700 LONG MmCacheTransitionCount
;
701 LONG MmCacheReadCount
;
704 PROCESSOR_POWER_STATE PowerState
;
705 ULONG KeAlignmentFixupCount
;
706 UCHAR VendorString
[13];
709 LARGE_INTEGER UpdateSignature
;
711 KTIMER DpcWatchdogTimer
;
712 CACHE_DESCRIPTOR Cache
[5];
715 ULONG CachedResidentAvailable
;
719 SLIST_HEADER InterruptObjectPool
;
720 SLIST_HEADER HypercallPageList
;
721 PVOID HypercallPageVirtual
;
722 PVOID VirtualApicAssist
;
723 UINT64
* StatisticsPage
;
725 UINT64 CacheProcessorMask
[5];
726 UINT64 PackageProcessorSet
;
727 UINT64 CoreProcessorSet
;
733 ULONG NodeShiftedColor
;
734 ULONG SecondaryColorMask
;
736 ULONG CcFastReadNoWait
;
737 ULONG CcFastReadWait
;
738 ULONG CcFastReadNotPossible
;
739 ULONG CcCopyReadNoWait
;
740 ULONG CcCopyReadWait
;
741 ULONG CcCopyReadNoWaitMiss
;
742 ULONG KeAlignmentFixupCount
;
743 ULONG KeDcacheFlushCount
;
744 ULONG KeExceptionDispatchCount
;
745 ULONG KeFirstLevelTbFills
;
746 ULONG KeFloatingEmulationCount
;
747 ULONG KeIcacheFlushCount
;
748 ULONG KeSecondLevelTbFills
;
749 UCHAR VendorString
[13];
752 LARGE_INTEGER UpdateSignature
;
753 PROCESSOR_POWER_STATE PowerState
;
754 CACHE_DESCRIPTOR Cache
[5];
761 // Processor Control Region
763 typedef struct _KIPCR
770 union _KGDTENTRY64
*GdtBase
;
771 struct _KTSS64
*TssBase
;
774 struct _KPRCB
*CurrentPrcb
;
775 PKSPIN_LOCK_QUEUE LockArray
;
779 union _KIDTENTRY64
*IdtBase
;
782 UCHAR SecondLevelCacheAssociativity
;
783 UCHAR ObsoleteNumber
;
788 ULONG StallScaleFactor
;
790 ULONG KernelReserved
[15];
791 ULONG SecondLevelCacheSize
;
792 ULONG HalReserved
[16];
795 PVOID KdVersionBlock
; // 0x108
798 ULONG Fill2
[2]; // 0x178
802 ULONG ContextSwitches
;
810 typedef struct _KiIoAccessMap
812 UCHAR DirectionMap
[32];
818 typedef struct _KTSS64
820 /* 000 */ ULONG Reserved0
;
821 /* 004 */ UINT64 Rsp0
;
822 /* 00c */ UINT64 Rsp1
;
823 /* 014 */ UINT64 Rsp2
;
824 /* 01c */ UINT64 Ist
[8];
825 /* 05c */ UINT64 Reserved1
;
826 /* 064 */ USHORT Reserved2
;
827 /* 066 */ USHORT IoMapBase
;
831 #define PKTSS PKTSS64
836 typedef struct _KEXCEPTION_FRAME
855 UINT64 CallbackStack
;
868 } KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
871 // Inline function to get current KPRCB
875 KeGetCurrentPrcb(VOID
)
877 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));
881 extern NTKERNELAPI
volatile KSYSTEM_TIME KeTickCount
;