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 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
31 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
32 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
35 typedef struct _KFLOATING_SAVE
{
37 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
39 typedef XSAVE_FORMAT XMM_SAVE_AREA32
, *PXMM_SAVE_AREA32
;
41 #define KeQueryInterruptTime() \
42 (*(volatile ULONG64*)SharedInterruptTime)
44 #define KeQuerySystemTime(CurrentCount) \
45 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
47 #define KeQueryTickCount(CurrentCount) \
48 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
50 #define KeGetDcacheFillSize() 1L
52 #define YieldProcessor _mm_pause
56 KeGetCurrentIrql(VOID
)
58 return (KIRQL
)__readcr8();
63 KeLowerIrql(IN KIRQL NewIrql
)
65 //ASSERT(KeGetCurrentIrql() >= NewIrql);
71 KfRaiseIrql(IN KIRQL NewIrql
)
75 OldIrql
= __readcr8();
76 //ASSERT(OldIrql <= NewIrql);
80 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
84 KeRaiseIrqlToDpcLevel(VOID
)
86 return KfRaiseIrql(DISPATCH_LEVEL
);
91 KeRaiseIrqlToSynchLevel(VOID
)
93 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
98 KeGetCurrentThread(VOID
)
100 return (struct _KTHREAD
*)__readgsqword(0x188);
106 * IN BOOLEAN ReadOperation,
107 * IN BOOLEAN DmaOperation)
109 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
111 /* x86 and x64 performs a 0x2C interrupt */
112 #define DbgRaiseAssertionFailure __int2c
114 $endif
/* _WDMDDK_ */
117 #define PAUSE_PROCESSOR YieldProcessor();
119 #define KERNEL_STACK_SIZE 0x6000
120 #define KERNEL_LARGE_STACK_SIZE 0x12000
121 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
123 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
125 #define EXCEPTION_READ_FAULT 0
126 #define EXCEPTION_WRITE_FAULT 1
127 #define EXCEPTION_EXECUTE_FAULT 8
129 #if !defined(RC_INVOKED)
131 #define CONTEXT_AMD64 0x100000
133 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
134 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
135 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
136 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
137 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
139 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
140 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
142 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
144 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
145 #define CONTEXT_SERVICE_ACTIVE 0x10000000
146 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
147 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
149 #endif /* !defined(RC_INVOKED) */
151 #define INITIAL_MXCSR 0x1f80
152 #define INITIAL_FPCSR 0x027f
154 typedef struct DECLSPEC_ALIGN(16) _CONTEXT
{
194 XMM_SAVE_AREA32 FltSave
;
216 M128A VectorRegister
[26];
217 ULONG64 VectorControl
;
218 ULONG64 DebugControl
;
219 ULONG64 LastBranchToRip
;
220 ULONG64 LastBranchFromRip
;
221 ULONG64 LastExceptionToRip
;
222 ULONG64 LastExceptionFromRip
;
225 #define PCR_MINOR_VERSION 1
226 #define PCR_MAJOR_VERSION 1
230 _ANONYMOUS_UNION
union
233 _ANONYMOUS_STRUCT
struct
235 union _KGDTENTRY64
*GdtBase
;
236 struct _KTSS64
*TssBase
;
239 struct _KPRCB
*CurrentPrcb
;
240 PKSPIN_LOCK_QUEUE LockArray
;
244 union _KIDTENTRY64
*IdtBase
;
247 UCHAR SecondLevelCacheAssociativity
;
248 UCHAR ObsoleteNumber
;
253 ULONG StallScaleFactor
;
255 ULONG KernelReserved
[15];
256 ULONG SecondLevelCacheSize
;
257 ULONG HalReserved
[16];
259 PVOID KdVersionBlock
;
268 return (PKPCR
)__readgsqword(FIELD_OFFSET(KPCR
, Self
));
273 KeGetCurrentProcessorNumber(VOID
)
275 return (ULONG
)__readgsword(0x184);