From: Jeff Dike Add some of the 2.6.10 ptrace updates. Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton --- 25-akpm/arch/um/kernel/ptrace.c | 28 ++++++++++++++++++++++++++-- 25-akpm/include/asm-um/ptrace-generic.h | 5 +++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff -puN arch/um/kernel/ptrace.c~uml-2610-ptrace-updates arch/um/kernel/ptrace.c --- 25/arch/um/kernel/ptrace.c~uml-2610-ptrace-updates 2005-01-09 23:44:17.114561680 -0800 +++ 25-akpm/arch/um/kernel/ptrace.c 2005-01-09 23:44:17.119560920 -0800 @@ -307,6 +307,25 @@ long sys_ptrace(long request, long pid, return ret; } +void send_sigtrap(struct task_struct *tsk, union uml_pt_regs *regs, + int error_code) +{ + struct siginfo info; + + memset(&info, 0, sizeof(info)); + info.si_signo = SIGTRAP; + info.si_code = TRAP_BRKPT; + + /* User-mode eip? */ + info.si_addr = UPT_IS_USER(regs) ? (void __user *) UPT_IP(regs) : NULL; + + /* Send us the fakey SIGTRAP */ + force_sig_info(SIGTRAP, &info, tsk); +} + +/* XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and + * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check + */ void syscall_trace(union uml_pt_regs *regs, int entryexit) { int is_singlestep = (current->ptrace & PT_DTRACE) && entryexit; @@ -321,14 +340,19 @@ void syscall_trace(union uml_pt_regs *re audit_syscall_exit(current, regs->eax); } - if (!test_thread_flag(TIF_SYSCALL_TRACE) && !is_singlestep) + /* Fake a debug trap */ + if (is_singlestep) + send_sigtrap(current, regs, 0); + + if (!test_thread_flag(TIF_SYSCALL_TRACE)) return; + if (!(current->ptrace & PT_PTRACED)) return; /* the 0x80 provides a way for the tracing parent to distinguish between a syscall stop and SIGTRAP delivery */ - tracesysgood = (current->ptrace & PT_TRACESYSGOOD) && !is_singlestep; + tracesysgood = (current->ptrace & PT_TRACESYSGOOD); ptrace_notify(SIGTRAP | (tracesysgood ? 0x80 : 0)); if (entryexit) /* force do_signal() --> is_syscall() */ diff -puN include/asm-um/ptrace-generic.h~uml-2610-ptrace-updates include/asm-um/ptrace-generic.h --- 25/include/asm-um/ptrace-generic.h~uml-2610-ptrace-updates 2005-01-09 23:44:17.115561528 -0800 +++ 25-akpm/include/asm-um/ptrace-generic.h 2005-01-09 23:44:17.119560920 -0800 @@ -12,11 +12,13 @@ #define pt_regs pt_regs_subarch #define show_regs show_regs_subarch +#define send_sigtrap send_sigtrap_subarch #include "asm/arch/ptrace.h" #undef pt_regs #undef show_regs +#undef send_sigtrap #undef user_mode #undef instruction_pointer @@ -55,6 +57,9 @@ extern int set_fpxregs(unsigned long buf extern void show_regs(struct pt_regs *regs); +extern void send_sigtrap(struct task_struct *tsk, union uml_pt_regs *regs, + int error_code); + #endif #endif _