Alexandre Julliard : ntdll: Add test cases for the direction flag.

Alexandre Julliard julliard at winehq.org
Thu Mar 20 09:48:28 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 20 12:24:54 2008 +0100

ntdll: Add test cases for the direction flag.

---

 dlls/ntdll/tests/exception.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index ae3c84b..d6168ee 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -469,6 +469,30 @@ static DWORD align_check_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_
     return ExceptionContinueExecution;
 }
 
+/* Test the direction flag handling. */
+static const BYTE direction_flag_code[] = {
+    0x55,                  	/* push   %ebp */
+    0x89,0xe5,             	/* mov    %esp,%ebp */
+    0xfd,                  	/* std */
+    0xfa,                  	/* cli - cause exception */
+    0x5d,                  	/* pop    %ebp */
+    0xc3,                  	/* ret     */
+};
+
+static DWORD direction_flag_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
+                                     CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
+{
+#ifdef __GNUC__
+    unsigned int flags;
+    __asm__("pushfl; popl %0" : "=r" (flags) );
+    ok( !(flags & 0x400), "eflags has DF bit set\n" );
+#endif
+    ok( context->EFlags & 0x400, "context eflags has DF bit cleared\n" );
+    got_exception++;
+    context->Eip++;  /* skip cli */
+    return ExceptionContinueExecution;
+}
+
 /* test single stepping over hardware breakpoint */
 static DWORD bpx_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame,
                           CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
@@ -560,6 +584,11 @@ static void test_exceptions(void)
     run_exception_test(align_check_handler, NULL, align_check_code, sizeof(align_check_code));
     ok(got_exception == 0, "got %d alignment faults, expected 0\n", got_exception);
 
+    /* test direction flag */
+    got_exception = 0;
+    run_exception_test(direction_flag_handler, NULL, direction_flag_code, sizeof(direction_flag_code));
+    ok(got_exception == 1, "got %d exceptions, expected 1\n", got_exception);
+
     /* test single stepping over hardware breakpoint */
     memset(&ctx, 0, sizeof(ctx));
     ctx.Dr0 = (DWORD) code_mem;  /* set hw bp on first nop */




More information about the wine-cvs mailing list