diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 08:50:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 08:50:01 -0700 |
commit | 37d9869ed928268409b48f52c57449918c0fd307 (patch) | |
tree | 7dd954260d723d1e0716b6432ba07b5c7be7f2ac /arch/s390/kernel/ptrace.c | |
parent | 098ef215b1e87cff51f983bae4e4e1358b932ec9 (diff) | |
parent | 89d49841e9e7a90b04b036b7dbe7521b55edbe24 (diff) | |
download | linux-37d9869ed928268409b48f52c57449918c0fd307.tar.gz linux-37d9869ed928268409b48f52c57449918c0fd307.tar.bz2 linux-37d9869ed928268409b48f52c57449918c0fd307.zip |
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6: (27 commits)
[S390] Fix checkstack for s390
[S390] fix initialization of stp
[S390] 3215: Remove tasklet.
[S390] console flush on panic / reboot
[S390] introduce dirty bit for kvm live migration
[S390] Add ioctl support for EMC Symmetrix Subsystem Control I/O
[S390] xpram: per device block request queues.
[S390] dasd: fix message flood for unsolicited interrupts
[S390] Move private simple udelay function to arch/s390/lib/delay.c.
[S390] dcssblk: add >2G DCSSs support and stacked contiguous DCSSs support.
[S390] ptrace changes
[S390] s390: use sys_pause for 31bit pause entry point
[S390] qdio enhanced SIGA (iqdio) support.
[S390] cio: fix cio_tpi.
[S390] cio: Correct use of ! and &
[S390] cio: inline assembly cleanup
[S390] bus_id -> dev_set_name() for css and ccw busses
[S390] bus_id ->dev_name() conversions in qdio
[S390] Use s390_root_dev_* in kvm_virtio.
[S390] more bus_id -> dev_name conversions
...
Diffstat (limited to 'arch/s390/kernel/ptrace.c')
-rw-r--r-- | arch/s390/kernel/ptrace.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index c8b08289eb87..1f31be1ecc4b 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c @@ -35,6 +35,7 @@ #include <linux/signal.h> #include <linux/elf.h> #include <linux/regset.h> +#include <linux/tracehook.h> #include <asm/segment.h> #include <asm/page.h> @@ -639,40 +640,44 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, } #endif -asmlinkage void -syscall_trace(struct pt_regs *regs, int entryexit) +asmlinkage long do_syscall_trace_enter(struct pt_regs *regs) { - if (unlikely(current->audit_context) && entryexit) - audit_syscall_exit(AUDITSC_RESULT(regs->gprs[2]), regs->gprs[2]); - - if (!test_thread_flag(TIF_SYSCALL_TRACE)) - goto out; - if (!(current->ptrace & PT_PTRACED)) - goto out; - ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) - ? 0x80 : 0)); + long ret; /* - * If the debuffer has set an invalid system call number, - * we prepare to skip the system call restart handling. + * The sysc_tracesys code in entry.S stored the system + * call number to gprs[2]. */ - if (!entryexit && regs->gprs[2] >= NR_syscalls) + ret = regs->gprs[2]; + if (test_thread_flag(TIF_SYSCALL_TRACE) && + (tracehook_report_syscall_entry(regs) || + regs->gprs[2] >= NR_syscalls)) { + /* + * Tracing decided this syscall should not happen or the + * debugger stored an invalid system call number. Skip + * the system call and the system call restart handling. + */ regs->trap = -1; - - /* - * 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; + ret = -1; } - out: - if (unlikely(current->audit_context) && !entryexit) - audit_syscall_entry(test_thread_flag(TIF_31BIT)?AUDIT_ARCH_S390:AUDIT_ARCH_S390X, - regs->gprs[2], regs->orig_gpr2, regs->gprs[3], - regs->gprs[4], regs->gprs[5]); + + if (unlikely(current->audit_context)) + audit_syscall_entry(test_thread_flag(TIF_31BIT) ? + AUDIT_ARCH_S390 : AUDIT_ARCH_S390X, + regs->gprs[2], regs->orig_gpr2, + regs->gprs[3], regs->gprs[4], + regs->gprs[5]); + return ret; +} + +asmlinkage void do_syscall_trace_exit(struct pt_regs *regs) +{ + if (unlikely(current->audit_context)) + audit_syscall_exit(AUDITSC_RESULT(regs->gprs[2]), + regs->gprs[2]); + + if (test_thread_flag(TIF_SYSCALL_TRACE)) + tracehook_report_syscall_exit(regs, 0); } /* |