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 KGDT_64_R0_CODE 0x0010
62 #define KGDT_64_R0_SS 0x0018
63 #define KGDT_64_DATA 0x0028 // 2b
64 #define KGDT_64_R3_CODE 0x0030 // 33
65 #define KGDT_TSS 0x0040
66 #define KGDT_32_R3_TEB 0x0050 // 53
80 #define CR4_FXSR 0x200
81 #define CR4_XMMEXCPT 0x400
86 #define EFLAGS_CF 0x01L
87 #define EFLAGS_ZF 0x40L
88 #define EFLAGS_TF 0x100L
89 #define EFLAGS_INTERRUPT_MASK 0x200L
90 #define EFLAGS_DF 0x400L
91 #define EFLAGS_NESTED_TASK 0x4000L
92 #define EFLAGS_V86_MASK 0x20000
93 #define EFLAGS_ALIGN_CHECK 0x40000
94 #define EFLAGS_VIF 0x80000
95 #define EFLAGS_VIP 0x100000
96 #define EFLAGS_USER_SANITIZE 0x3F4DD7
97 #define EFLAG_SIGN 0x8000
98 #define EFLAG_ZERO 0x4000
106 #define IPI_PACKET_READY 8
107 #define IPI_SYNCH_REQUEST 16
112 #define PRCB_MAJOR_VERSION 1
113 #define PRCB_BUILD_DEBUG 1
114 #define PRCB_BUILD_UNIPROCESSOR 2
119 #define INITIAL_STALL_COUNT 100
124 #define IO_ACCESS_MAP_NONE 0
125 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
126 #define KiComputeIopmOffset(MapNumber) \
127 (MapNumber == IO_ACCESS_MAP_NONE) ? \
128 (USHORT)(sizeof(KTSS)) : \
129 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
132 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
134 #define KSEG0_BASE 0xfffff80000000000ULL
137 // Synchronization-level IRQL
140 #define SYNCH_LEVEL DISPATCH_LEVEL
142 #define SYNCH_LEVEL (IPI_LEVEL - 2)
146 // Trap Frame Definition
148 typedef struct _KTRAP_FRAME
157 UCHAR FaultIndicator
;
158 UCHAR ExceptionActive
;
181 UINT64 ContextRecord
;
182 UINT64 TimeStampCKCL
;
195 UINT64 LastBranchToRip
;
196 UINT64 LastBranchFromRip
;
197 UINT64 LastExceptionToRip
;
198 UINT64 LastExceptionFromRip
;
202 UINT64 LastBranchControl
;
218 UINT64 ExceptionFrame
;
219 UINT64 TimeStampKlog
;
232 } KTRAP_FRAME
, *PKTRAP_FRAME
;
235 // Defines the Callback Stack Layout for User Mode Callbacks
237 typedef struct _KCALLOUT_FRAME
239 ULONG64 InitialStack
;
241 ULONG64 CallbackStack
;
246 ULONG64 ReturnAddress
;
248 ULONG64 ResultLength
;
249 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
254 typedef ULONG LDT_ENTRY
;
257 // GDT Entry Definition
259 typedef union _KGDTENTRY64
292 } KGDTENTRY64
, *PKGDTENTRY64
;
293 #define KGDTENTRY KGDTENTRY64
294 #define PKGDTENTRY PKGDTENTRY64
297 // IDT Entry Access Definition
299 typedef struct _KIDT_ACCESS
307 UCHAR SystemSegmentFlag
:1;
313 } KIDT_ACCESS
, *PKIDT_ACCESS
;
316 // IDT Entry Definition
318 typedef union _KIDTENTRY64
334 } KIDTENTRY64
, *PKIDTENTRY64
;
335 #define KIDTENTRY KIDTENTRY64
336 #define PKIDTENTRY PKIDTENTRY64
338 typedef struct _KDESCRIPTOR
343 } KDESCRIPTOR
, *PKDESCRIPTOR
;
345 #ifndef NTOS_MODE_USER
348 // Special Registers Structure (outside of CONTEXT)
350 typedef struct _KSPECIAL_REGISTERS
362 struct _KDESCRIPTOR Gdtr
;
363 struct _KDESCRIPTOR Idtr
;
368 UINT64 LastBranchToRip
;
369 UINT64 LastBranchFromRip
;
370 UINT64 LastExceptionToRip
;
371 UINT64 LastExceptionFromRip
;
378 UINT64 MsrSyscallMask
;
379 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
382 // Processor State Data
384 typedef struct _KPROCESSOR_STATE
386 KSPECIAL_REGISTERS SpecialRegisters
;
387 CONTEXT ContextFrame
;
388 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
390 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
391 typedef struct _GENERAL_LOOKASIDE_POOL
395 SLIST_HEADER ListHead
;
396 SINGLE_LIST_ENTRY SingleListHead
;
400 ULONG TotalAllocates
;
403 ULONG AllocateMisses
;
425 LIST_ENTRY ListEntry
;
426 ULONG LastTotalAllocates
;
429 ULONG LastAllocateMisses
;
430 ULONG LastAllocateHits
;
433 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
435 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
438 typedef struct _KREQUEST_PACKET
440 PVOID CurrentPacket
[3];
442 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
444 typedef struct _REQUEST_MAILBOX
446 INT64 RequestSummary
;
447 KREQUEST_PACKET RequestPacket
;
449 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
452 // Processor Region Control Block
455 typedef struct _KPRCB
458 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
464 UCHAR InterruptRequest
;
466 struct _KTHREAD
*CurrentThread
;
467 struct _KTHREAD
*NextThread
;
468 struct _KTHREAD
*IdleThread
;
469 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
479 KPROCESSOR_STATE ProcessorState
;
482 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
496 UINT64 HalReserved
[8];
501 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
502 UCHAR CoresPerPhysicalProcessor
;
503 UCHAR LogicalProcessorsPerCore
;
506 UCHAR LogicalProcessorsPerPhysicalProcessor
;
509 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
516 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
523 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
524 PP_LOOKASIDE_LIST PPLookasideList
[16];
525 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[32];
526 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[32];
527 UINT64 PacketBarrier
;
528 SINGLE_LIST_ENTRY DeferredReadyListHead
;
529 LONG MmPageFaultCount
;
530 LONG MmCopyOnWriteCount
;
531 LONG MmTransitionCount
;
532 #if (NTDDI_VERSION < NTDDI_LONGHORN)
533 LONG MmCacheTransitionCount
;
535 LONG MmDemandZeroCount
;
536 LONG MmPageReadCount
;
537 LONG MmPageReadIoCount
;
538 #if (NTDDI_VERSION < NTDDI_LONGHORN)
539 LONG MmCacheReadCount
;
542 LONG MmDirtyPagesWriteCount
;
543 LONG MmDirtyWriteIoCount
;
544 LONG MmMappedPagesWriteCount
;
545 LONG MmMappedWriteIoCount
;
546 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
548 ULONG KeContextSwitches
;
549 ULONG CcFastReadNoWait
;
550 ULONG CcFastReadWait
;
551 ULONG CcFastReadNotPossible
;
552 ULONG CcCopyReadNoWait
;
553 ULONG CcCopyReadWait
;
554 ULONG CcCopyReadNoWaitMiss
;
555 LONG LookasideIrpFloat
;
557 LONG LookasideIrpFloat
;
560 LONG IoReadOperationCount
;
561 LONG IoWriteOperationCount
;
562 LONG IoOtherOperationCount
;
563 LARGE_INTEGER IoReadTransferCount
;
564 LARGE_INTEGER IoWriteTransferCount
;
565 LARGE_INTEGER IoOtherTransferCount
;
566 #if (NTDDI_VERSION < NTDDI_LONGHORN)
567 ULONG KeContextSwitches
;
573 REQUEST_MAILBOX RequestMailbox
[64];
574 UINT64 SenderSummary
;
576 KDPC_DATA DpcData
[2];
578 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
583 LONG MaximumDpcQueueDepth
;
584 ULONG DpcRequestRate
;
585 ULONG MinimumDpcRate
;
586 UCHAR DpcInterruptRequested
;
587 UCHAR DpcThreadRequested
;
588 UCHAR DpcRoutineActive
;
589 UCHAR DpcThreadActive
;
595 UCHAR ThreadDpcEnable
;
599 LONG DpcSetEventRequest
;
600 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
601 ULONG KeExceptionDispatchCount
;
607 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
611 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
613 UCHAR ClockCheckSlot
;
614 UCHAR ClockPollCycle
;
616 LONG DpcWatchdogPeriod
;
617 LONG DpcWatchdogCount
;
622 LIST_ENTRY WaitListHead
;
623 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
628 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
629 UINT64 PrcbPad71
[12];
631 LIST_ENTRY DispatcherReadyListHead
[32];
632 ULONG InterruptCount
;
637 ULONG AdjustDpcThreshold
;
639 UCHAR DebuggerSavedIRQL
;
641 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
651 struct _KNODE
*ParentNode
;
652 UINT64 MultiThreadProcessorSet
;
653 struct _KPRCB
*MultiThreadSetMaster
;
654 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
656 LONG MmSpinLockOrdering
;
659 ULONG NodeShiftedColor
;
660 ULONG SecondaryColorMask
;
663 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
665 ULONG CcFastMdlReadNoWait
;
666 ULONG CcFastMdlReadWait
;
667 ULONG CcFastMdlReadNotPossible
;
668 ULONG CcMapDataNoWait
;
670 ULONG CcPinMappedDataCount
;
671 ULONG CcPinReadNoWait
;
673 ULONG CcMdlReadNoWait
;
675 ULONG CcLazyWriteHotSpots
;
676 ULONG CcLazyWriteIos
;
677 ULONG CcLazyWritePages
;
680 ULONG CcLostDelayedWrites
;
681 ULONG CcFastReadResourceMiss
;
682 ULONG CcCopyReadWaitMiss
;
683 ULONG CcFastMdlReadResourceMiss
;
684 ULONG CcMapDataNoWaitMiss
;
685 ULONG CcMapDataWaitMiss
;
686 ULONG CcPinReadNoWaitMiss
;
687 ULONG CcPinReadWaitMiss
;
688 ULONG CcMdlReadNoWaitMiss
;
689 ULONG CcMdlReadWaitMiss
;
690 ULONG CcReadAheadIos
;
691 LONG MmCacheTransitionCount
;
692 LONG MmCacheReadCount
;
695 PROCESSOR_POWER_STATE PowerState
;
696 ULONG KeAlignmentFixupCount
;
697 UCHAR VendorString
[13];
700 LARGE_INTEGER UpdateSignature
;
702 KTIMER DpcWatchdogTimer
;
703 CACHE_DESCRIPTOR Cache
[5];
706 ULONG CachedResidentAvailable
;
710 SLIST_HEADER InterruptObjectPool
;
711 SLIST_HEADER HypercallPageList
;
712 PVOID HypercallPageVirtual
;
713 PVOID VirtualApicAssist
;
714 UINT64
* StatisticsPage
;
716 UINT64 CacheProcessorMask
[5];
717 UINT64 PackageProcessorSet
;
718 UINT64 CoreProcessorSet
;
724 ULONG NodeShiftedColor
;
725 ULONG SecondaryColorMask
;
727 ULONG CcFastReadNoWait
;
728 ULONG CcFastReadWait
;
729 ULONG CcFastReadNotPossible
;
730 ULONG CcCopyReadNoWait
;
731 ULONG CcCopyReadWait
;
732 ULONG CcCopyReadNoWaitMiss
;
733 ULONG KeAlignmentFixupCount
;
734 ULONG KeDcacheFlushCount
;
735 ULONG KeExceptionDispatchCount
;
736 ULONG KeFirstLevelTbFills
;
737 ULONG KeFloatingEmulationCount
;
738 ULONG KeIcacheFlushCount
;
739 ULONG KeSecondLevelTbFills
;
740 UCHAR VendorString
[13];
743 LARGE_INTEGER UpdateSignature
;
744 PROCESSOR_POWER_STATE PowerState
;
745 CACHE_DESCRIPTOR Cache
[5];
752 // Processor Control Region
754 typedef struct _KIPCR
761 union _KGDTENTRY64
*GdtBase
;
762 struct _KTSS64
*TssBase
;
765 struct _KPRCB
*CurrentPrcb
;
766 PKSPIN_LOCK_QUEUE LockArray
;
770 union _KIDTENTRY64
*IdtBase
;
773 UCHAR SecondLevelCacheAssociativity
;
774 UCHAR ObsoleteNumber
;
779 ULONG StallScaleFactor
;
781 ULONG KernelReserved
[15];
782 ULONG SecondLevelCacheSize
;
783 ULONG HalReserved
[16];
786 PVOID KdVersionBlock
; // 0x108
789 ULONG Fill2
[2]; // 0x178
793 ULONG ContextSwitches
;
801 typedef struct _KiIoAccessMap
803 UCHAR DirectionMap
[32];
809 typedef struct _KTSS64
811 /* 000 */ ULONG Reserved0
;
812 /* 004 */ UINT64 Rsp0
;
813 /* 00c */ UINT64 Rsp1
;
814 /* 014 */ UINT64 Rsp2
;
815 /* 01c */ UINT64 Ist
[8];
816 /* 05c */ UINT64 Reserved1
;
817 /* 064 */ USHORT Reserved2
;
818 /* 066 */ USHORT IoMapBase
;
822 #define PKTSS PKTSS64
825 // i386 CPUs don't have exception frames
827 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
830 // Inline function to get current KPRCB
834 KeGetCurrentPrcb(VOID
)
836 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));