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 ((PKUSER_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
{
32 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
34 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
36 #define KeQueryInterruptTime() \
37 (*(volatile ULONG64*)SharedInterruptTime)
39 #define KeQuerySystemTime(CurrentCount) \
40 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
42 #define KeQueryTickCount(CurrentCount) \
43 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
45 #define KeGetDcacheFillSize() 1L
47 #define YieldProcessor _mm_pause
51 KeGetCurrentIrql(VOID
)
53 return (KIRQL
)__readcr8();
58 KeLowerIrql(IN KIRQL NewIrql
)
60 //ASSERT(KeGetCurrentIrql() >= NewIrql);
66 KfRaiseIrql(IN KIRQL NewIrql
)
70 OldIrql
= (KIRQL
)__readcr8();
71 //ASSERT(OldIrql <= NewIrql);
75 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
79 KeRaiseIrqlToDpcLevel(VOID
)
81 return KfRaiseIrql(DISPATCH_LEVEL
);
86 KeRaiseIrqlToSynchLevel(VOID
)
88 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
93 KeGetCurrentThread(VOID
)
95 return (struct _KTHREAD
*)__readgsqword(0x188);
101 * IN BOOLEAN ReadOperation,
102 * IN BOOLEAN DmaOperation)
104 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
106 /* x86 and x64 performs a 0x2C interrupt */
107 #define DbgRaiseAssertionFailure __int2c
109 $endif
/* _WDMDDK_ */
112 #define PAUSE_PROCESSOR YieldProcessor();
114 #define KERNEL_STACK_SIZE 0x6000
115 #define KERNEL_LARGE_STACK_SIZE 0x12000
116 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
118 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
120 #define EXCEPTION_READ_FAULT 0
121 #define EXCEPTION_WRITE_FAULT 1
122 #define EXCEPTION_EXECUTE_FAULT 8
124 #if !defined(RC_INVOKED)
126 #define CONTEXT_AMD64 0x100000
128 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
129 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
130 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
131 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
132 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
134 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
135 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
137 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
139 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
140 #define CONTEXT_SERVICE_ACTIVE 0x10000000
141 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
142 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
144 #endif /* !defined(RC_INVOKED) */
146 #define INITIAL_MXCSR 0x1f80
147 #define INITIAL_FPCSR 0x027f
149 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
189 XMM_SAVE_AREA32 FltSave
;
211 M128A VectorRegister
[26];
212 ULONG64 VectorControl
;
213 ULONG64 DebugControl
;
214 ULONG64 LastBranchToRip
;
215 ULONG64 LastBranchFromRip
;
216 ULONG64 LastExceptionToRip
;
217 ULONG64 LastExceptionFromRip
;
220 #define PCR_MINOR_VERSION 1
221 #define PCR_MAJOR_VERSION 1
225 _ANONYMOUS_UNION
union
228 _ANONYMOUS_STRUCT
struct
230 union _KGDTENTRY64
*GdtBase
;
231 struct _KTSS64
*TssBase
;
234 struct _KPRCB
*CurrentPrcb
;
235 PKSPIN_LOCK_QUEUE LockArray
;
239 union _KIDTENTRY64
*IdtBase
;
242 UCHAR SecondLevelCacheAssociativity
;
243 UCHAR ObsoleteNumber
;
248 ULONG StallScaleFactor
;
250 ULONG KernelReserved
[15];
251 ULONG SecondLevelCacheSize
;
252 ULONG HalReserved
[16];
254 PVOID KdVersionBlock
;
263 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
268 KeGetCurrentProcessorNumber(VOID
)
270 return (ULONG
)__readgsword(0x184);