alpha: don't open-code trace_report_syscall_{enter,exit}

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-05-26 21:44:21 -04:00
parent 3cffdc8c3a
commit 12f79be93d
2 changed files with 20 additions and 27 deletions

View File

@ -418,11 +418,10 @@ $work_notifysig:
strace: strace:
/* set up signal stack, call syscall_trace */ /* set up signal stack, call syscall_trace */
bsr $1, do_switch_stack bsr $1, do_switch_stack
jsr $26, syscall_trace jsr $26, syscall_trace_enter /* returns the syscall number */
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
/* get the system call number and the arguments back.. */ /* get the arguments back.. */
ldq $0, 0($sp)
ldq $16, SP_OFF+24($sp) ldq $16, SP_OFF+24($sp)
ldq $17, SP_OFF+32($sp) ldq $17, SP_OFF+32($sp)
ldq $18, SP_OFF+40($sp) ldq $18, SP_OFF+40($sp)
@ -449,7 +448,7 @@ $strace_success:
stq $0, 0($sp) /* save return value */ stq $0, 0($sp) /* save return value */
bsr $1, do_switch_stack bsr $1, do_switch_stack
jsr $26, syscall_trace jsr $26, syscall_trace_leave
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
br $31, ret_from_sys_call br $31, ret_from_sys_call
@ -467,7 +466,7 @@ $strace_error:
bsr $1, do_switch_stack bsr $1, do_switch_stack
mov $19, $9 /* save old syscall number */ mov $19, $9 /* save old syscall number */
mov $20, $10 /* save old a3 */ mov $20, $10 /* save old a3 */
jsr $26, syscall_trace jsr $26, syscall_trace_leave
mov $9, $19 mov $9, $19
mov $10, $20 mov $10, $20
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
@ -698,7 +697,7 @@ sys_sigreturn:
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_sigreturn jsr $26, do_sigreturn
bne $9, 1f bne $9, 1f
jsr $26, syscall_trace jsr $26, syscall_trace_leave
1: br $1, undo_switch_stack 1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_sigreturn .end sys_sigreturn
@ -715,7 +714,7 @@ sys_rt_sigreturn:
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_rt_sigreturn jsr $26, do_rt_sigreturn
bne $9, 1f bne $9, 1f
jsr $26, syscall_trace jsr $26, syscall_trace_leave
1: br $1, undo_switch_stack 1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_rt_sigreturn .end sys_rt_sigreturn

View File

@ -13,6 +13,7 @@
#include <linux/user.h> #include <linux/user.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/tracehook.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
@ -312,25 +313,18 @@ long arch_ptrace(struct task_struct *child, long request,
return ret; return ret;
} }
asmlinkage void asmlinkage unsigned long syscall_trace_enter(void)
syscall_trace(void)
{ {
if (!test_thread_flag(TIF_SYSCALL_TRACE)) unsigned long ret = 0;
return; if (test_thread_flag(TIF_SYSCALL_TRACE) &&
if (!(current->ptrace & PT_PTRACED)) tracehook_report_syscall_entry(current_pt_regs()))
return; ret = -1UL;
/* The 0x80 provides a way for the tracing parent to distinguish return ret ?: current_pt_regs()->r0;
between a syscall stop and SIGTRAP delivery */ }
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
? 0x80 : 0)); asmlinkage void
syscall_trace_leave(void)
/* {
* This isn't the same as continuing with a signal, but it will do if (test_thread_flag(TIF_SYSCALL_TRACE))
* for normal use. strace only continues with a signal if the tracehook_report_syscall_exit(current_pt_regs(), 0);
* stopping signal is not SIGTRAP. -brl
*/
if (current->exit_code) {
send_sig(current->exit_code, current, 1);
current->exit_code = 0;
}
} }