return saved_reg;
}
-static void report_syscall_entry(struct pt_regs *regs)
+static int report_syscall_entry(struct pt_regs *regs)
{
unsigned long saved_reg;
- int regno;
+ int regno, ret;
saved_reg = ptrace_save_reg(regs, PTRACE_SYSCALL_ENTER, ®no);
- if (ptrace_report_syscall_entry(regs))
+ ret = ptrace_report_syscall_entry(regs);
+ if (ret)
forget_syscall(regs);
regs->regs[regno] = saved_reg;
+
+ return ret;
}
static void report_syscall_exit(struct pt_regs *regs)
int syscall_trace_enter(struct pt_regs *regs)
{
unsigned long flags = read_thread_flags();
+ int ret;
if (flags & (_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE)) {
- report_syscall_entry(regs);
- if (flags & _TIF_SYSCALL_EMU)
+ ret = report_syscall_entry(regs);
+ if (ret || (flags & _TIF_SYSCALL_EMU))
return NO_SYSCALL;
}