2 /** Kernel definitions for AMD64 **/
4 /* Interrupt request levels */
5 #define PASSIVE_LEVEL 0
8 #define DISPATCH_LEVEL 2
10 #define CLOCK_LEVEL 13
13 #define POWER_LEVEL 14
14 #define PROFILE_LEVEL 15
17 #define PAGE_SIZE 0x1000
18 #define PAGE_SHIFT 12L
20 #define KI_USER_SHARED_DATA 0xFFFFF78000000000UI64
21 #define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA)
24 typedef struct _KFLOATING_SAVE
{
26 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
28 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
30 #define KeQueryInterruptTime() \
31 (*(volatile ULONG64*)SharedInterruptTime)
33 #define KeQuerySystemTime(CurrentCount) \
34 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
36 #define KeQueryTickCount(CurrentCount) \
37 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
39 #define KeGetDcacheFillSize() 1L
41 #define YieldProcessor _mm_pause
45 KeGetCurrentIrql(VOID
)
47 return (KIRQL
)__readcr8();
52 KeLowerIrql(IN KIRQL NewIrql
)
54 ASSERT(KeGetCurrentIrql() >= NewIrql
);
60 KfRaiseIrql(IN KIRQL NewIrql
)
64 OldIrql
= __readcr8();
65 ASSERT(OldIrql
<= NewIrql
);
69 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
73 KeRaiseIrqlToDpcLevel(VOID
)
75 return KfRaiseIrql(DISPATCH_LEVEL
);
80 KeRaiseIrqlToSynchLevel(VOID
)
82 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
87 KeGetCurrentThread(VOID
)
89 return (struct _KTHREAD
*)__readgsqword(0x188);
92 /* x86 and x64 performs a 0x2C interrupt */
93 #define DbgRaiseAssertionFailure __int2c
98 #define PAUSE_PROCESSOR YieldProcessor();
100 #define KERNEL_STACK_SIZE 0x6000
101 #define KERNEL_LARGE_STACK_SIZE 0x12000
102 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
104 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
106 #define EXCEPTION_READ_FAULT 0
107 #define EXCEPTION_WRITE_FAULT 1
108 #define EXCEPTION_EXECUTE_FAULT 8
110 #if !defined(RC_INVOKED)
112 #define CONTEXT_AMD64 0x100000
114 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
115 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
116 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
117 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
118 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
120 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
121 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
123 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
125 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
126 #define CONTEXT_SERVICE_ACTIVE 0x10000000
127 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
128 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
130 #endif /* !defined(RC_INVOKED) */
132 #define INITIAL_MXCSR 0x1f80
133 #define INITIAL_FPCSR 0x027f
135 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
175 XMM_SAVE_AREA32 FltSave
;
197 M128A VectorRegister
[26];
198 ULONG64 VectorControl
;
199 ULONG64 DebugControl
;
200 ULONG64 LastBranchToRip
;
201 ULONG64 LastBranchFromRip
;
202 ULONG64 LastExceptionToRip
;
203 ULONG64 LastExceptionFromRip
;
208 _ANONYMOUS_UNION
union
211 _ANONYMOUS_STRUCT
struct
213 union _KGDTENTRY64
*GdtBase
;
214 struct _KTSS64
*TssBase
;
217 struct _KPRCB
*CurrentPrcb
;
218 PKSPIN_LOCK_QUEUE LockArray
;
222 union _KIDTENTRY64
*IdtBase
;
225 UCHAR SecondLevelCacheAssociativity
;
226 UCHAR ObsoleteNumber
;
231 ULONG StallScaleFactor
;
233 ULONG KernelReserved
[15];
234 ULONG SecondLevelCacheSize
;
235 ULONG HalReserved
[16];
237 PVOID KdVersionBlock
;
246 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
251 KeGetCurrentProcessorNumber(VOID
)
253 return (ULONG
)__readgsword(0x184);