Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 321179
b: refs/heads/master
c: 1bfa231
h: refs/heads/master
i:
  321177: 4c28c7a
  321175: e8364a1
v: v3
  • Loading branch information
Al Viro authored and Richard Weinberger committed Aug 1, 2012
1 parent c9fcbbc commit e302f4a
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 44 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a3170d2ec25f841bee1b52487693ac1a2f191ba6
refs/heads/master: 1bfa2317b21750f739b59ab6df2c8efb12875045
2 changes: 2 additions & 0 deletions trunk/arch/um/include/asm/ptrace-generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ extern int putreg(struct task_struct *child, int regno, unsigned long value);

extern int arch_copy_tls(struct task_struct *new);
extern void clear_flushed_tls(struct task_struct *task);
extern void syscall_trace_enter(struct pt_regs *regs);
extern void syscall_trace_leave(struct pt_regs *regs);

#endif

Expand Down
71 changes: 30 additions & 41 deletions trunk/arch/um/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
* Licensed under the GPL
*/

#include "linux/audit.h"
#include "linux/ptrace.h"
#include "linux/sched.h"
#include "asm/uaccess.h"
#include "skas_ptrace.h"
#include <linux/audit.h>
#include <linux/ptrace.h>
#include <linux/sched.h>
#include <linux/tracehook.h>
#include <asm/uaccess.h>
#include <skas_ptrace.h>



Expand Down Expand Up @@ -162,48 +163,36 @@ static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs,
* XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
* PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
*/
void syscall_trace(struct uml_pt_regs *regs, int entryexit)
void syscall_trace_enter(struct pt_regs *regs)
{
int is_singlestep = (current->ptrace & PT_DTRACE) && entryexit;
int tracesysgood;

if (!entryexit)
audit_syscall_entry(HOST_AUDIT_ARCH,
UPT_SYSCALL_NR(regs),
UPT_SYSCALL_ARG1(regs),
UPT_SYSCALL_ARG2(regs),
UPT_SYSCALL_ARG3(regs),
UPT_SYSCALL_ARG4(regs));
else
audit_syscall_exit(regs);

/* Fake a debug trap */
if (is_singlestep)
send_sigtrap(current, regs, 0);
audit_syscall_entry(HOST_AUDIT_ARCH,
UPT_SYSCALL_NR(&regs->regs),
UPT_SYSCALL_ARG1(&regs->regs),
UPT_SYSCALL_ARG2(&regs->regs),
UPT_SYSCALL_ARG3(&regs->regs),
UPT_SYSCALL_ARG4(&regs->regs));

if (!test_thread_flag(TIF_SYSCALL_TRACE))
return;

if (!(current->ptrace & PT_PTRACED))
return;
tracehook_report_syscall_entry(regs);
}

/*
* the 0x80 provides a way for the tracing parent to distinguish
* between a syscall stop and SIGTRAP delivery
*/
tracesysgood = (current->ptrace & PT_TRACESYSGOOD);
ptrace_notify(SIGTRAP | (tracesysgood ? 0x80 : 0));
void syscall_trace_leave(struct pt_regs *regs)
{
int ptraced = current->ptrace;

if (entryexit) /* force do_signal() --> is_syscall() */
set_thread_flag(TIF_SIGPENDING);
audit_syscall_exit(regs);

/*
* 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;
}
/* Fake a debug trap */
if (ptraced & PT_DTRACE)
send_sigtrap(current, &regs->regs, 0);

if (!test_thread_flag(TIF_SYSCALL_TRACE))
return;

tracehook_report_syscall_exit(regs, 0);
/* force do_signal() --> is_syscall() */
if (ptraced & PT_PTRACED)
set_thread_flag(TIF_SIGPENDING);
}
4 changes: 2 additions & 2 deletions trunk/arch/um/kernel/skas/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ void handle_syscall(struct uml_pt_regs *r)
long result;
int syscall;

syscall_trace(r, 0);
syscall_trace_enter(regs);

/*
* This should go in the declaration of syscall, but when I do that,
Expand All @@ -36,5 +36,5 @@ void handle_syscall(struct uml_pt_regs *r)

PT_REGS_SET_SYSCALL_RETURN(regs, result);

syscall_trace(r, 1);
syscall_trace_leave(regs);
}

0 comments on commit e302f4a

Please sign in to comment.