Eric Pouech : server: Correctly set the DR0.. 7 registers on Linux for x86_64 architecture.
Module: wine Branch: master Commit: 9f49c6a05f33d04882ada4804315bdafe99f2b79 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9f49c6a05f33d04882ada48043... Author: Eric Pouech <eric.pouech(a)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:
participants (1)
-
Alexandre Julliard