Zebediah Figura : ntdll/tests: Fix AVX tests on processors that don't support XSAVEOPT.

Alexandre Julliard julliard at winehq.org
Thu Jun 24 16:16:45 CDT 2021


Module: wine
Branch: master
Commit: 2554daf1bfc32febd949ee349a141df5c521225a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2554daf1bfc32febd949ee349a141df5c521225a

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Jun 24 11:14:34 2021 -0500

ntdll/tests: Fix AVX tests on processors that don't support XSAVEOPT.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/exception.c | 58 ++++++++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 18 deletions(-)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 7e849fba1aa..1a63a717d21 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -7562,7 +7562,7 @@ static const unsigned test_extended_context_spoil_data1[8] = {0x10, 0x20, 0x30,
 static const unsigned test_extended_context_spoil_data2[8] = {0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85};
 
 static BOOL test_extended_context_modified_state;
-static BOOL compaction_enabled;
+static BOOL xsaveopt_enabled, compaction_enabled;
 
 static DWORD test_extended_context_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
         CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher)
@@ -7603,9 +7603,11 @@ static DWORD test_extended_context_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGI
     context_ymm_data = (unsigned int *)&xs->YmmContext;
     ok(!((ULONG_PTR)xs % 64), "Got unexpected xs %p.\n", xs);
 
-    ok((compaction_enabled && (xs->CompactionMask & (expected_compaction_mask | 3)) == expected_compaction_mask)
-            || (!compaction_enabled && !xs->CompactionMask), "Got unexpected CompactionMask %s, compaction %#x.\n",
-            wine_dbgstr_longlong(xs->CompactionMask), compaction_enabled);
+    if (compaction_enabled)
+        ok((xs->CompactionMask & (expected_compaction_mask | 3)) == expected_compaction_mask,
+                "Got compaction mask %#I64x.\n", xs->CompactionMask);
+    else
+        ok(!xs->CompactionMask, "Got compaction mask %#I64x.\n", xs->CompactionMask);
 
     if (test_extended_context_modified_state)
     {
@@ -7615,9 +7617,13 @@ static DWORD test_extended_context_handler(EXCEPTION_RECORD *rec, EXCEPTION_REGI
     }
     else
     {
-        ok(!xs->Mask, "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask));
-        /* The save area has garbage in this case, the state should be restored to INIT_STATE
-         * without using these data. */
+        ok(xs->Mask == (xsaveopt_enabled ? 0 : 4), "Got unexpected Mask %#I64x.\n", xs->Mask);
+        /* The save area has garbage if xsaveopt is available, so we can't test
+         * its contents. */
+
+        /* Clear the mask; the state should be restored to INIT_STATE without
+         * using this data. */
+        xs->Mask = 0;
         memcpy(context_ymm_data, test_extended_context_spoil_data1 + 4, sizeof(M128A));
     }
 
@@ -7897,6 +7903,7 @@ static void test_extended_context(void)
         int regs[4];
 
         __cpuidex(regs, 0xd, 1);
+        xsaveopt_enabled = regs[0] & 1;
         compaction_enabled = regs[0] & 2;
     }
 
@@ -8547,7 +8554,7 @@ static void test_extended_context(void)
             "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError());
     ok(context->ContextFlags == expected_flags, "Got unexpected ContextFlags %#x.\n",
             context->ContextFlags);
-    ok(xs->Mask == (compaction_enabled ? 0 : 4), "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask));
+    ok(xs->Mask == (compaction_enabled ? 0 : 4), "Got unexpected Mask %#I64x.\n", xs->Mask);
     ok(xs->CompactionMask == 4, "Got unexpected CompactionMask %s.\n",
             wine_dbgstr_longlong(xs->CompactionMask));
     for (i = 0; i < 4; ++i)
@@ -8618,7 +8625,7 @@ static void test_extended_context(void)
     expected_compaction = compaction_enabled ? ((ULONG64)1 << 63) | 4 : 0;
 
     xs = (XSTATE *)((BYTE *)context_ex + context_ex->XState.Offset);
-    ok(!xs->Mask, "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask));
+    ok(xs->Mask == (xsaveopt_enabled ? 0 : 4), "Got unexpected Mask %#I64x.\n", xs->Mask);
     ok(xs->CompactionMask == expected_compaction, "Got unexpected CompactionMask %s.\n",
             wine_dbgstr_longlong(xs->CompactionMask));
 
@@ -8626,12 +8633,13 @@ static void test_extended_context(void)
         ok(!data[i], "Got unexpected data %#x, i %u.\n", data[i], i);
 
     for (i = 0; i < 4; ++i)
-        ok(((ULONG *)&xs->YmmContext)[i] == 0xcccccccc
+        ok(((ULONG *)&xs->YmmContext)[i] == ((xs->Mask & 4) ? 0 : 0xcccccccc)
                 || broken(((ULONG *)&xs->YmmContext)[i] == test_extended_context_data[i + 4]),
                 "Got unexpected data %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
 
     /* Test fault exception context. */
     memset(data, 0xff, sizeof(data));
+    xs->Mask = 0;
     test_extended_context_modified_state = FALSE;
     run_exception_test(test_extended_context_handler, NULL, except_code_reset_ymm_state,
             ARRAY_SIZE(except_code_reset_ymm_state), PAGE_EXECUTE_READ);
@@ -8664,12 +8672,13 @@ static void test_extended_context(void)
 
     bret = GetThreadContext(thread, context);
     ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError());
-    ok(!xs->Mask, "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask));
+    todo_wine_if (!xsaveopt_enabled)
+        ok(xs->Mask == (xsaveopt_enabled ? 0 : 4), "Got unexpected Mask %#I64x.\n", xs->Mask);
     ok(xs->CompactionMask == expected_compaction, "Got unexpected CompactionMask %s.\n",
             wine_dbgstr_longlong(xs->CompactionMask));
     for (i = 0; i < 16 * 4; ++i)
-        ok(((ULONG *)&xs->YmmContext)[i] == 0xcccccccc, "Got unexpected value %#x, i %u.\n",
-                ((ULONG *)&xs->YmmContext)[i], i);
+        ok(((ULONG *)&xs->YmmContext)[i] == ((xs->Mask & 4) ? 0 : 0xcccccccc),
+                "Got unexpected value %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
 
     pSetXStateFeaturesMask(context, 4);
     memset(&xs->YmmContext, 0, sizeof(xs->YmmContext));
@@ -8725,11 +8734,24 @@ static void test_extended_context(void)
     memset(&xs->YmmContext, 0xcc, sizeof(xs->YmmContext));
     bret = GetThreadContext(thread, context);
     ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError());
-    ok(!xs->Mask || (sizeof(void *) == 4 && xs->Mask == 4),
-            "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask));
-    for (i = 0; i < 16 * 4; ++i)
-        ok(((ULONG *)&xs->YmmContext)[i] == (xs->Mask ? (i < 8 * 4 ? 0 : 0x48484848) : 0xcccccccc),
-                "Got unexpected value %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
+    todo_wine_if (!xsaveopt_enabled && sizeof(void *) != 4)
+        ok(xs->Mask == (xsaveopt_enabled ? 0 : 4) || (sizeof(void *) == 4 && xs->Mask == 4),
+                "Got unexpected Mask %#I64x.\n", xs->Mask);
+    if (xs->Mask == 4)
+    {
+        for (i = 0; i < 8 * sizeof(void *); ++i)
+            ok(((ULONG *)&xs->YmmContext)[i] == 0,
+                    "Got unexpected value %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
+        for (; i < 16 * 4; ++i)
+            ok(((ULONG *)&xs->YmmContext)[i] == 0x48484848,
+                    "Got unexpected value %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
+    }
+    else
+    {
+        for (i = 0; i < 16 * 4; ++i)
+            ok(((ULONG *)&xs->YmmContext)[i] == 0xcccccccc,
+                    "Got unexpected value %#x, i %u.\n", ((ULONG *)&xs->YmmContext)[i], i);
+    }
 
     bret = ResumeThread(thread);
     ok(bret, "Got unexpected bret %#x, GetLastError() %u.\n", bret, GetLastError());




More information about the wine-cvs mailing list