2 /** Kernel definitions for x86 **/
4 /* Interrupt request levels */
5 #define PASSIVE_LEVEL 0
8 #define DISPATCH_LEVEL 2
10 #define PROFILE_LEVEL 27
11 #define CLOCK1_LEVEL 28
12 #define CLOCK2_LEVEL 28
14 #define POWER_LEVEL 30
16 #define CLOCK_LEVEL CLOCK2_LEVEL
18 #define KIP0PCRADDRESS 0xffdff000
19 #define KI_USER_SHARED_DATA 0xffdf0000
20 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
22 #define PAGE_SIZE 0x1000
23 #define PAGE_SHIFT 12L
24 #define KeGetDcacheFillSize() 1L
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
{
44 } KFLOATING_SAVE
, *PKFLOATING_SAVE
;
46 extern NTKERNELAPI
volatile KSYSTEM_TIME KeTickCount
;
48 #define YieldProcessor _mm_pause
54 LONG Barrier
, *Dummy
= &Barrier
;
55 UNREFERENCED_LOCAL_VARIABLE(Dummy
);
58 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
59 #elif defined(_MSC_VER)
60 __asm xchg
[Barrier
], eax
64 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
66 _IRQL_requires_max_(HIGH_LEVEL
)
71 KeGetCurrentIrql(VOID
);
73 _IRQL_requires_max_(HIGH_LEVEL
)
78 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql
);
79 #define KeLowerIrql(a) KfLowerIrql(a)
81 _IRQL_requires_max_(HIGH_LEVEL
)
82 _IRQL_raises_(NewIrql
)
89 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
91 _IRQL_requires_max_(DISPATCH_LEVEL
)
93 _IRQL_raises_(DISPATCH_LEVEL
)
97 KeRaiseIrqlToDpcLevel(VOID
);
102 KeRaiseIrqlToSynchLevel(VOID
);
104 _Requires_lock_not_held_(*SpinLock
)
105 _Acquires_lock_(*SpinLock
)
106 _IRQL_requires_max_(DISPATCH_LEVEL
)
108 _IRQL_raises_(DISPATCH_LEVEL
)
113 _Inout_ PKSPIN_LOCK SpinLock
);
114 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
116 _Requires_lock_held_(*SpinLock
)
117 _Releases_lock_(*SpinLock
)
118 _IRQL_requires_(DISPATCH_LEVEL
)
123 _Inout_ PKSPIN_LOCK SpinLock
,
124 _In_ _IRQL_restores_ KIRQL NewIrql
);
125 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
127 _Requires_lock_not_held_(*SpinLock
)
128 _Acquires_lock_(*SpinLock
)
129 _IRQL_requires_min_(DISPATCH_LEVEL
)
133 KefAcquireSpinLockAtDpcLevel(
134 _Inout_ PKSPIN_LOCK SpinLock
);
135 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
137 _Requires_lock_held_(*SpinLock
)
138 _Releases_lock_(*SpinLock
)
139 _IRQL_requires_min_(DISPATCH_LEVEL
)
143 KefReleaseSpinLockFromDpcLevel(
144 _Inout_ PKSPIN_LOCK SpinLock
);
145 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
150 KeGetCurrentThread(VOID
);
152 _Always_(_Post_satisfies_(return<=0))
153 _Must_inspect_result_
154 _IRQL_requires_max_(DISPATCH_LEVEL
)
156 _At_(*FloatSave
, _Kernel_requires_resource_not_held_(FloatState
) _Kernel_acquires_resource_(FloatState
))
160 KeSaveFloatingPointState(
161 _Out_ PKFLOATING_SAVE FloatSave
);
164 _Kernel_float_restored_
165 _At_(*FloatSave
, _Kernel_requires_resource_held_(FloatState
) _Kernel_releases_resource_(FloatState
))
169 KeRestoreFloatingPointState(
170 _In_ PKFLOATING_SAVE FloatSave
);
175 * IN BOOLEAN ReadOperation,
176 * IN BOOLEAN DmaOperation)
178 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
180 /* x86 and x64 performs a 0x2C interrupt */
181 #define DbgRaiseAssertionFailure __int2c
186 OUT PLARGE_INTEGER CurrentCount
)
189 #ifdef NONAMELESSUNION
190 CurrentCount
->s
.HighPart
= KeTickCount
.High1Time
;
191 CurrentCount
->s
.LowPart
= KeTickCount
.LowPart
;
192 if (CurrentCount
->s
.HighPart
== KeTickCount
.High2Time
) break;
194 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
195 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
196 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
201 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
206 #define PAUSE_PROCESSOR YieldProcessor();
208 #define KERNEL_STACK_SIZE 12288
209 #define KERNEL_LARGE_STACK_SIZE 61440
210 #define KERNEL_LARGE_STACK_COMMIT 12288
212 #define SIZE_OF_80387_REGISTERS 80
214 #if !defined(RC_INVOKED)
216 #define CONTEXT_i386 0x10000
217 #define CONTEXT_i486 0x10000
218 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
219 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
220 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
221 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
222 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
223 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
225 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
226 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
227 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
228 CONTEXT_EXTENDED_REGISTERS)
230 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
232 #endif /* !defined(RC_INVOKED) */
234 typedef struct _FLOATING_SAVE_AREA
{
242 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
244 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
246 #include "pshpack4.h"
247 typedef struct _CONTEXT
{
255 FLOATING_SAVE_AREA FloatSave
;
272 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
276 #define KeGetPcr() PCR
278 #define PCR_MINOR_VERSION 1
279 #define PCR_MAJOR_VERSION 1
281 typedef struct _KPCR
{
285 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
286 PVOID Used_StackBase
;
289 ULONG ContextSwitches
;
290 KAFFINITY SetMemberCopy
;
294 struct _KPCR
*SelfPcr
;
300 PVOID KdVersionBlock
;
301 struct _KIDTENTRY
*IDT
;
302 struct _KGDTENTRY
*GDT
;
307 ULONG StallScaleFactor
;
311 UCHAR SecondLevelCacheAssociativity
;
313 ULONG KernelReserved
[14];
314 ULONG SecondLevelCacheSize
;
315 ULONG HalReserved
[16];
320 KeGetCurrentProcessorNumber(VOID
)
322 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));