mirror of
https://github.com/reactos/reactos.git
synced 2024-08-07 03:44:36 +00:00
[KMTESTS/KE]
- KeIrql: make use of the new build type features - KeApc: test internals of enabling/disable APCs [KMTESTS/EX] - better portability for ExInterlocked test svn path=/branches/GSoC_2011/KMTestSuite/; revision=52782
This commit is contained in:
parent
ed72d2fbd2
commit
ca91b96107
|
@ -43,7 +43,7 @@ const KMT_TEST TestList[] =
|
|||
{ "KeDpc", Test_KeDpc },
|
||||
{ "KeIrql", Test_KeIrql },
|
||||
{ "KeProcessor", Test_KeProcessor },
|
||||
{ "KernelType", Test_KernelType },
|
||||
{ "-KernelType", Test_KernelType },
|
||||
{ "ObCreate", Test_ObCreate },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
|
|
@ -38,10 +38,20 @@ __declspec(dllimport) int __stdcall Exi386InterlockedDecrementLo
|
|||
|
||||
static KSPIN_LOCK SpinLock;
|
||||
|
||||
#ifdef _M_IX86
|
||||
typedef struct
|
||||
{
|
||||
int esi, edi, ebx, ebp, esp;
|
||||
} PROCESSOR_STATE, *PPROCESSOR_STATE;
|
||||
unsigned long esi, edi, ebx, ebp, esp;
|
||||
} PROCESSOR_STATE;
|
||||
#elif defined(_M_AMD64)
|
||||
typedef struct
|
||||
{
|
||||
unsigned long long rsi, rdi, rbx, rbp, rsp, r12, r13, r14, r15;
|
||||
} PROCESSOR_STATE;
|
||||
#else
|
||||
// dummy
|
||||
typedef int PROCESSOR_STATE;
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && defined(_M_IX86)
|
||||
#define SaveState(State) do \
|
||||
|
@ -63,6 +73,56 @@ typedef struct
|
|||
ok_eq_hex((OldState)->esp, (NewState)->esp); \
|
||||
} while (0)
|
||||
|
||||
#elif defined(__GNUC__) && defined(_M_IX86)
|
||||
#define SaveState(State) \
|
||||
asm volatile( \
|
||||
".intel_syntax noprefix\n\t" \
|
||||
"mov\t[ecx], esi\n\t" \
|
||||
"mov\t[ecx+4], edi\n\t" \
|
||||
"mov\t[ecx+8], ebx\n\t" \
|
||||
"mov\t[ecx+12], ebp\n\t" \
|
||||
"mov\t[ecx+16], esp\n\t" \
|
||||
".att_syntax prefix" \
|
||||
: : "c" (&State) : "memory" \
|
||||
);
|
||||
|
||||
#define CheckState(OldState, NewState) do \
|
||||
{ \
|
||||
ok_eq_hex((OldState)->esi, (NewState)->esi); \
|
||||
ok_eq_hex((OldState)->edi, (NewState)->edi); \
|
||||
ok_eq_hex((OldState)->ebx, (NewState)->ebx); \
|
||||
ok_eq_hex((OldState)->ebp, (NewState)->ebp); \
|
||||
ok_eq_hex((OldState)->esp, (NewState)->esp); \
|
||||
} while (0)
|
||||
#elif defined(__GNUC__) && defined(_M_AMD64)
|
||||
#define SaveState(State) \
|
||||
asm volatile( \
|
||||
".intel_syntax noprefix\n\t" \
|
||||
"mov\t[rcx], rsi\n\t" \
|
||||
"mov\t[rcx+8], rdi\n\t" \
|
||||
"mov\t[rcx+16], rbx\n\t" \
|
||||
"mov\t[rcx+24], rbp\n\t" \
|
||||
"mov\t[rcx+32], rsp\n\t" \
|
||||
"mov\t[rcx+40], r12\n\t" \
|
||||
"mov\t[rcx+48], r13\n\t" \
|
||||
"mov\t[rcx+56], r14\n\t" \
|
||||
"mov\t[rcx+64], r15\n\t" \
|
||||
".att_syntax prefix" \
|
||||
: : "c" (&State) : "memory" \
|
||||
);
|
||||
|
||||
#define CheckState(OldState, NewState) do \
|
||||
{ \
|
||||
ok_eq_hex((OldState)->rsi, (NewState)->rsi); \
|
||||
ok_eq_hex((OldState)->rdi, (NewState)->rdi); \
|
||||
ok_eq_hex((OldState)->rbx, (NewState)->rbx); \
|
||||
ok_eq_hex((OldState)->rbp, (NewState)->rbp); \
|
||||
ok_eq_hex((OldState)->rsp, (NewState)->rsp); \
|
||||
ok_eq_hex((OldState)->r12, (NewState)->r12); \
|
||||
ok_eq_hex((OldState)->r13, (NewState)->r13); \
|
||||
ok_eq_hex((OldState)->r14, (NewState)->r14); \
|
||||
ok_eq_hex((OldState)->r15, (NewState)->r15); \
|
||||
} while (0)
|
||||
#else
|
||||
#define SaveState(State)
|
||||
#define CheckState(OldState, NewState)
|
||||
|
@ -218,10 +278,6 @@ TestInterlockedFunctional(VOID)
|
|||
|
||||
/* CompareExchange */
|
||||
/* macro version */
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L);
|
||||
/* exported function */
|
||||
#undef InterlockedCompareExchange
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L);
|
||||
/* these only exist as macros on x86 */
|
||||
|
@ -229,27 +285,35 @@ TestInterlockedFunctional(VOID)
|
|||
CheckInterlockedCmpXchg(InterlockedCompareExchangeAcquire, LONG, "%ld", 16, 16, 4, 4L, 16L);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchangeRelease, LONG, "%ld", 27, 123, 38, 27L, 27L);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchangeRelease, LONG, "%ld", 27, 27, 39, 39L, 27L);
|
||||
/* exported function */
|
||||
#undef InterlockedCompareExchange
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L);
|
||||
#endif
|
||||
/* only exists as a macro */
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchangePointer, PVOID, "%p", (PVOID)117, (PVOID)711, (PVOID)12, (PVOID)117, (PVOID)117);
|
||||
CheckInterlockedCmpXchg(InterlockedCompareExchangePointer, PVOID, "%p", (PVOID)117, (PVOID)117, (PVOID)228, (PVOID)228, (PVOID)117);
|
||||
/* macro version */
|
||||
CheckInterlockedCmpXchgI(ExInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL, pSpinLock);
|
||||
CheckInterlockedCmpXchgI(ExInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL, pSpinLock);
|
||||
#ifdef _M_IX86
|
||||
/* exported function */
|
||||
CheckInterlockedCmpXchgI((ExInterlockedCompareExchange64), LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL, pSpinLock);
|
||||
CheckInterlockedCmpXchgI((ExInterlockedCompareExchange64), LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL, pSpinLock);
|
||||
/* fastcall version */
|
||||
CheckInterlockedCmpXchgI(ExfInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL);
|
||||
CheckInterlockedCmpXchgI(ExfInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL);
|
||||
#endif
|
||||
|
||||
/* Exchange */
|
||||
CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L);
|
||||
#undef InterlockedExchange
|
||||
CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L);
|
||||
CheckInterlockedOp(InterlockedExchangePointer, PVOID, "%p", (PVOID)700, (PVOID)93, (PVOID)93, (PVOID)700);
|
||||
#undef InterlockedExchange
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L);
|
||||
CheckInterlockedOp(ExInterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU, pSpinLock);
|
||||
CheckInterlockedOp((ExInterlockedExchangeUlong), ULONG, "%lu", 212, 121, 121LU, 212LU, pSpinLock);
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOp(Exi386InterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU);
|
||||
CheckInterlockedOp(Exfi386InterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU);
|
||||
#endif
|
||||
|
@ -258,7 +322,9 @@ TestInterlockedFunctional(VOID)
|
|||
/* TODO: ExInterlockedExchangeAddLargeInteger? */
|
||||
CheckInterlockedOp(InterlockedExchangeAdd, LONG, "%ld", 312, 7, 319L, 312L);
|
||||
#undef InterlockedExchangeAdd
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOp(InterlockedExchangeAdd, LONG, "%ld", 312, 7, 319L, 312L);
|
||||
#endif
|
||||
|
||||
/* Add */
|
||||
/* these DO need a valid spinlock even on x86 */
|
||||
|
@ -271,11 +337,12 @@ TestInterlockedFunctional(VOID)
|
|||
/* Increment */
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L);
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG);
|
||||
#undef InterlockedIncrement
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L);
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG);
|
||||
CheckInterlockedOpNoArg(InterlockedIncrementAcquire, LONG, "%ld", 2341L, 2342L, 2342L);
|
||||
CheckInterlockedOpNoArg(InterlockedIncrementRelease, LONG, "%ld", 2341L, 2342L, 2342L);
|
||||
#undef InterlockedIncrement
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L);
|
||||
CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG);
|
||||
CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", -2L, -1L, (LONG)ResultNegative, pSpinLock);
|
||||
CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", -1L, 0L, (LONG)ResultZero, pSpinLock);
|
||||
CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", 0L, 1L, (LONG)ResultPositive, pSpinLock);
|
||||
|
@ -284,7 +351,6 @@ TestInterlockedFunctional(VOID)
|
|||
CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", -1L, 0L, (LONG)ResultZero, pSpinLock);
|
||||
CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", 0L, 1L, (LONG)ResultPositive, pSpinLock);
|
||||
CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)ResultNegative, pSpinLock);
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", -2L, -1L, (LONG)ResultNegative);
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", -1L, 0L, (LONG)ResultZero);
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", 0L, 1L, (LONG)ResultPositive);
|
||||
|
@ -294,11 +360,12 @@ TestInterlockedFunctional(VOID)
|
|||
/* Decrement */
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L);
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG);
|
||||
#undef InterlockedDecrement
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L);
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG);
|
||||
CheckInterlockedOpNoArg(InterlockedDecrementAcquire, LONG, "%ld", 1745L, 1744L, 1744L);
|
||||
CheckInterlockedOpNoArg(InterlockedDecrementRelease, LONG, "%ld", 1745L, 1744L, 1744L);
|
||||
#undef InterlockedDecrement
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L);
|
||||
CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG);
|
||||
CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)ResultPositive, pSpinLock);
|
||||
CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", 0L, -1L, (LONG)ResultNegative, pSpinLock);
|
||||
CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", 1L, 0L, (LONG)ResultZero, pSpinLock);
|
||||
|
@ -307,7 +374,6 @@ TestInterlockedFunctional(VOID)
|
|||
CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 0L, -1L, (LONG)ResultNegative, pSpinLock);
|
||||
CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 1L, 0L, (LONG)ResultZero, pSpinLock);
|
||||
CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 2L, 1L, (LONG)ResultPositive, pSpinLock);
|
||||
#ifdef _M_IX86
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)ResultPositive);
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", 0L, -1L, (LONG)ResultNegative);
|
||||
CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", 1L, 0L, (LONG)ResultZero);
|
||||
|
|
|
@ -6,146 +6,181 @@
|
|||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <ntifs.h>
|
||||
#include <ndk/ketypes.h>
|
||||
#include <kmt_test.h>
|
||||
|
||||
#define CheckApcs(KernelApcsDisabled, SpecialApcsDisabled, Irql) do \
|
||||
#define CheckApcs(KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, Irql) do \
|
||||
{ \
|
||||
ok_eq_bool(KeAreApcsDisabled(), KernelApcsDisabled); \
|
||||
ok_eq_bool(KeAreAllApcsDisabled(), SpecialApcsDisabled); \
|
||||
ok_eq_bool(KeAreApcsDisabled(), KernelApcsDisabled || SpecialApcsDisabled); \
|
||||
ok_eq_int(Thread->KernelApcDisable, KernelApcsDisabled); \
|
||||
ok_eq_bool(KeAreAllApcsDisabled(), AllApcsDisabled); \
|
||||
ok_eq_int(Thread->SpecialApcDisable, SpecialApcsDisabled); \
|
||||
ok_irql(Irql); \
|
||||
} while (0)
|
||||
|
||||
START_TEST(KeApc)
|
||||
{
|
||||
KIRQL Irql;
|
||||
PKTHREAD Thread = KeGetCurrentThread();
|
||||
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* critical region */
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-2, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-3, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-2, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* guarded region */
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -2, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -3, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -2, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* mix them */
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* leave without entering */
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(0, 1, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(1, 1, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(0, 1, TRUE, PASSIVE_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* manually disable APCs */
|
||||
Thread->KernelApcDisable = -1;
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
Thread->SpecialApcDisable = -1;
|
||||
CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL);
|
||||
Thread->KernelApcDisable = 0;
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
Thread->SpecialApcDisable = 0;
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* raised irql - APC_LEVEL should disable APCs */
|
||||
KeRaiseIrql(APC_LEVEL, &Irql);
|
||||
CheckApcs(FALSE, TRUE, APC_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, APC_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* KeAre*ApcsDisabled are documented to work up to DISPATCH_LEVEL... */
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
|
||||
CheckApcs(FALSE, TRUE, DISPATCH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, DISPATCH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* ... but also work on higher levels! */
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
/* now comes the crazy stuff */
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, 0, TRUE, HIGH_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, HIGH_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, 0, TRUE, HIGH_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, HIGH_LEVEL);
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, HIGH_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, 0, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, 0, TRUE, HIGH_LEVEL);
|
||||
KeEnterGuardedRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, -1, TRUE, HIGH_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(TRUE, TRUE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, -1, TRUE, PASSIVE_LEVEL);
|
||||
KeLeaveGuardedRegion();
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
|
||||
KeEnterCriticalRegion();
|
||||
CheckApcs(TRUE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL);
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
CheckApcs(TRUE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(-1, 0, TRUE, HIGH_LEVEL);
|
||||
KeLeaveCriticalRegion();
|
||||
CheckApcs(FALSE, TRUE, HIGH_LEVEL);
|
||||
CheckApcs(0, 0, TRUE, HIGH_LEVEL);
|
||||
KeLowerIrql(Irql);
|
||||
CheckApcs(FALSE, FALSE, PASSIVE_LEVEL);
|
||||
CheckApcs(0, 0, FALSE, PASSIVE_LEVEL);
|
||||
}
|
||||
|
|
|
@ -23,17 +23,11 @@ START_TEST(KeIrql)
|
|||
|
||||
PrevIrql = KeGetCurrentIrql();
|
||||
|
||||
// SYNCH_LEVEL is different for UP/MP
|
||||
if (KeGetCurrentPrcb()->BuildType & PRCB_BUILD_UNIPROCESSOR)
|
||||
{
|
||||
trace("This is a Uniprocessor kernel\n");
|
||||
SynchIrql = DISPATCH_LEVEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
trace("This is a Multiprocessor kernel\n");
|
||||
/* SYNCH_LEVEL is different for UP/MP */
|
||||
if (KmtIsMultiProcessorBuild)
|
||||
SynchIrql = IPI_LEVEL - 2;
|
||||
}
|
||||
else
|
||||
SynchIrql = DISPATCH_LEVEL;
|
||||
|
||||
/* some Irqls MUST work */
|
||||
{
|
||||
|
@ -129,6 +123,17 @@ START_TEST(KeIrql)
|
|||
ok_eq_uint(Irql, SynchIrql);
|
||||
KeLowerIrql(PASSIVE_LEVEL);
|
||||
|
||||
/* these bugcheck on a checked build but run fine on free! */
|
||||
if (!KmtIsCheckedBuild)
|
||||
{
|
||||
KeRaiseIrql(HIGH_LEVEL, &Irql);
|
||||
KeRaiseIrql(APC_LEVEL, &Irql);
|
||||
ok_irql(APC_LEVEL);
|
||||
KeLowerIrql(HIGH_LEVEL);
|
||||
ok_irql(HIGH_LEVEL);
|
||||
KeLowerIrql(PASSIVE_LEVEL);
|
||||
}
|
||||
|
||||
/* make sure we exit gracefully */
|
||||
ok_irql(PASSIVE_LEVEL);
|
||||
KeLowerIrql(PASSIVE_LEVEL);
|
||||
|
|
Loading…
Reference in a new issue