[NTOS:KE] Write a basic kernel mode test for FPU Save/Restore mechanism 4259/head
authorGeorge Bișoc <george.bisoc@reactos.org>
Tue, 25 Jan 2022 12:20:05 +0000 (13:20 +0100)
committerGeorge Bișoc <george.bisoc@reactos.org>
Tue, 24 May 2022 16:39:46 +0000 (18:39 +0200)
modules/rostests/kmtests/CMakeLists.txt
modules/rostests/kmtests/kmtest_drv/testlist.c
modules/rostests/kmtests/ntos_ke/KeFloatPointState.c [new file with mode: 0644]

index 588dd3d..3561248 100644 (file)
@@ -74,6 +74,7 @@ list(APPEND KMTEST_DRV_SOURCE
     ntos_ke/KeDevQueue.c
     ntos_ke/KeDpc.c
     ntos_ke/KeEvent.c
+    ntos_ke/KeFloatPointState.c
     ntos_ke/KeGuardedMutex.c
     ntos_ke/KeIrql.c
     ntos_ke/KeMutex.c
index c9c3781..60352b2 100644 (file)
@@ -39,6 +39,7 @@ KMT_TESTFUNC Test_KeApc;
 KMT_TESTFUNC Test_KeDeviceQueue;
 KMT_TESTFUNC Test_KeDpc;
 KMT_TESTFUNC Test_KeEvent;
+KMT_TESTFUNC Test_KeFloatPointState;
 KMT_TESTFUNC Test_KeGuardedMutex;
 KMT_TESTFUNC Test_KeIrql;
 KMT_TESTFUNC Test_KeMutex;
@@ -119,6 +120,7 @@ const KMT_TEST TestList[] =
     { "KeDeviceQueue",                      Test_KeDeviceQueue },
     { "KeDpc",                              Test_KeDpc },
     { "KeEvent",                            Test_KeEvent },
+    { "KeFloatPointState",                  Test_KeFloatPointState },
     { "KeGuardedMutex",                     Test_KeGuardedMutex },
     { "KeIrql",                             Test_KeIrql },
     { "KeMutex",                            Test_KeMutex },
diff --git a/modules/rostests/kmtests/ntos_ke/KeFloatPointState.c b/modules/rostests/kmtests/ntos_ke/KeFloatPointState.c
new file mode 100644 (file)
index 0000000..9f229f5
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * PROJECT:     ReactOS kernel-mode tests
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Kernel mode tests for Save/Restore FPU state API kernel support
+ * COPYRIGHT:   Copyright 2022 George Bișoc <george.bisoc@reactos.org>
+ */
+
+#include <kmt_test.h>
+
+START_TEST(KeFloatPointState)
+{
+    NTSTATUS Status;
+    KFLOATING_SAVE FloatSave;
+    KIRQL Irql;
+
+    /* Save the state under normal conditions */
+    Status = KeSaveFloatingPointState(&FloatSave);
+    ok_irql(PASSIVE_LEVEL);
+    ok_eq_hex(Status, STATUS_SUCCESS);
+
+    /* Restore the FPU state back */
+    KeRestoreFloatingPointState(&FloatSave);
+
+    /* Try to raise the IRQL to APC and do some operations again */
+    KeRaiseIrql(APC_LEVEL, &Irql);
+
+    /* Save the state under APC_LEVEL interrupt */
+    Status = KeSaveFloatingPointState(&FloatSave);
+    ok_irql(APC_LEVEL);
+    ok_eq_hex(Status, STATUS_SUCCESS);
+
+    /* Restore the FPU state back */
+    KeRestoreFloatingPointState(&FloatSave);
+
+    /* Try to raise the IRQL to dispatch this time */
+    KeLowerIrql(Irql);
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
+    /* Save the state under DISPATCH_LEVEL interrupt */
+    Status = KeSaveFloatingPointState(&FloatSave);
+    ok_irql(DISPATCH_LEVEL);
+    ok_eq_hex(Status, STATUS_SUCCESS);
+
+    /* We're done */
+    KeRestoreFloatingPointState(&FloatSave);
+    KeLowerIrql(Irql);
+}