2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Interrupt test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
13 #define CheckSpinLock(Lock, Locked) do \
15 if (KmtIsMultiProcessorBuild) \
16 ok_eq_ulongptr(*(Lock), (Locked) != 0); \
18 ok_eq_ulongptr(*(Lock), 0); \
25 PKINTERRUPT Interrupt
;
26 } TEST_CONTEXT
, *PTEST_CONTEXT
;
28 static KSYNCHRONIZE_ROUTINE SynchronizeRoutine
;
36 PTEST_CONTEXT TestContext
= Context
;
38 ok_irql(TestContext
->ExpectedIrql
);
40 CheckSpinLock(TestContext
->Interrupt
->ActualLock
, TRUE
);
42 return TestContext
->ReturnValue
;
47 TestSynchronizeExecution(VOID
)
50 TEST_CONTEXT TestContext
;
54 KSPIN_LOCK ActualLock
;
57 RtlFillMemory(&Interrupt
, sizeof Interrupt
, 0x55);
58 Interrupt
.ActualLock
= &ActualLock
;
59 KeInitializeSpinLock(Interrupt
.ActualLock
);
60 CheckSpinLock(Interrupt
.ActualLock
, FALSE
);
62 TestContext
.Interrupt
= &Interrupt
;
63 TestContext
.ReturnValue
= TRUE
;
65 for (TestContext
.ReturnValue
= 0; TestContext
.ReturnValue
<= 2; ++TestContext
.ReturnValue
)
67 for (OriginalIrql
= PASSIVE_LEVEL
; OriginalIrql
<= HIGH_LEVEL
; ++OriginalIrql
)
69 /* TODO: don't hardcode this :| */
70 if (OriginalIrql
== 3 || (OriginalIrql
>= 11 && OriginalIrql
<= 26) || OriginalIrql
== 30)
72 KeRaiseIrql(OriginalIrql
, &Irql
);
73 for (SynchIrql
= max(DISPATCH_LEVEL
, OriginalIrql
); SynchIrql
<= HIGH_LEVEL
; ++SynchIrql
)
75 if (SynchIrql
== 3 || (SynchIrql
>= 11 && SynchIrql
<= 26) || SynchIrql
== 30)
77 Interrupt
.SynchronizeIrql
= SynchIrql
;
78 ok_irql(OriginalIrql
);
79 CheckSpinLock(Interrupt
.ActualLock
, FALSE
);
80 TestContext
.ExpectedIrql
= SynchIrql
;
81 Ret
= KeSynchronizeExecution(&Interrupt
, SynchronizeRoutine
, &TestContext
);
82 ok_eq_int(Ret
, TestContext
.ReturnValue
);
83 ok_irql(OriginalIrql
);
84 CheckSpinLock(Interrupt
.ActualLock
, FALSE
);
85 /* TODO: Check that all other fields of the interrupt are untouched */
92 START_TEST(IoInterrupt
)
94 TestSynchronizeExecution();