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 volatile LONG Barrier
;
56 __asm__
__volatile__ ("xchg %%eax, %0" : : "m" (Barrier
) : "%eax");
57 #elif defined(_MSC_VER)
58 __asm xchg
[Barrier
], eax
65 KeGetCurrentIrql(VOID
);
72 #define KeLowerIrql(a) KfLowerIrql(a)
79 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
84 KeRaiseIrqlToDpcLevel(VOID
);
89 KeRaiseIrqlToSynchLevel(VOID
);
95 IN OUT PKSPIN_LOCK SpinLock
);
96 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
102 IN OUT PKSPIN_LOCK SpinLock
,
104 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
109 KefAcquireSpinLockAtDpcLevel(
110 IN OUT PKSPIN_LOCK SpinLock
);
111 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
116 KefReleaseSpinLockFromDpcLevel(
117 IN OUT PKSPIN_LOCK SpinLock
);
118 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
123 KeGetCurrentThread(VOID
);
128 KeSaveFloatingPointState(
129 OUT PKFLOATING_SAVE FloatSave
);
134 KeRestoreFloatingPointState(
135 IN PKFLOATING_SAVE FloatSave
);
140 * IN BOOLEAN ReadOperation,
141 * IN BOOLEAN DmaOperation)
143 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
145 /* x86 and x64 performs a 0x2C interrupt */
146 #define DbgRaiseAssertionFailure __int2c
151 OUT PLARGE_INTEGER CurrentCount
)
154 #ifdef NONAMELESSUNION
155 CurrentCount
->s
.HighPart
= KeTickCount
.High1Time
;
156 CurrentCount
->s
.LowPart
= KeTickCount
.LowPart
;
157 if (CurrentCount
->s
.HighPart
== KeTickCount
.High2Time
) break;
159 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
160 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
161 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
166 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
168 $endif
/* _WDMDDK_ */
171 #define PAUSE_PROCESSOR YieldProcessor();
173 #define KERNEL_STACK_SIZE 12288
174 #define KERNEL_LARGE_STACK_SIZE 61440
175 #define KERNEL_LARGE_STACK_COMMIT 12288
177 #define SIZE_OF_80387_REGISTERS 80
179 #if !defined(RC_INVOKED)
181 #define CONTEXT_i386 0x10000
182 #define CONTEXT_i486 0x10000
183 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
184 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
185 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
186 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
187 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
188 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
190 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
191 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
192 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
193 CONTEXT_EXTENDED_REGISTERS)
195 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
197 #endif /* !defined(RC_INVOKED) */
199 typedef struct _FLOATING_SAVE_AREA
{
207 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
209 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
211 #include "pshpack4.h"
212 typedef struct _CONTEXT
{
220 FLOATING_SAVE_AREA FloatSave
;
237 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
241 #define KeGetPcr() PCR
243 #define PCR_MINOR_VERSION 1
244 #define PCR_MAJOR_VERSION 1
246 typedef struct _KPCR
{
250 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
251 PVOID Used_StackBase
;
254 ULONG ContextSwitches
;
255 KAFFINITY SetMemberCopy
;
259 struct _KPCR
*SelfPcr
;
265 PVOID KdVersionBlock
;
266 struct _KIDTENTRY
*IDT
;
267 struct _KGDTENTRY
*GDT
;
272 ULONG StallScaleFactor
;
276 UCHAR SecondLevelCacheAssociativity
;
278 ULONG KernelReserved
[14];
279 ULONG SecondLevelCacheSize
;
280 ULONG HalReserved
[16];
285 KeGetCurrentProcessorNumber(VOID
)
287 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));