Alexandre Julliard : ntdll/tests: Fix exception test for CPUs that do segment limit checks differently.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 10 05:35:46 CST 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jan 10 11:58:16 2007 +0100

ntdll/tests: Fix exception test for CPUs that do segment limit checks differently.

---

 dlls/ntdll/tests/exception.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 9e729a4..d18f3d2 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -145,9 +145,9 @@ static const struct exception
     { { 0xa1, 0xfc, 0xff, 0xff, 0xff, 0xc3 },  /* movl 0xfffffffc,%eax; ret */
       0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffc } },
     { { 0xa1, 0xfd, 0xff, 0xff, 0xff, 0xc3 },  /* movl 0xfffffffd,%eax; ret */
-      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
+      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffd } },
     { { 0xa1, 0xfe, 0xff, 0xff, 0xff, 0xc3 },  /* movl 0xfffffffe,%eax; ret */
-      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
+      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xfffffffe } },
     { { 0xa1, 0xff, 0xff, 0xff, 0xff, 0xc3 },  /* movl 0xffffffff,%eax; ret */
       0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
 
@@ -155,11 +155,11 @@ static const struct exception
     { { 0xa3, 0xfc, 0xff, 0xff, 0xff, 0xc3 },  /* movl %eax,0xfffffffc; ret */
       0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffc } },
     { { 0xa3, 0xfd, 0xff, 0xff, 0xff, 0xc3 },  /* movl %eax,0xfffffffd; ret */
-      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
+      0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffd } },
     { { 0xa3, 0xfe, 0xff, 0xff, 0xff, 0xc3 },  /* movl %eax,0xfffffffe; ret */
-      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
+      0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xfffffffe } },
     { { 0xa3, 0xff, 0xff, 0xff, 0xff, 0xc3 },  /* movl %eax,0xffffffff; ret */
-      0, 5, STATUS_ACCESS_VIOLATION, 2, { 0, 0xffffffff } },
+      0, 5, STATUS_ACCESS_VIOLATION, 2, { 1, 0xffffffff } },
 };
 
 static int got_exception;
@@ -202,11 +202,21 @@ static DWORD handler( EXCEPTION_RECORD *
 
     ok( rec->NumberParameters == except->nb_params,
         "%u: Wrong number of parameters %u/%u\n", entry, rec->NumberParameters, except->nb_params );
+
+    /* Most CPUs (except Intel Core apparently) report a segment limit violation */
+    /* instead of page faults for accesses beyond 0xffffffff */
+    if (except->nb_params == 2 && except->params[1] >= 0xfffffffd)
+    {
+        if (rec->ExceptionInformation[0] == 0 && rec->ExceptionInformation[1] == 0xffffffff)
+            goto skip_params;
+    }
+
     for (i = 0; i < rec->NumberParameters; i++)
         ok( rec->ExceptionInformation[i] == except->params[i],
             "%u: Wrong parameter %d: %lx/%x\n",
             entry, i, rec->ExceptionInformation[i], except->params[i] );
 
+skip_params:
     /* don't handle exception if it's not the address we expected */
     if (rec->ExceptionAddress != (char*)code_mem + except->offset) return ExceptionContinueSearch;
 




More information about the wine-cvs mailing list