--- ./arch/i386/kernel/ptrace.c.orig 2006-02-16 02:01:15.000000000 +0000 +++ ./arch/i386/kernel/ptrace.c 2006-02-16 01:57:40.000000000 +0000 @@ -362,6 +362,8 @@ long arch_ptrace(struct task_struct *chi struct user * dummy = NULL; int i, ret; unsigned long __user *datap = (unsigned long __user *)data; + unsigned long old_flags; + struct pt_regs *regs; switch (request) { /* when I and D space are separate, these will need to be fixed. */ @@ -544,10 +546,20 @@ long arch_ptrace(struct task_struct *chi ret = -EIO; break; } + + regs = get_child_regs(child); + old_flags = regs->eflags; + + if (test_tsk_thread_flag(child, TIF_SINGLESTEP)) + regs->eflags |= TRAP_FLAG; + for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) { __put_user(getreg(child, i), datap); datap++; } + + regs->eflags = old_flags; + ret = 0; break; } @@ -558,11 +570,18 @@ long arch_ptrace(struct task_struct *chi ret = -EIO; break; } + + regs = get_child_regs(child); + old_flags = regs->eflags; + for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) { __get_user(tmp, datap); putreg(child, i, tmp); datap++; } + + regs->eflags = (regs->eflags & ~TRAP_FLAG) | (old_flags & TRAP_FLAG); + ret = 0; break; }