ReactOS  0.4.15-dev-3745-g356babc
IoInterrupt.c
Go to the documentation of this file.
1 /*
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>
6  */
7 
8 #include <kmt_test.h>
9 
10 #define NDEBUG
11 #include <debug.h>
12 
13 #define CheckSpinLock(Lock, Locked) do \
14 { \
15  if (KmtIsMultiProcessorBuild) \
16  ok_eq_ulongptr(*(Lock), (Locked) != 0); \
17  else if (KmtIsCheckedBuild) \
18  ok_eq_bool(*(Lock) != 0, (Locked) != 0); \
19  else \
20  ok_eq_ulongptr(*(Lock), 0); \
21 } while (0)
22 
23 typedef struct
24 {
29 
30 static KSYNCHRONIZE_ROUTINE SynchronizeRoutine;
31 
32 static
33 BOOLEAN
34 NTAPI
37 {
38  PTEST_CONTEXT TestContext = Context;
39 
40  ok_irql(TestContext->ExpectedIrql);
41 
42  CheckSpinLock(TestContext->Interrupt->ActualLock, TRUE);
43 
44  return TestContext->ReturnValue;
45 }
46 
47 static
48 VOID
50 {
52  TEST_CONTEXT TestContext;
53  KIRQL SynchIrql;
54  KIRQL OriginalIrql;
55  KIRQL Irql;
56  KSPIN_LOCK ActualLock;
57  BOOLEAN Ret;
58 
59  RtlFillMemory(&Interrupt, sizeof Interrupt, 0x55);
60  Interrupt.ActualLock = &ActualLock;
61  KeInitializeSpinLock(Interrupt.ActualLock);
62  CheckSpinLock(Interrupt.ActualLock, FALSE);
63 
64  TestContext.Interrupt = &Interrupt;
65  TestContext.ReturnValue = TRUE;
66 
67  for (TestContext.ReturnValue = 0; TestContext.ReturnValue <= 2; ++TestContext.ReturnValue)
68  {
69  for (OriginalIrql = PASSIVE_LEVEL; OriginalIrql <= HIGH_LEVEL; ++OriginalIrql)
70  {
71  /* TODO: don't hardcode this :| */
72  if (OriginalIrql == 3 || (OriginalIrql >= 11 && OriginalIrql <= 26) || OriginalIrql == 30)
73  continue;
74  KeRaiseIrql(OriginalIrql, &Irql);
75  for (SynchIrql = max(DISPATCH_LEVEL, OriginalIrql); SynchIrql <= HIGH_LEVEL; ++SynchIrql)
76  {
77  if (SynchIrql == 3 || (SynchIrql >= 11 && SynchIrql <= 26) || SynchIrql == 30)
78  continue;
79  Interrupt.SynchronizeIrql = SynchIrql;
80  ok_irql(OriginalIrql);
81  CheckSpinLock(Interrupt.ActualLock, FALSE);
82  TestContext.ExpectedIrql = SynchIrql;
84  ok_eq_int(Ret, TestContext.ReturnValue);
85  ok_irql(OriginalIrql);
86  CheckSpinLock(Interrupt.ActualLock, FALSE);
87  /* TODO: Check that all other fields of the interrupt are untouched */
88  }
90  }
91  }
92 }
93 
94 START_TEST(IoInterrupt)
95 {
97 }
PKINTERRUPT Interrupt
Definition: IoInterrupt.c:27
#define IN
Definition: typedefs.h:39
#define max(a, b)
Definition: svc.c:63
#define TRUE
Definition: types.h:120
#define ok_eq_int(value, expected)
Definition: kmt_test.h:238
struct _TEST_CONTEXT TEST_CONTEXT
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:372
static VOID TestSynchronizeExecution(VOID)
Definition: IoInterrupt.c:49
BOOLEAN ReturnValue
Definition: IoInterrupt.c:25
_Out_ PKIRQL Irql
Definition: csq.h:179
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h:117
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:238
unsigned char BOOLEAN
#define CheckSpinLock(Lock, Locked)
Definition: IoInterrupt.c:13
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:593
struct TEST_CONTEXT * PTEST_CONTEXT
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define HIGH_LEVEL
Definition: env_spec_w32.h:703
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
VOID NTAPI KeRaiseIrql(KIRQL NewIrql, PKIRQL OldIrql)
Definition: spinlock.c:27
START_TEST(IoInterrupt)
Definition: IoInterrupt.c:94
struct tagContext Context
Definition: acpixf.h:1034
BOOLEAN NTAPI KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext OPTIONAL)
Definition: interrupt.c:165
VOID NTAPI KeLowerIrql(KIRQL NewIrql)
Definition: spinlock.c:39
KIRQL ExpectedIrql
Definition: IoInterrupt.c:26
static KSYNCHRONIZE_ROUTINE SynchronizeRoutine
Definition: IoInterrupt.c:30