[PATCH] [Server]: correctly set the DR0..7 registers on Linux for x86_64 architecture

Eric Pouech eric.pouech at orange.fr
Wed Apr 7 14:05:45 CDT 2010




A+
---

 server/ptrace.c |   71 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 53 insertions(+), 18 deletions(-)


diff --git a/server/ptrace.c b/server/ptrace.c
index 4fa48ec..8bea7ed 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -549,12 +549,27 @@ void get_thread_context( struct thread *thread, context_t *context, unsigned int
             goto done;
         }
     }
-    context->debug.i386_regs.dr0 = data[0];
-    context->debug.i386_regs.dr1 = data[1];
-    context->debug.i386_regs.dr2 = data[2];
-    context->debug.i386_regs.dr3 = data[3];
-    context->debug.i386_regs.dr6 = data[6];
-    context->debug.i386_regs.dr7 = data[7];
+    switch (context->cpu)
+    {
+    case CPU_x86:
+        context->debug.i386_regs.dr0 = data[0];
+        context->debug.i386_regs.dr1 = data[1];
+        context->debug.i386_regs.dr2 = data[2];
+        context->debug.i386_regs.dr3 = data[3];
+        context->debug.i386_regs.dr6 = data[6];
+        context->debug.i386_regs.dr7 = data[7];
+        break;
+    case CPU_x86_64:
+        context->debug.x86_64_regs.dr0 = data[0];
+        context->debug.x86_64_regs.dr1 = data[1];
+        context->debug.x86_64_regs.dr2 = data[2];
+        context->debug.x86_64_regs.dr3 = data[3];
+        context->debug.x86_64_regs.dr6 = data[6];
+        context->debug.x86_64_regs.dr7 = data[7];
+    default:
+        set_error( STATUS_INVALID_PARAMETER );
+        goto done;
+    }
     context->flags |= SERVER_CTX_DEBUG_REGISTERS;
 done:
     resume_after_ptrace( thread );
@@ -570,18 +585,38 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign
 
     if (!suspend_for_ptrace( thread )) return;
 
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.i386_regs.dr0 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr0 = context->debug.i386_regs.dr0;
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.i386_regs.dr1 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr1 = context->debug.i386_regs.dr1;
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->debug.i386_regs.dr2 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr2 = context->debug.i386_regs.dr2;
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(3), context->debug.i386_regs.dr3 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr3 = context->debug.i386_regs.dr3;
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(6), context->debug.i386_regs.dr6 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr6 = context->debug.i386_regs.dr6;
-    if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.i386_regs.dr7 ) == -1) goto error;
-    if (thread->context) thread->context->debug.i386_regs.dr7 = context->debug.i386_regs.dr7;
+    switch (context->cpu)
+    {
+    case CPU_x86:
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.i386_regs.dr0 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr0 = context->debug.i386_regs.dr0;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.i386_regs.dr1 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr1 = context->debug.i386_regs.dr1;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->debug.i386_regs.dr2 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr2 = context->debug.i386_regs.dr2;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(3), context->debug.i386_regs.dr3 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr3 = context->debug.i386_regs.dr3;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(6), context->debug.i386_regs.dr6 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr6 = context->debug.i386_regs.dr6;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.i386_regs.dr7 ) == -1) goto error;
+        if (thread->context) thread->context->debug.i386_regs.dr7 = context->debug.i386_regs.dr7;
+        break;
+    case CPU_x86_64:
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.x86_64_regs.dr0 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr0 = context->debug.x86_64_regs.dr0;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.x86_64_regs.dr1 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr1 = context->debug.x86_64_regs.dr1;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->debug.x86_64_regs.dr2 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr2 = context->debug.x86_64_regs.dr2;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(3), context->debug.x86_64_regs.dr3 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr3 = context->debug.x86_64_regs.dr3;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(6), context->debug.x86_64_regs.dr6 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr6 = context->debug.x86_64_regs.dr6;
+        if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.x86_64_regs.dr7 ) == -1) goto error;
+        if (thread->context) thread->context->debug.x86_64_regs.dr7 = context->debug.x86_64_regs.dr7;
+    default:
+        set_error( STATUS_INVALID_PARAMETER );
+    }
     resume_after_ptrace( thread );
     return;
  error:






More information about the wine-patches mailing list