Author: tfaber Date: Fri Aug 5 21:07:52 2011 New Revision: 53090
URL: http://svn.reactos.org/svn/reactos?rev=53090&view=rev Log: [KMTESTS] - add KeEvent test (part 1/x) - add ExFastMutex test (part 1/2)
Added: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExFastMutex.c (with props) branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeEvent.c (with props) Modified: branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/CM... ============================================================================== --- branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] (original) +++ branches/GSoC_2011/KMTestSuite/kmtests/CMakeLists.txt [iso-8859-1] Fri Aug 5 21:07:52 2011 @@ -17,6 +17,7 @@ example/Example.c example/KernelType.c ntos_ex/ExDoubleList.c + ntos_ex/ExFastMutex.c ntos_ex/ExHardError.c ntos_ex/ExInterlocked.c ntos_ex/ExPools.c @@ -29,6 +30,7 @@ ntos_io/IoMdl.c ntos_ke/KeApc.c ntos_ke/KeDpc.c + ntos_ke/KeEvent.c ntos_ke/KeIrql.c ntos_ke/KeProcessor.c ntos_ke/KeSpinLock.c
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/km... ============================================================================== --- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] (original) +++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv.rbuild [iso-8859-1] Fri Aug 5 21:07:52 2011 @@ -16,6 +16,7 @@ </directory> <directory name="ntos_ex"> <file>ExDoubleList.c</file> + <file>ExFastMutex.c</file> <file>ExHardError.c</file> <file>ExInterlocked.c</file> <file>ExPools.c</file> @@ -34,6 +35,7 @@ <directory name="ntos_ke"> <file>KeApc.c</file> <file>KeDpc.c</file> + <file>KeEvent.c</file> <file>KeIrql.c</file> <file>KeProcessor.c</file> <file>KeSpinLock.c</file>
Modified: branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/km... ============================================================================== --- branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] (original) +++ branches/GSoC_2011/KMTestSuite/kmtests/kmtest_drv/testlist.c [iso-8859-1] Fri Aug 5 21:07:52 2011 @@ -9,6 +9,7 @@
KMT_TESTFUNC Test_Example; KMT_TESTFUNC Test_ExDoubleList; +KMT_TESTFUNC Test_ExFastMutex; KMT_TESTFUNC Test_ExHardError; KMT_TESTFUNC Test_ExHardErrorInteractive; KMT_TESTFUNC Test_ExInterlocked; @@ -22,6 +23,7 @@ KMT_TESTFUNC Test_IoMdl; KMT_TESTFUNC Test_KeApc; KMT_TESTFUNC Test_KeDpc; +KMT_TESTFUNC Test_KeEvent; KMT_TESTFUNC Test_KeIrql; KMT_TESTFUNC Test_KeProcessor; KMT_TESTFUNC Test_KernelType; @@ -33,6 +35,7 @@ const KMT_TEST TestList[] = { { "ExDoubleList", Test_ExDoubleList }, + { "ExFastMutex", Test_ExFastMutex }, { "ExHardError", Test_ExHardError }, { "-ExHardErrorInteractive", Test_ExHardErrorInteractive }, { "ExInterlocked", Test_ExInterlocked }, @@ -47,6 +50,7 @@ { "IoMdl", Test_IoMdl }, { "KeApc", Test_KeApc }, { "KeDpc", Test_KeDpc }, + { "KeEvent", Test_KeEvent }, { "KeIrql", Test_KeIrql }, { "KeProcessor", Test_KeProcessor }, { "-KernelType", Test_KernelType },
Added: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExFastMutex.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/nt... ============================================================================== --- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExFastMutex.c (added) +++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExFastMutex.c [iso-8859-1] Fri Aug 5 21:07:52 2011 @@ -1,0 +1,127 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Kernel-Mode Test Suite Fast Mutex test + * PROGRAMMER: Thomas Faber thfabba@gmx.de + */ + +#include <kmt_test.h> + +//#define NDEBUG +#include <debug.h> + +NTKERNELAPI VOID FASTCALL ExiAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex); +NTKERNELAPI VOID FASTCALL ExiReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex); +NTKERNELAPI BOOLEAN FASTCALL ExiTryToAcquireFastMutex(IN OUT PFAST_MUTEX FastMutex); + +#define CheckMutex(Mutex, ExpectedCount, ExpectedOwner, \ + ExpectedContention, ExpectedOldIrql, \ + ExpectedIrql) do \ +{ \ + ok_eq_long((Mutex)->Count, ExpectedCount); \ + ok_eq_pointer((Mutex)->Owner, ExpectedOwner); \ + ok_eq_ulong((Mutex)->Contention, ExpectedContention); \ + ok_eq_ulong((Mutex)->OldIrql, (ULONG)ExpectedOldIrql); \ + ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned"); \ + ok_irql(ExpectedIrql); \ +} while (0) + +static +VOID +TestFastMutex( + PFAST_MUTEX Mutex, + KIRQL OriginalIrql) +{ + PKTHREAD Thread = KeGetCurrentThread(); + + ok_irql(OriginalIrql); + + /* acquire/release normally */ + ExAcquireFastMutex(Mutex); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ok_bool_false(ExTryToAcquireFastMutex(Mutex), "ExTryToAcquireFastMutex returned"); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ExReleaseFastMutex(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, OriginalIrql); + + /* ntoskrnl's fastcall version */ + ExiAcquireFastMutex(Mutex); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ok_bool_false(ExiTryToAcquireFastMutex(Mutex), "ExiTryToAcquireFastMutex returned"); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ExiReleaseFastMutex(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, OriginalIrql); + + /* acquire/release unsafe */ + ExAcquireFastMutexUnsafe(Mutex); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, OriginalIrql); + ExReleaseFastMutexUnsafe(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, OriginalIrql); + + /* try to acquire */ + ok_bool_true(ExTryToAcquireFastMutex(Mutex), "ExTryToAcquireFastMutex returned"); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ExReleaseFastMutex(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, OriginalIrql); + + /* shortcut functions with critical region */ + ExEnterCriticalRegionAndAcquireFastMutexUnsafe(Mutex); + ok_bool_true(KeAreApcsDisabled(), "KeAreApcsDisabled returned"); + ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(Mutex); + + /* mismatched acquire/release */ + ExAcquireFastMutex(Mutex); + CheckMutex(Mutex, 0L, Thread, 0LU, OriginalIrql, APC_LEVEL); + ExReleaseFastMutexUnsafe(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, APC_LEVEL); + KmtSetIrql(OriginalIrql); + CheckMutex(Mutex, 1L, NULL, 0LU, OriginalIrql, OriginalIrql); + + Mutex->OldIrql = 0x55555555LU; + ExAcquireFastMutexUnsafe(Mutex); + CheckMutex(Mutex, 0L, Thread, 0LU, 0x55555555LU, OriginalIrql); + Mutex->OldIrql = PASSIVE_LEVEL; + ExReleaseFastMutex(Mutex); + CheckMutex(Mutex, 1L, NULL, 0LU, PASSIVE_LEVEL, PASSIVE_LEVEL); + KmtSetIrql(OriginalIrql); + CheckMutex(Mutex, 1L, NULL, 0LU, PASSIVE_LEVEL, OriginalIrql); + + /* release without acquire */ + ExReleaseFastMutexUnsafe(Mutex); + CheckMutex(Mutex, 2L, NULL, 0LU, PASSIVE_LEVEL, OriginalIrql); + --Mutex->Count; + Mutex->OldIrql = OriginalIrql; + ExReleaseFastMutex(Mutex); + CheckMutex(Mutex, 2L, NULL, 0LU, OriginalIrql, OriginalIrql); + ExReleaseFastMutex(Mutex); + CheckMutex(Mutex, 3L, NULL, 0LU, OriginalIrql, OriginalIrql); + Mutex->Count -= 2; + + /* make sure we survive this in case of error */ + ok_eq_long(Mutex->Count, 1L); + Mutex->Count = 1; + ok_irql(OriginalIrql); + KmtSetIrql(OriginalIrql); +} + +START_TEST(ExFastMutex) +{ + FAST_MUTEX Mutex; + KIRQL Irql; + + memset(&Mutex, 0x55, sizeof Mutex); + ExInitializeFastMutex(&Mutex); + CheckMutex(&Mutex, 1L, NULL, 0LU, 0x55555555LU, PASSIVE_LEVEL); + + TestFastMutex(&Mutex, PASSIVE_LEVEL); + KeRaiseIrql(APC_LEVEL, &Irql); + TestFastMutex(&Mutex, APC_LEVEL); + if (!KmtIsCheckedBuild) + { + KeRaiseIrql(DISPATCH_LEVEL, &Irql); + TestFastMutex(&Mutex, DISPATCH_LEVEL); + KeRaiseIrql(HIGH_LEVEL, &Irql); + TestFastMutex(&Mutex, HIGH_LEVEL); + } + KeLowerIrql(PASSIVE_LEVEL); +}
Propchange: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ex/ExFastMutex.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeEvent.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/KMTestSuite/kmtests/nt... ============================================================================== --- branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeEvent.c (added) +++ branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeEvent.c [iso-8859-1] Fri Aug 5 21:07:52 2011 @@ -1,0 +1,116 @@ +/* + * PROJECT: ReactOS kernel-mode tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Kernel-Mode Test Suite Event test + * PROGRAMMER: Thomas Faber thfabba@gmx.de + */ + +#include <kmt_test.h> + +/* TODO: thread testing, exports vs macros */ + +#define CheckEvent(Event, ExpectedType, State, ExpectedWaitNext, Irql) do \ +{ \ + ok_eq_uint((Event)->Header.Type, ExpectedType); \ + ok_eq_uint((Event)->Header.Hand, sizeof *(Event) / sizeof(ULONG)); \ + ok_eq_long((Event)->Header.Lock & 0xFF00FF00L, 0x55005500L); \ + ok_eq_long((Event)->Header.SignalState, State); \ + ok_eq_pointer((Event)->Header.WaitListHead.Flink, \ + &(Event)->Header.WaitListHead); \ + ok_eq_pointer((Event)->Header.WaitListHead.Blink, \ + &(Event)->Header.WaitListHead); \ + ok_eq_long(KeReadStateEvent(Event), State); \ + ok_eq_bool(Thread->WaitNext, ExpectedWaitNext); \ + ok_irql(Irql); \ +} while (0) + +static +VOID +TestEventFunctional( + IN PKEVENT Event, + IN EVENT_TYPE Type, + IN KIRQL OriginalIrql) +{ + LONG State; + PKTHREAD Thread = KeGetCurrentThread(); + + memset(Event, 0x55, sizeof *Event); + KeInitializeEvent(Event, Type, FALSE); + CheckEvent(Event, Type, 0L, FALSE, OriginalIrql); + + memset(Event, 0x55, sizeof *Event); + KeInitializeEvent(Event, Type, TRUE); + CheckEvent(Event, Type, 1L, FALSE, OriginalIrql); + + Event->Header.SignalState = 0x12345678L; + CheckEvent(Event, Type, 0x12345678L, FALSE, OriginalIrql); + + State = KePulseEvent(Event, 0, FALSE); + CheckEvent(Event, Type, 0L, FALSE, OriginalIrql); + ok_eq_long(State, 0x12345678L); + + Event->Header.SignalState = 0x12345678L; + KeClearEvent(Event); + CheckEvent(Event, Type, 0L, FALSE, OriginalIrql); + + State = KeSetEvent(Event, 0, FALSE); + CheckEvent(Event, Type, 1L, FALSE, OriginalIrql); + ok_eq_long(State, 0L); + + State = KeResetEvent(Event); + CheckEvent(Event, Type, 0L, FALSE, OriginalIrql); + ok_eq_long(State, 1L); + + Event->Header.SignalState = 0x23456789L; + State = KeSetEvent(Event, 0, FALSE); + CheckEvent(Event, Type, 1L, FALSE, OriginalIrql); + ok_eq_long(State, 0x23456789L); + + Event->Header.SignalState = 0x3456789AL; + State = KeResetEvent(Event); + CheckEvent(Event, Type, 0L, FALSE, OriginalIrql); + ok_eq_long(State, 0x3456789AL); + + if (OriginalIrql <= DISPATCH_LEVEL || !KmtIsCheckedBuild) + { + Event->Header.SignalState = 0x456789ABL; + State = KeSetEvent(Event, 0, TRUE); + CheckEvent(Event, Type, 1L, TRUE, DISPATCH_LEVEL); + ok_eq_long(State, 0x456789ABL); + ok_eq_uint(Thread->WaitIrql, OriginalIrql); + /* repair the "damage" */ + Thread->WaitNext = FALSE; + KmtSetIrql(OriginalIrql); + + Event->Header.SignalState = 0x56789ABCL; + State = KePulseEvent(Event, 0, TRUE); + CheckEvent(Event, Type, 0L, TRUE, DISPATCH_LEVEL); + ok_eq_long(State, 0x56789ABCL); + ok_eq_uint(Thread->WaitIrql, OriginalIrql); + /* repair the "damage" */ + Thread->WaitNext = FALSE; + KmtSetIrql(OriginalIrql); + } + + ok_irql(OriginalIrql); + KmtSetIrql(OriginalIrql); +} + +START_TEST(KeEvent) +{ + KEVENT Event; + KIRQL Irql; + KIRQL Irqls[] = { PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL, HIGH_LEVEL }; + int i; + + for (i = 0; i < sizeof Irqls / sizeof Irqls[0]; ++i) + { + KeRaiseIrql(Irqls[i], &Irql); + TestEventFunctional(&Event, NotificationEvent, Irqls[i]); + TestEventFunctional(&Event, SynchronizationEvent, Irqls[i]); + KeLowerIrql(Irql); + } + + ok_irql(PASSIVE_LEVEL); + KmtSetIrql(PASSIVE_LEVEL); +}
Propchange: branches/GSoC_2011/KMTestSuite/kmtests/ntos_ke/KeEvent.c ------------------------------------------------------------------------------ svn:eol-style = native