Grazvydas Ignotas : ntdll/tests: Add more debug register tests.

Alexandre Julliard julliard at winehq.org
Mon Jul 18 12:46:59 CDT 2011


Module: wine
Branch: master
Commit: 382d953872297a327f125ec1103a9e46709c2413
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=382d953872297a327f125ec1103a9e46709c2413

Author: Grazvydas Ignotas <notasas at gmail.com>
Date:   Fri Jul 15 23:19:09 2011 +0300

ntdll/tests: Add more debug register tests.

---

 dlls/ntdll/tests/exception.c |   65 +++++++++++++++++++++++++++++++++--------
 1 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 386c5a6..194bfae 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -474,20 +474,50 @@ static void test_prot_fault(void)
     }
 }
 
+struct dbgreg_test {
+    DWORD dr0, dr1, dr2, dr3, dr6, dr7;
+};
+
 /* test handling of debug registers */
 static DWORD dreg_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
                       CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
 {
+    const struct dbgreg_test *test = *(const struct dbgreg_test **)(frame + 1);
+
     context->Eip += 2;	/* Skips the popl (%eax) */
-    context->Dr0 = 0x42424242;
-    context->Dr1 = 0;
-    context->Dr2 = 0;
-    context->Dr3 = 0;
-    context->Dr6 = 0;
-    context->Dr7 = 0x155;
+    context->Dr0 = test->dr0;
+    context->Dr1 = test->dr1;
+    context->Dr2 = test->dr2;
+    context->Dr3 = test->dr3;
+    context->Dr6 = test->dr6;
+    context->Dr7 = test->dr7;
     return ExceptionContinueExecution;
 }
 
+#define CHECK_DEBUG_REG(n, m) \
+    ok((ctx.Dr##n & m) == test->dr##n, "(%d) failed to set debug register " #n " to %x, got %x\n", \
+       test_num, test->dr##n, ctx.Dr##n)
+
+static void check_debug_registers(int test_num, const struct dbgreg_test *test)
+{
+    CONTEXT ctx;
+    NTSTATUS status;
+
+    ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
+    status = pNtGetContextThread(GetCurrentThread(), &ctx);
+    ok(status == STATUS_SUCCESS, "NtGetContextThread failed with %x\n", status);
+
+    CHECK_DEBUG_REG(0, ~0);
+    CHECK_DEBUG_REG(1, ~0);
+if (test_num == 2) todo_wine
+    CHECK_DEBUG_REG(2, ~0);
+if (test_num == 2) todo_wine
+    CHECK_DEBUG_REG(3, ~0);
+    CHECK_DEBUG_REG(6, 0x0f);
+if (test_num == 2) todo_wine
+    CHECK_DEBUG_REG(7, ~0xdc00);
+}
+
 static const BYTE segfault_code[5] = {
 	0x31, 0xc0, /* xor    %eax,%eax */
 	0x8f, 0x00, /* popl   (%eax) - cause exception */
@@ -644,6 +674,7 @@ static void test_exceptions(void)
 {
     CONTEXT ctx;
     NTSTATUS res;
+    struct dbgreg_test dreg_test;
 
     if (!pNtGetContextThread || !pNtSetContextThread)
     {
@@ -652,13 +683,21 @@ static void test_exceptions(void)
     }
 
     /* test handling of debug registers */
-    run_exception_test(dreg_handler, NULL, &segfault_code, sizeof(segfault_code), 0);
-
-    ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
-    res = pNtGetContextThread(GetCurrentThread(), &ctx);
-    ok (res == STATUS_SUCCESS,"NtGetContextThread failed with %x\n", res);
-    ok(ctx.Dr0 == 0x42424242,"failed to set debugregister 0 to 0x42424242, got %x\n", ctx.Dr0);
-    ok((ctx.Dr7 & ~0xdc00) == 0x155,"failed to set debugregister 7 to 0x155, got %x\n", ctx.Dr7);
+    memset(&dreg_test, 0, sizeof(dreg_test));
+
+    dreg_test.dr0 = 0x42424240;
+    dreg_test.dr2 = 0x126bb070;
+    dreg_test.dr3 = 0x0badbad0;
+    dreg_test.dr7 = 0xffff0115;
+    run_exception_test(dreg_handler, &dreg_test, &segfault_code, sizeof(segfault_code), 0);
+    check_debug_registers(1, &dreg_test);
+
+    dreg_test.dr0 = 0x42424242;
+    dreg_test.dr2 = 0x100f0fe7;
+    dreg_test.dr3 = 0x0abebabe;
+    dreg_test.dr7 = 0x115;
+    run_exception_test(dreg_handler, &dreg_test, &segfault_code, sizeof(segfault_code), 0);
+    check_debug_registers(2, &dreg_test);
 
     /* test single stepping behavior */
     got_exception = 0;




More information about the wine-cvs mailing list