X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Farm26%2Fkernel%2Fptrace.c;h=9343889b27fe897cc647533287f9989f5ab65ce4;hb=567f20a20be06ad546b5962340c4be268462055b;hp=27b852952cab273ee7df359221bd0d95f39e3f50;hpb=653a9213ae6f303790975dd836d95778aab070de;p=linux-2.6.git diff --git a/arch/arm26/kernel/ptrace.c b/arch/arm26/kernel/ptrace.c index 27b852952..9343889b2 100644 --- a/arch/arm26/kernel/ptrace.c +++ b/arch/arm26/kernel/ptrace.c @@ -653,16 +653,30 @@ asmlinkage void syscall_trace(int why, struct pt_regs *regs) { unsigned long ip; - if (test_thread_flag(TIF_SYSCALL_TRACE)) { - /* - * Save IP. IP is used to denote syscall entry/exit: - * IP = 0 -> entry, = 1 -> exit - */ - ip = regs->ARM_ip; - regs->ARM_ip = why; + if (!test_thread_flag(TIF_SYSCALL_TRACE)) + return; + if (!(current->ptrace & PT_PTRACED)) + return; - tracehook_report_syscall(regs, why); + /* + * Save IP. IP is used to denote syscall entry/exit: + * IP = 0 -> entry, = 1 -> exit + */ + ip = regs->ARM_ip; + regs->ARM_ip = why; - regs->ARM_ip = ip; + /* the 0x80 provides a way for the tracing parent to distinguish + between a syscall stop and SIGTRAP delivery */ + ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0)); + /* + * this isn't the same as continuing with a signal, but it will do + * for normal use. strace only continues with a signal if the + * stopping signal is not SIGTRAP. -brl + */ + if (current->exit_code) { + send_sig(current->exit_code, current, 1); + current->exit_code = 0; } + regs->ARM_ip = ip; }