Eric Pouech : server: Correctly set the DR0.. 7 registers on Linux for x86_64 architecture.
Alexandre Julliard
julliard at winehq.org
Thu Apr 8 11:12:42 CDT 2010
Module: wine
Branch: master
Commit: 9f49c6a05f33d04882ada4804315bdafe99f2b79
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9f49c6a05f33d04882ada4804315bdafe99f2b79
Author: Eric Pouech <eric.pouech at orange.fr>
Date: Wed Apr 7 21:05:45 2010 +0200
server: Correctly set the DR0..7 registers on Linux for x86_64 architecture.
---
server/ptrace.c | 73 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 55 insertions(+), 18 deletions(-)
diff --git a/server/ptrace.c b/server/ptrace.c
index 4fa48ec..b8a31cf 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -549,12 +549,28 @@ 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];
+ break;
+ default:
+ set_error( STATUS_INVALID_PARAMETER );
+ goto done;
+ }
context->flags |= SERVER_CTX_DEBUG_REGISTERS;
done:
resume_after_ptrace( thread );
@@ -570,18 +586,39 @@ 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;
+ break;
+ default:
+ set_error( STATUS_INVALID_PARAMETER );
+ }
resume_after_ptrace( thread );
return;
error:
More information about the wine-cvs
mailing list