mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
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:
parent
3cffdc8c3a
commit
12f79be93d
@ -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
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user