diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 194bfaebcbb6c806ece2355f481043cfb23b4355..9f80651d023b2577bd0967fb8c3c550d9951808c 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -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(1, ~0);
-if (test_num == 2) todo_wine
     CHECK_DEBUG_REG(2, ~0);
 if (test_num == 2) todo_wine
     CHECK_DEBUG_REG(3, ~0);
     CHECK_DEBUG_REG(6, 0x0f);
-if (test_num == 2) todo_wine
     CHECK_DEBUG_REG(7, ~0xdc00);
 }
 
diff --git a/server/ptrace.c b/server/ptrace.c
index 69747edb765a29a5b2f86c2e46f48db97cfe5fc6..6df95552cad891560397b1ff46f57b94951027d2 100644
--- a/server/ptrace.c
+++ b/server/ptrace.c
@@ -593,6 +593,8 @@ void set_thread_context( struct thread *thread, const context_t *context, unsign
     switch (context->cpu)
     {
     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 (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;
@@ -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;
         break;
     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 (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;