1 $if (_WDMDDK_) 2 /** Kernel definitions for AMD64 **/ 3 4 /* Interrupt request levels */ 5 #define PASSIVE_LEVEL 0 6 #define LOW_LEVEL 0 7 #define APC_LEVEL 1 8 #define DISPATCH_LEVEL 2 9 #define CMCI_LEVEL 5 10 #define CLOCK_LEVEL 13 11 #define IPI_LEVEL 14 12 #define DRS_LEVEL 14 13 #define POWER_LEVEL 14 14 #define PROFILE_LEVEL 15 15 #define HIGH_LEVEL 15 16 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) 22 23 #define PAGE_SIZE 0x1000 24 #define PAGE_SHIFT 12L 25 26 #define EFLAG_SIGN 0x8000 27 #define EFLAG_ZERO 0x4000 28 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) 29 30 typedef struct _KFLOATING_SAVE 31 { 32 ULONG Dummy; 33 } KFLOATING_SAVE, *PKFLOATING_SAVE; 34 35 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; 36 37 #define KeQueryInterruptTime() \ 38 (*(volatile ULONG64*)SharedInterruptTime) 39 40 #define KeQuerySystemTime(CurrentCount) \ 41 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime 42 43 #define KeQueryTickCount(CurrentCount) \ 44 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount 45 46 #define KeGetDcacheFillSize() 1L 47 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() 55 56 FORCEINLINE 57 VOID 58 KeMemoryBarrier( 59 VOID) 60 { 61 // FIXME: Do we really need lfence after the __faststorefence ? 62 FastFence(); 63 LFENCE_ACQUIRE(); 64 } 65 66 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() 67 68 _IRQL_requires_max_(HIGH_LEVEL) 69 _IRQL_saves_ 70 FORCEINLINE 71 KIRQL 72 KeGetCurrentIrql(VOID) 73 { 74 return (KIRQL)__readcr8(); 75 } 76 77 _IRQL_requires_max_(HIGH_LEVEL) 78 FORCEINLINE 79 VOID 80 KeLowerIrql( 81 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql) 82 { 83 //ASSERT((KIRQL)__readcr8() >= NewIrql); 84 __writecr8(NewIrql); 85 } 86 87 _IRQL_requires_max_(HIGH_LEVEL) 88 _IRQL_raises_(NewIrql) 89 _IRQL_saves_ 90 FORCEINLINE 91 KIRQL 92 KfRaiseIrql( 93 _In_ KIRQL NewIrql) 94 { 95 KIRQL OldIrql; 96 97 OldIrql = (KIRQL)__readcr8(); 98 //ASSERT(OldIrql <= NewIrql); 99 __writecr8(NewIrql); 100 return OldIrql; 101 } 102 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) 103 104 _IRQL_requires_max_(DISPATCH_LEVEL) 105 _IRQL_saves_ 106 _IRQL_raises_(DISPATCH_LEVEL) 107 FORCEINLINE 108 KIRQL 109 KeRaiseIrqlToDpcLevel( 110 VOID) 111 { 112 return KfRaiseIrql(DISPATCH_LEVEL); 113 } 114 115 FORCEINLINE 116 KIRQL 117 KeRaiseIrqlToSynchLevel(VOID) 118 { 119 #ifdef CONFIG_SMP 120 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 121 #else 122 return KfRaiseIrql(2); // SYNCH_LEVEL = DISPATCH_LEVEL 123 #endif 124 } 125 126 FORCEINLINE 127 PKTHREAD 128 KeGetCurrentThread(VOID) 129 { 130 return (struct _KTHREAD *)__readgsqword(0x188); 131 } 132 133 _Always_(_Post_satisfies_(return<=0)) 134 _Must_inspect_result_ 135 _IRQL_requires_max_(DISPATCH_LEVEL) 136 _Kernel_float_saved_ 137 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) 138 FORCEINLINE 139 NTSTATUS 140 KeSaveFloatingPointState( 141 _Out_ PKFLOATING_SAVE FloatSave) 142 { 143 UNREFERENCED_PARAMETER(FloatSave); 144 return STATUS_SUCCESS; 145 } 146 147 _Success_(1) 148 _Kernel_float_restored_ 149 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) 150 FORCEINLINE 151 NTSTATUS 152 KeRestoreFloatingPointState( 153 _In_ PKFLOATING_SAVE FloatSave) 154 { 155 UNREFERENCED_PARAMETER(FloatSave); 156 return STATUS_SUCCESS; 157 } 158 159 #if (NTDDI_VERSION >= NTDDI_WIN7) 160 FORCEINLINE 161 ULONG 162 KeGetCurrentProcessorIndex(VOID) 163 { 164 return __readgsdword(0x1a4); 165 } 166 #endif 167 168 /* VOID 169 * KeFlushIoBuffers( 170 * IN PMDL Mdl, 171 * IN BOOLEAN ReadOperation, 172 * IN BOOLEAN DmaOperation) 173 */ 174 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) 175 176 /* x86 and x64 performs a 0x2C interrupt */ 177 #define DbgRaiseAssertionFailure __int2c 178 179 $endif /* _WDMDDK_ */ 180 $if (_NTDDK_) 181 182 #define PAUSE_PROCESSOR YieldProcessor(); 183 184 #define KERNEL_STACK_SIZE 0x6000 185 #define KERNEL_LARGE_STACK_SIZE 0x12000 186 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE 187 188 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 189 190 #define EXCEPTION_READ_FAULT 0 191 #define EXCEPTION_WRITE_FAULT 1 192 #define EXCEPTION_EXECUTE_FAULT 8 193 194 #if !defined(RC_INVOKED) 195 196 #define CONTEXT_AMD64 0x100000 197 198 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) 199 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) 200 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) 201 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) 202 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) 203 204 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) 205 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) 206 207 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x40L) 208 209 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000 210 #define CONTEXT_SERVICE_ACTIVE 0x10000000 211 #define CONTEXT_EXCEPTION_REQUEST 0x40000000 212 #define CONTEXT_EXCEPTION_REPORTING 0x80000000 213 214 #endif /* !defined(RC_INVOKED) */ 215 216 #define INITIAL_MXCSR 0x1f80 217 #define INITIAL_FPCSR 0x027f 218 219 typedef struct DECLSPEC_ALIGN(16) _CONTEXT { 220 ULONG64 P1Home; 221 ULONG64 P2Home; 222 ULONG64 P3Home; 223 ULONG64 P4Home; 224 ULONG64 P5Home; 225 ULONG64 P6Home; 226 ULONG ContextFlags; 227 ULONG MxCsr; 228 USHORT SegCs; 229 USHORT SegDs; 230 USHORT SegEs; 231 USHORT SegFs; 232 USHORT SegGs; 233 USHORT SegSs; 234 ULONG EFlags; 235 ULONG64 Dr0; 236 ULONG64 Dr1; 237 ULONG64 Dr2; 238 ULONG64 Dr3; 239 ULONG64 Dr6; 240 ULONG64 Dr7; 241 ULONG64 Rax; 242 ULONG64 Rcx; 243 ULONG64 Rdx; 244 ULONG64 Rbx; 245 ULONG64 Rsp; 246 ULONG64 Rbp; 247 ULONG64 Rsi; 248 ULONG64 Rdi; 249 ULONG64 R8; 250 ULONG64 R9; 251 ULONG64 R10; 252 ULONG64 R11; 253 ULONG64 R12; 254 ULONG64 R13; 255 ULONG64 R14; 256 ULONG64 R15; 257 ULONG64 Rip; 258 union { 259 XMM_SAVE_AREA32 FltSave; 260 struct { 261 M128A Header[2]; 262 M128A Legacy[8]; 263 M128A Xmm0; 264 M128A Xmm1; 265 M128A Xmm2; 266 M128A Xmm3; 267 M128A Xmm4; 268 M128A Xmm5; 269 M128A Xmm6; 270 M128A Xmm7; 271 M128A Xmm8; 272 M128A Xmm9; 273 M128A Xmm10; 274 M128A Xmm11; 275 M128A Xmm12; 276 M128A Xmm13; 277 M128A Xmm14; 278 M128A Xmm15; 279 } DUMMYSTRUCTNAME DECLSPEC_ALIGN(16); 280 } DUMMYUNIONNAME DECLSPEC_ALIGN(16); 281 M128A VectorRegister[26]; 282 ULONG64 VectorControl; 283 ULONG64 DebugControl; 284 ULONG64 LastBranchToRip; 285 ULONG64 LastBranchFromRip; 286 ULONG64 LastExceptionToRip; 287 ULONG64 LastExceptionFromRip; 288 } CONTEXT; 289 290 #define PCR_MINOR_VERSION 1 291 #define PCR_MAJOR_VERSION 1 292 293 typedef struct _KPCR 294 { 295 _ANONYMOUS_UNION union 296 { 297 NT_TIB NtTib; 298 _ANONYMOUS_STRUCT struct 299 { 300 union _KGDTENTRY64 *GdtBase; 301 struct _KTSS64 *TssBase; 302 ULONG64 UserRsp; 303 struct _KPCR *Self; 304 struct _KPRCB *CurrentPrcb; 305 PKSPIN_LOCK_QUEUE LockArray; 306 PVOID Used_Self; 307 }; 308 }; 309 union _KIDTENTRY64 *IdtBase; 310 ULONG64 Unused[2]; 311 KIRQL Irql; 312 UCHAR SecondLevelCacheAssociativity; 313 UCHAR ObsoleteNumber; 314 UCHAR Fill0; 315 ULONG Unused0[3]; 316 USHORT MajorVersion; 317 USHORT MinorVersion; 318 ULONG StallScaleFactor; 319 PVOID Unused1[3]; 320 ULONG KernelReserved[15]; 321 ULONG SecondLevelCacheSize; 322 ULONG HalReserved[16]; 323 ULONG Unused2; 324 PVOID KdVersionBlock; 325 PVOID Unused3; 326 ULONG PcrAlign1[24]; 327 } KPCR, *PKPCR; 328 329 FORCEINLINE 330 PKPCR 331 KeGetPcr(VOID) 332 { 333 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); 334 } 335 336 #if (NTDDI_VERSION >= NTDDI_WIN7) 337 _CRT_DEPRECATE_TEXT("KeGetCurrentProcessorNumber is deprecated. Use KeGetCurrentProcessorNumberEx or KeGetCurrentProcessorIndex instead.") 338 #endif 339 FORCEINLINE 340 ULONG 341 KeGetCurrentProcessorNumber(VOID) 342 { 343 return __readgsbyte(0x184); 344 } 345 346 $endif /* _NTDDK_ */ 347