From 2cc56f379c3a17d3274fc4b7e91ac648e10e641d Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Fri, 15 Jul 2011 23:19:11 +0300 Subject: [PATCH] server: Set debug enable bits briefly to commit the addresses to kernel. --- dlls/ntdll/tests/exception.c | 1 - server/ptrace.c | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index 9f80651d023..5d3f8c1f124 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -510,7 +510,6 @@ static void check_debug_registers(int test_num, const struct dbgreg_test *test) CHECK_DEBUG_REG(0, ~0); CHECK_DEBUG_REG(1, ~0); CHECK_DEBUG_REG(2, ~0); -if (test_num == 2) todo_wine CHECK_DEBUG_REG(3, ~0); CHECK_DEBUG_REG(6, 0x0f); CHECK_DEBUG_REG(7, ~0xdc00); diff --git a/server/ptrace.c b/server/ptrace.c index 6df95552cad..51157ab6a82 100644 --- a/server/ptrace.c +++ b/server/ptrace.c @@ -605,6 +605,8 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign 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; + /* Linux 2.6.33+ needs enable bits set briefly to update value returned by PEEKUSER later */ + ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.i386_regs.dr7 | 0x55 ); 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; @@ -620,6 +622,7 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign 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; + ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.x86_64_regs.dr7 | 0x55 ); 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;