Alexandre Julliard : server: Fixed get_thread_context for x86_64.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 11 06:10:29 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jul 11 12:06:38 2006 +0200

server: Fixed get_thread_context for x86_64.

---

 server/ptrace.c |   51 +++++++++++++++++++++------------------------------
 1 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/server/ptrace.c b/server/ptrace.c
index 7aea8d5..c3d7249 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -29,9 +29,6 @@ #include <sys/types.h>
 #ifdef HAVE_SYS_PTRACE_H
 # include <sys/ptrace.h>
 #endif
-#ifdef HAVE_SYS_REG_H
-#include <sys/reg.h>
-#endif
 #ifdef HAVE_SYS_PARAM_H
 # include <sys/param.h>
 #endif
@@ -468,44 +465,38 @@ # include <sys/user.h>
 #endif
 
 /* debug register offset in struct user */
-#define DR_OFFSET(dr) ((int)((((struct user *)0)->u_debugreg) + (dr)))
-
-/* retrieve a debug register */
-static inline int get_debug_reg( int pid, int num, DWORD *data )
-{
-    int res;
-    errno = 0;
-    res = ptrace( PTRACE_PEEKUSER, pid, DR_OFFSET(num), 0 );
-    if ((res == -1) && errno)
-    {
-        file_set_error();
-        return -1;
-    }
-    *data = res;
-    return 0;
-}
+#define DR_OFFSET(dr) ((((struct user *)0)->u_debugreg) + (dr))
 
 /* retrieve the thread x86 registers */
 void get_thread_context( struct thread *thread, CONTEXT *context, unsigned int flags )
 {
-    int pid = get_ptrace_pid(thread);
+    int i, pid = get_ptrace_pid(thread);
+    long data[8];
 
     /* all other regs are handled on the client side */
     assert( (flags | CONTEXT_i386) == CONTEXT_DEBUG_REGISTERS );
 
     if (!suspend_for_ptrace( thread )) return;
 
-    if (get_debug_reg( pid, 0, &context->Dr0 ) == -1) goto error;
-    if (get_debug_reg( pid, 1, &context->Dr1 ) == -1) goto error;
-    if (get_debug_reg( pid, 2, &context->Dr2 ) == -1) goto error;
-    if (get_debug_reg( pid, 3, &context->Dr3 ) == -1) goto error;
-    if (get_debug_reg( pid, 6, &context->Dr6 ) == -1) goto error;
-    if (get_debug_reg( pid, 7, &context->Dr7 ) == -1) goto error;
+    for (i = 0; i < 8; i++)
+    {
+        if (i == 4 || i == 5) continue;
+        errno = 0;
+        data[i] = ptrace( PTRACE_PEEKUSER, pid, DR_OFFSET(i), 0 );
+        if ((data[i] == -1) && errno)
+        {
+            file_set_error();
+            goto done;
+        }
+    }
+    context->Dr0 = data[0];
+    context->Dr1 = data[1];
+    context->Dr2 = data[2];
+    context->Dr3 = data[3];
+    context->Dr6 = data[6];
+    context->Dr7 = data[7];
     context->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
-    resume_after_ptrace( thread );
-    return;
- error:
-    file_set_error();
+done:
     resume_after_ptrace( thread );
 }
 




More information about the wine-cvs mailing list