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
82 #define CR4_FXSR 0x200
83 #define CR4_XMMEXCPT 0x400
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
108 #define IPI_PACKET_READY 8
109 #define IPI_SYNCH_REQUEST 16
114 #define PRCB_MAJOR_VERSION 1
115 #define PRCB_BUILD_DEBUG 1
116 #define PRCB_BUILD_UNIPROCESSOR 2
121 #define INITIAL_STALL_COUNT 100
126 #define IO_ACCESS_MAP_NONE 0
127 #define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
128 #define KiComputeIopmOffset(MapNumber) \
129 (MapNumber == IO_ACCESS_MAP_NONE) ? \
130 (USHORT)(sizeof(KTSS)) : \
131 (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
134 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
136 #define KSEG0_BASE 0xfffff80000000000ULL
139 // Synchronization-level IRQL
142 #define SYNCH_LEVEL DISPATCH_LEVEL
144 #define SYNCH_LEVEL (IPI_LEVEL - 2)
148 // Trap Frame Definition
150 typedef struct _KTRAP_FRAME
159 UCHAR FaultIndicator
;
160 UCHAR ExceptionActive
;
183 UINT64 ContextRecord
;
184 UINT64 TimeStampCKCL
;
197 UINT64 LastBranchToRip
;
198 UINT64 LastBranchFromRip
;
199 UINT64 LastExceptionToRip
;
200 UINT64 LastExceptionFromRip
;
204 UINT64 LastBranchControl
;
220 UINT64 ExceptionFrame
;
221 UINT64 TimeStampKlog
;
234 } KTRAP_FRAME
, *PKTRAP_FRAME
;
237 // Defines the Callback Stack Layout for User Mode Callbacks
239 typedef struct _KCALLOUT_FRAME
241 ULONG64 InitialStack
;
243 ULONG64 CallbackStack
;
248 ULONG64 ReturnAddress
;
250 ULONG64 ResultLength
;
251 } KCALLOUT_FRAME
, *PKCALLOUT_FRAME
;
256 typedef ULONG LDT_ENTRY
;
259 // GDT Entry Definition
261 typedef union _KGDTENTRY64
294 } KGDTENTRY64
, *PKGDTENTRY64
;
295 #define KGDTENTRY KGDTENTRY64
296 #define PKGDTENTRY PKGDTENTRY64
299 // IDT Entry Access Definition
301 typedef struct _KIDT_ACCESS
309 UCHAR SystemSegmentFlag
:1;
315 } KIDT_ACCESS
, *PKIDT_ACCESS
;
318 // IDT Entry Definition
320 typedef union _KIDTENTRY64
336 } KIDTENTRY64
, *PKIDTENTRY64
;
337 #define KIDTENTRY KIDTENTRY64
338 #define PKIDTENTRY PKIDTENTRY64
340 typedef struct _KDESCRIPTOR
345 } KDESCRIPTOR
, *PKDESCRIPTOR
;
347 #ifndef NTOS_MODE_USER
350 // Special Registers Structure (outside of CONTEXT)
352 typedef struct _KSPECIAL_REGISTERS
364 struct _KDESCRIPTOR Gdtr
;
365 struct _KDESCRIPTOR Idtr
;
370 UINT64 LastBranchToRip
;
371 UINT64 LastBranchFromRip
;
372 UINT64 LastExceptionToRip
;
373 UINT64 LastExceptionFromRip
;
380 UINT64 MsrSyscallMask
;
381 } KSPECIAL_REGISTERS
, *PKSPECIAL_REGISTERS
;
384 // Processor State Data
386 typedef struct _KPROCESSOR_STATE
388 KSPECIAL_REGISTERS SpecialRegisters
;
389 CONTEXT ContextFrame
;
390 } KPROCESSOR_STATE
, *PKPROCESSOR_STATE
;
392 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
393 typedef struct _GENERAL_LOOKASIDE_POOL
397 SLIST_HEADER ListHead
;
398 SINGLE_LIST_ENTRY SingleListHead
;
402 ULONG TotalAllocates
;
405 ULONG AllocateMisses
;
427 LIST_ENTRY ListEntry
;
428 ULONG LastTotalAllocates
;
431 ULONG LastAllocateMisses
;
432 ULONG LastAllocateHits
;
435 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
437 #define GENERAL_LOOKASIDE_POOL PP_LOOKASIDE_LIST
440 typedef struct _KREQUEST_PACKET
442 PVOID CurrentPacket
[3];
444 } KREQUEST_PACKET
, *PKREQUEST_PACKET
;
446 typedef struct _REQUEST_MAILBOX
448 INT64 RequestSummary
;
449 KREQUEST_PACKET RequestPacket
;
451 } REQUEST_MAILBOX
, *PREQUEST_MAILBOX
;
454 // Processor Region Control Block
457 typedef struct _KPRCB
460 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
466 UCHAR InterruptRequest
;
468 struct _KTHREAD
*CurrentThread
;
469 struct _KTHREAD
*NextThread
;
470 struct _KTHREAD
*IdleThread
;
471 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
481 KPROCESSOR_STATE ProcessorState
;
484 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
498 UINT64 HalReserved
[8];
503 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
504 UCHAR CoresPerPhysicalProcessor
;
505 UCHAR LogicalProcessorsPerCore
;
508 UCHAR LogicalProcessorsPerPhysicalProcessor
;
511 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
518 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
525 KSPIN_LOCK_QUEUE LockQueue
[LockQueueMaximumLock
]; // 2003: 33, vista:49
526 PP_LOOKASIDE_LIST PPLookasideList
[16];
527 GENERAL_LOOKASIDE_POOL PPNPagedLookasideList
[32];
528 GENERAL_LOOKASIDE_POOL PPPagedLookasideList
[32];
529 UINT64 PacketBarrier
;
530 SINGLE_LIST_ENTRY DeferredReadyListHead
;
531 LONG MmPageFaultCount
;
532 LONG MmCopyOnWriteCount
;
533 LONG MmTransitionCount
;
534 #if (NTDDI_VERSION < NTDDI_LONGHORN)
535 LONG MmCacheTransitionCount
;
537 LONG MmDemandZeroCount
;
538 LONG MmPageReadCount
;
539 LONG MmPageReadIoCount
;
540 #if (NTDDI_VERSION < NTDDI_LONGHORN)
541 LONG MmCacheReadCount
;
544 LONG MmDirtyPagesWriteCount
;
545 LONG MmDirtyWriteIoCount
;
546 LONG MmMappedPagesWriteCount
;
547 LONG MmMappedWriteIoCount
;
548 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
550 ULONG KeContextSwitches
;
551 ULONG CcFastReadNoWait
;
552 ULONG CcFastReadWait
;
553 ULONG CcFastReadNotPossible
;
554 ULONG CcCopyReadNoWait
;
555 ULONG CcCopyReadWait
;
556 ULONG CcCopyReadNoWaitMiss
;
557 LONG LookasideIrpFloat
;
559 LONG LookasideIrpFloat
;
562 LONG IoReadOperationCount
;
563 LONG IoWriteOperationCount
;
564 LONG IoOtherOperationCount
;
565 LARGE_INTEGER IoReadTransferCount
;
566 LARGE_INTEGER IoWriteTransferCount
;
567 LARGE_INTEGER IoOtherTransferCount
;
568 #if (NTDDI_VERSION < NTDDI_LONGHORN)
569 ULONG KeContextSwitches
;
575 REQUEST_MAILBOX RequestMailbox
[64];
576 UINT64 SenderSummary
;
578 KDPC_DATA DpcData
[2];
580 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
585 LONG MaximumDpcQueueDepth
;
586 ULONG DpcRequestRate
;
587 ULONG MinimumDpcRate
;
588 UCHAR DpcInterruptRequested
;
589 UCHAR DpcThreadRequested
;
590 UCHAR DpcRoutineActive
;
591 UCHAR DpcThreadActive
;
597 UCHAR ThreadDpcEnable
;
601 LONG DpcSetEventRequest
;
602 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
603 ULONG KeExceptionDispatchCount
;
609 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
613 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
615 UCHAR ClockCheckSlot
;
616 UCHAR ClockPollCycle
;
618 LONG DpcWatchdogPeriod
;
619 LONG DpcWatchdogCount
;
624 LIST_ENTRY WaitListHead
;
625 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
630 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
631 UINT64 PrcbPad71
[12];
633 LIST_ENTRY DispatcherReadyListHead
[32];
634 ULONG InterruptCount
;
639 ULONG AdjustDpcThreshold
;
641 UCHAR DebuggerSavedIRQL
;
643 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
653 struct _KNODE
*ParentNode
;
654 UINT64 MultiThreadProcessorSet
;
655 struct _KPRCB
*MultiThreadSetMaster
;
656 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
658 LONG MmSpinLockOrdering
;
661 ULONG NodeShiftedColor
;
662 ULONG SecondaryColorMask
;
665 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
667 ULONG CcFastMdlReadNoWait
;
668 ULONG CcFastMdlReadWait
;
669 ULONG CcFastMdlReadNotPossible
;
670 ULONG CcMapDataNoWait
;
672 ULONG CcPinMappedDataCount
;
673 ULONG CcPinReadNoWait
;
675 ULONG CcMdlReadNoWait
;
677 ULONG CcLazyWriteHotSpots
;
678 ULONG CcLazyWriteIos
;
679 ULONG CcLazyWritePages
;
682 ULONG CcLostDelayedWrites
;
683 ULONG CcFastReadResourceMiss
;
684 ULONG CcCopyReadWaitMiss
;
685 ULONG CcFastMdlReadResourceMiss
;
686 ULONG CcMapDataNoWaitMiss
;
687 ULONG CcMapDataWaitMiss
;
688 ULONG CcPinReadNoWaitMiss
;
689 ULONG CcPinReadWaitMiss
;
690 ULONG CcMdlReadNoWaitMiss
;
691 ULONG CcMdlReadWaitMiss
;
692 ULONG CcReadAheadIos
;
693 LONG MmCacheTransitionCount
;
694 LONG MmCacheReadCount
;
697 PROCESSOR_POWER_STATE PowerState
;
698 ULONG KeAlignmentFixupCount
;
699 UCHAR VendorString
[13];
702 LARGE_INTEGER UpdateSignature
;
704 KTIMER DpcWatchdogTimer
;
705 CACHE_DESCRIPTOR Cache
[5];
708 ULONG CachedResidentAvailable
;
712 SLIST_HEADER InterruptObjectPool
;
713 SLIST_HEADER HypercallPageList
;
714 PVOID HypercallPageVirtual
;
715 PVOID VirtualApicAssist
;
716 UINT64
* StatisticsPage
;
718 UINT64 CacheProcessorMask
[5];
719 UINT64 PackageProcessorSet
;
720 UINT64 CoreProcessorSet
;
726 ULONG NodeShiftedColor
;
727 ULONG SecondaryColorMask
;
729 ULONG CcFastReadNoWait
;
730 ULONG CcFastReadWait
;
731 ULONG CcFastReadNotPossible
;
732 ULONG CcCopyReadNoWait
;
733 ULONG CcCopyReadWait
;
734 ULONG CcCopyReadNoWaitMiss
;
735 ULONG KeAlignmentFixupCount
;
736 ULONG KeDcacheFlushCount
;
737 ULONG KeExceptionDispatchCount
;
738 ULONG KeFirstLevelTbFills
;
739 ULONG KeFloatingEmulationCount
;
740 ULONG KeIcacheFlushCount
;
741 ULONG KeSecondLevelTbFills
;
742 UCHAR VendorString
[13];
745 LARGE_INTEGER UpdateSignature
;
746 PROCESSOR_POWER_STATE PowerState
;
747 CACHE_DESCRIPTOR Cache
[5];
754 // Processor Control Region
756 typedef struct _KIPCR
763 union _KGDTENTRY64
*GdtBase
;
764 struct _KTSS64
*TssBase
;
767 struct _KPRCB
*CurrentPrcb
;
768 PKSPIN_LOCK_QUEUE LockArray
;
772 union _KIDTENTRY64
*IdtBase
;
775 UCHAR SecondLevelCacheAssociativity
;
776 UCHAR ObsoleteNumber
;
781 ULONG StallScaleFactor
;
783 ULONG KernelReserved
[15];
784 ULONG SecondLevelCacheSize
;
785 ULONG HalReserved
[16];
788 PVOID KdVersionBlock
; // 0x108
791 ULONG Fill2
[2]; // 0x178
795 ULONG ContextSwitches
;
803 typedef struct _KiIoAccessMap
805 UCHAR DirectionMap
[32];
811 typedef struct _KTSS64
813 /* 000 */ ULONG Reserved0
;
814 /* 004 */ UINT64 Rsp0
;
815 /* 00c */ UINT64 Rsp1
;
816 /* 014 */ UINT64 Rsp2
;
817 /* 01c */ UINT64 Ist
[8];
818 /* 05c */ UINT64 Reserved1
;
819 /* 064 */ USHORT Reserved2
;
820 /* 066 */ USHORT IoMapBase
;
824 #define PKTSS PKTSS64
827 // i386 CPUs don't have exception frames
829 typedef struct _KEXCEPTION_FRAME KEXCEPTION_FRAME
, *PKEXCEPTION_FRAME
;
832 // Inline function to get current KPRCB
836 KeGetCurrentPrcb(VOID
)
838 return (struct _KPRCB
*)__readgsqword(FIELD_OFFSET(KIPCR
, CurrentPrcb
));