Commit 8b659a39 authored by Ralf Baechle's avatar Ralf Baechle

MIPS: Split do_syscall_trace into two functions.

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent c19c20ac
...@@ -141,7 +141,8 @@ extern int ptrace_set_watch_regs(struct task_struct *child, ...@@ -141,7 +141,8 @@ extern int ptrace_set_watch_regs(struct task_struct *child,
#define instruction_pointer(regs) ((regs)->cp0_epc) #define instruction_pointer(regs) ((regs)->cp0_epc)
#define profile_pc(regs) instruction_pointer(regs) #define profile_pc(regs) instruction_pointer(regs)
extern asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit); extern asmlinkage void syscall_trace_enter(struct pt_regs *regs);
extern asmlinkage void syscall_trace_leave(struct pt_regs *regs);
extern NORET_TYPE void die(const char *, struct pt_regs *) ATTRIB_NORET; extern NORET_TYPE void die(const char *, struct pt_regs *) ATTRIB_NORET;
......
...@@ -170,11 +170,10 @@ syscall_exit_work: ...@@ -170,11 +170,10 @@ syscall_exit_work:
li t0, _TIF_WORK_SYSCALL_EXIT li t0, _TIF_WORK_SYSCALL_EXIT
and t0, a2 # a2 is preloaded with TI_FLAGS and t0, a2 # a2 is preloaded with TI_FLAGS
beqz t0, work_pending # trace bit set? beqz t0, work_pending # trace bit set?
local_irq_enable # could let do_syscall_trace() local_irq_enable # could let syscall_trace_leave()
# call schedule() instead # call schedule() instead
move a0, sp move a0, sp
li a1, 1 jal syscall_trace_leave
jal do_syscall_trace
b resume_userspace b resume_userspace
#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT) #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT)
......
...@@ -533,16 +533,11 @@ static inline int audit_arch(void) ...@@ -533,16 +533,11 @@ static inline int audit_arch(void)
* Notification of system call entry/exit * Notification of system call entry/exit
* - triggered by current->work.syscall_trace * - triggered by current->work.syscall_trace
*/ */
asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) asmlinkage void syscall_trace_enter(struct pt_regs *regs)
{ {
/* do the secure computing check first */ /* do the secure computing check first */
if (!entryexit)
secure_computing(regs->regs[2]); secure_computing(regs->regs[2]);
if (unlikely(current->audit_context) && entryexit)
audit_syscall_exit(AUDITSC_RESULT(regs->regs[7]),
-regs->regs[2]);
if (!(current->ptrace & PT_PTRACED)) if (!(current->ptrace & PT_PTRACED))
goto out; goto out;
...@@ -565,8 +560,40 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) ...@@ -565,8 +560,40 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
} }
out: out:
if (unlikely(current->audit_context) && !entryexit) if (unlikely(current->audit_context))
audit_syscall_entry(audit_arch(), regs->regs[2], audit_syscall_entry(audit_arch(), regs->regs[2],
regs->regs[4], regs->regs[5], regs->regs[4], regs->regs[5],
regs->regs[6], regs->regs[7]); regs->regs[6], regs->regs[7]);
} }
/*
* Notification of system call entry/exit
* - triggered by current->work.syscall_trace
*/
asmlinkage void syscall_trace_leave(struct pt_regs *regs)
{
if (unlikely(current->audit_context))
audit_syscall_exit(AUDITSC_RESULT(regs->regs[7]),
-regs->regs[2]);
if (!(current->ptrace & PT_PTRACED))
return;
if (!test_thread_flag(TIF_SYSCALL_TRACE))
return;
/* 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;
}
}
...@@ -88,8 +88,7 @@ syscall_trace_entry: ...@@ -88,8 +88,7 @@ syscall_trace_entry:
SAVE_STATIC SAVE_STATIC
move s0, t2 move s0, t2
move a0, sp move a0, sp
li a1, 0 jal syscall_trace_enter
jal do_syscall_trace
move t0, s0 move t0, s0
RESTORE_STATIC RESTORE_STATIC
......
...@@ -91,8 +91,7 @@ syscall_trace_entry: ...@@ -91,8 +91,7 @@ syscall_trace_entry:
SAVE_STATIC SAVE_STATIC
move s0, t2 move s0, t2
move a0, sp move a0, sp
li a1, 0 jal syscall_trace_enter
jal do_syscall_trace
move t0, s0 move t0, s0
RESTORE_STATIC RESTORE_STATIC
......
...@@ -89,8 +89,7 @@ n32_syscall_trace_entry: ...@@ -89,8 +89,7 @@ n32_syscall_trace_entry:
SAVE_STATIC SAVE_STATIC
move s0, t2 move s0, t2
move a0, sp move a0, sp
li a1, 0 jal syscall_trace_enter
jal do_syscall_trace
move t0, s0 move t0, s0
RESTORE_STATIC RESTORE_STATIC
......
...@@ -123,8 +123,7 @@ trace_a_syscall: ...@@ -123,8 +123,7 @@ trace_a_syscall:
move s0, t2 # Save syscall pointer move s0, t2 # Save syscall pointer
move a0, sp move a0, sp
li a1, 0 jal syscall_trace_enter
jal do_syscall_trace
move t0, s0 move t0, s0
RESTORE_STATIC RESTORE_STATIC
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment