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 KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
18 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
19 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
20 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
21 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
23 #define PAGE_SIZE 0x1000
24 #define PAGE_SHIFT 12L
26 #define EFLAG_SIGN 0x8000
27 #define EFLAG_ZERO 0x4000
28 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
30 typedef struct _KFLOATING_SAVE
33 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
35 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
37 #define KeQueryInterruptTime() \
38 (*(volatile ULONG64*)SharedInterruptTime)
40 #define KeQuerySystemTime(CurrentCount) \
41 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
43 #define KeQueryTickCount(CurrentCount) \
44 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
46 #define KeGetDcacheFillSize() 1L
48 #define YieldProcessor _mm_pause
49 #define MemoryBarrier __faststorefence
50 #define FastFence __faststorefence
51 #define LoadFence _mm_lfence
52 #define MemoryFence _mm_mfence
53 #define StoreFence _mm_sfence
54 #define LFENCE_ACQUIRE() LoadFence()
61 // FIXME: Do we really need lfence after the __faststorefence ?
66 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
68 _IRQL_requires_max_(HIGH_LEVEL
)
72 KeGetCurrentIrql(VOID
)
74 return (KIRQL
)__readcr8();
77 _IRQL_requires_max_(HIGH_LEVEL
)
81 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql
)
83 //ASSERT((KIRQL)__readcr8() >= NewIrql);
87 _IRQL_requires_max_(HIGH_LEVEL
)
88 _IRQL_raises_(NewIrql
)
97 OldIrql
= (KIRQL
)__readcr8();
98 //ASSERT(OldIrql <= NewIrql);
102 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
104 _IRQL_requires_max_(DISPATCH_LEVEL
)
106 _IRQL_raises_(DISPATCH_LEVEL
)
109 KeRaiseIrqlToDpcLevel(
112 return KfRaiseIrql(DISPATCH_LEVEL
);
117 KeRaiseIrqlToSynchLevel(VOID
)
119 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
124 KeGetCurrentThread(VOID
)
126 return (struct _KTHREAD
*)__readgsqword(0x188);
129 _Always_(_Post_satisfies_(return<=0))
130 _Must_inspect_result_
131 _IRQL_requires_max_(DISPATCH_LEVEL
)
133 _At_(*FloatSave
, _Kernel_requires_resource_not_held_(FloatState
) _Kernel_acquires_resource_(FloatState
))
136 KeSaveFloatingPointState(
137 _Out_ PKFLOATING_SAVE FloatSave
)
139 UNREFERENCED_PARAMETER(FloatSave
);
140 return STATUS_SUCCESS
;
144 _Kernel_float_restored_
145 _At_(*FloatSave
, _Kernel_requires_resource_held_(FloatState
) _Kernel_releases_resource_(FloatState
))
148 KeRestoreFloatingPointState(
149 _In_ PKFLOATING_SAVE FloatSave
)
151 UNREFERENCED_PARAMETER(FloatSave
);
152 return STATUS_SUCCESS
;
158 * IN BOOLEAN ReadOperation,
159 * IN BOOLEAN DmaOperation)
161 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
163 /* x86 and x64 performs a 0x2C interrupt */
164 #define DbgRaiseAssertionFailure __int2c
166 $endif
/* _WDMDDK_ */
169 #define PAUSE_PROCESSOR YieldProcessor();
171 #define KERNEL_STACK_SIZE 0x6000
172 #define KERNEL_LARGE_STACK_SIZE 0x12000
173 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
175 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
177 #define EXCEPTION_READ_FAULT 0
178 #define EXCEPTION_WRITE_FAULT 1
179 #define EXCEPTION_EXECUTE_FAULT 8
181 #if !defined(RC_INVOKED)
183 #define CONTEXT_AMD64 0x100000
185 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
186 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
187 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
188 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
189 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
191 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
192 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
194 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
196 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
197 #define CONTEXT_SERVICE_ACTIVE 0x10000000
198 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
199 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
201 #endif /* !defined(RC_INVOKED) */
203 #define INITIAL_MXCSR 0x1f80
204 #define INITIAL_FPCSR 0x027f
206 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
246 XMM_SAVE_AREA32 FltSave
;
268 M128A VectorRegister
[26];
269 ULONG64 VectorControl
;
270 ULONG64 DebugControl
;
271 ULONG64 LastBranchToRip
;
272 ULONG64 LastBranchFromRip
;
273 ULONG64 LastExceptionToRip
;
274 ULONG64 LastExceptionFromRip
;
277 #define PCR_MINOR_VERSION 1
278 #define PCR_MAJOR_VERSION 1
282 _ANONYMOUS_UNION
union
285 _ANONYMOUS_STRUCT
struct
287 union _KGDTENTRY64
*GdtBase
;
288 struct _KTSS64
*TssBase
;
291 struct _KPRCB
*CurrentPrcb
;
292 PKSPIN_LOCK_QUEUE LockArray
;
296 union _KIDTENTRY64
*IdtBase
;
299 UCHAR SecondLevelCacheAssociativity
;
300 UCHAR ObsoleteNumber
;
305 ULONG StallScaleFactor
;
307 ULONG KernelReserved
[15];
308 ULONG SecondLevelCacheSize
;
309 ULONG HalReserved
[16];
311 PVOID KdVersionBlock
;
320 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
325 KeGetCurrentProcessorNumber(VOID
)
327 return (ULONG
)__readgsword(0x184);