server: Set RW and LEN bits of DR7 before setting DR0-DR3.

This commit is contained in:
Grazvydas Ignotas 2011-07-15 23:19:10 +03:00 committed by Alexandre Julliard
parent 382d953872
commit fa179b1c26
2 changed files with 3 additions and 2 deletions

View File

@ -509,12 +509,10 @@ static void check_debug_registers(int test_num, const struct dbgreg_test *test)
CHECK_DEBUG_REG(0, ~0); CHECK_DEBUG_REG(0, ~0);
CHECK_DEBUG_REG(1, ~0); CHECK_DEBUG_REG(1, ~0);
if (test_num == 2) todo_wine
CHECK_DEBUG_REG(2, ~0); CHECK_DEBUG_REG(2, ~0);
if (test_num == 2) todo_wine if (test_num == 2) todo_wine
CHECK_DEBUG_REG(3, ~0); CHECK_DEBUG_REG(3, ~0);
CHECK_DEBUG_REG(6, 0x0f); CHECK_DEBUG_REG(6, 0x0f);
if (test_num == 2) todo_wine
CHECK_DEBUG_REG(7, ~0xdc00); CHECK_DEBUG_REG(7, ~0xdc00);
} }

View File

@ -593,6 +593,8 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign
switch (context->cpu) switch (context->cpu)
{ {
case CPU_x86: case CPU_x86:
/* Linux 2.6.33+ does DR0-DR3 alignment validation, so it has to know LEN bits first */
if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.i386_regs.dr7 & 0xffff0000 ) == -1) goto error;
if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.i386_regs.dr0 ) == -1) goto error; 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 (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 (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.i386_regs.dr1 ) == -1) goto error;
@ -607,6 +609,7 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign
if (thread->context) thread->context->debug.i386_regs.dr7 = context->debug.i386_regs.dr7; if (thread->context) thread->context->debug.i386_regs.dr7 = context->debug.i386_regs.dr7;
break; break;
case CPU_x86_64: case CPU_x86_64:
if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->debug.x86_64_regs.dr7 & 0xffff0000 ) == -1) goto error;
if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->debug.x86_64_regs.dr0 ) == -1) goto error; 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 (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 (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->debug.x86_64_regs.dr1 ) == -1) goto error;