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 CurrentCount
->HighPart
= KeTickCount
.High1Time
;
155 CurrentCount
->LowPart
= KeTickCount
.LowPart
;
156 if (CurrentCount
->HighPart
== KeTickCount
.High2Time
) break;
160 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
162 $endif
/* _WDMDDK_ */
165 #define PAUSE_PROCESSOR YieldProcessor();
167 #define KERNEL_STACK_SIZE 12288
168 #define KERNEL_LARGE_STACK_SIZE 61440
169 #define KERNEL_LARGE_STACK_COMMIT 12288
171 #define SIZE_OF_80387_REGISTERS 80
173 #if !defined(RC_INVOKED)
175 #define CONTEXT_i386 0x10000
176 #define CONTEXT_i486 0x10000
177 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
178 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
179 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
180 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
181 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
182 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
184 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
185 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
186 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
187 CONTEXT_EXTENDED_REGISTERS)
189 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
191 #endif /* !defined(RC_INVOKED) */
193 typedef struct _FLOATING_SAVE_AREA
{
201 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
203 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
205 #include "pshpack4.h"
206 typedef struct _CONTEXT
{
214 FLOATING_SAVE_AREA FloatSave
;
231 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
235 #define KeGetPcr() PCR
237 #define PCR_MINOR_VERSION 1
238 #define PCR_MAJOR_VERSION 1
240 typedef struct _KPCR
{
244 struct _EXCEPTION_REGISTRATION_RECORD
*Used_ExceptionList
;
245 PVOID Used_StackBase
;
248 ULONG ContextSwitches
;
249 KAFFINITY SetMemberCopy
;
253 struct _KPCR
*SelfPcr
;
259 PVOID KdVersionBlock
;
260 struct _KIDTENTRY
*IDT
;
261 struct _KGDTENTRY
*GDT
;
266 ULONG StallScaleFactor
;
270 UCHAR SecondLevelCacheAssociativity
;
272 ULONG KernelReserved
[14];
273 ULONG SecondLevelCacheSize
;
274 ULONG HalReserved
[16];
279 KeGetCurrentProcessorNumber(VOID
)
281 return (ULONG
)__readfsbyte(FIELD_OFFSET(KPCR
, Number
));