diff options
Diffstat (limited to 'arch/um/kernel/ptrace.c')
| -rw-r--r-- | arch/um/kernel/ptrace.c | 101 | 
1 files changed, 30 insertions, 71 deletions
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 701b672c112..694d551c889 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c @@ -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> @@ -50,23 +51,11 @@ long arch_ptrace(struct task_struct *child, long request,  	void __user *vp = p;  	switch (request) { -	/* read word at location addr. */ -	case PTRACE_PEEKTEXT: -	case PTRACE_PEEKDATA: -		ret = generic_ptrace_peekdata(child, addr, data); -		break; -  	/* read the word at location addr in the USER area. */  	case PTRACE_PEEKUSR:  		ret = peek_user(child, addr, data);  		break; -	/* write the word at location addr. */ -	case PTRACE_POKETEXT: -	case PTRACE_POKEDATA: -		ret = generic_ptrace_pokedata(child, addr, data); -		break; -  	/* write the word at location addr in the USER area */  	case PTRACE_POKEUSR:  		ret = poke_user(child, addr, data); @@ -107,16 +96,6 @@ long arch_ptrace(struct task_struct *child, long request,  		break;  	}  #endif -#ifdef PTRACE_GETFPREGS -	case PTRACE_GETFPREGS: /* Get the child FPU state. */ -		ret = get_fpregs(vp, child); -		break; -#endif -#ifdef PTRACE_SETFPREGS -	case PTRACE_SETFPREGS: /* Set the child FPU state. */ -		ret = set_fpregs(vp, child); -		break; -#endif  	case PTRACE_GET_THREAD_AREA:  		ret = ptrace_get_thread_area(child, addr, vp);  		break; @@ -154,12 +133,6 @@ long arch_ptrace(struct task_struct *child, long request,  		break;  	}  #endif -#ifdef PTRACE_ARCH_PRCTL -	case PTRACE_ARCH_PRCTL: -		/* XXX Calls ptrace on the host - needs some SMP thinking */ -		ret = arch_prctl(child, data, (void __user *) addr); -		break; -#endif  	default:  		ret = ptrace_request(child, request, addr, data);  		if (ret == -EIO) @@ -190,50 +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 (unlikely(current->audit_context)) { -		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(AUDITSC_RESULT(UPT_SYSCALL_RET(regs)), -					UPT_SYSCALL_RET(regs)); -	} - -	/* Fake a debug trap */ -	if (is_singlestep) -		send_sigtrap(current, regs, 0); +	audit_syscall_entry(HOST_AUDIT_ARCH, +			    UPT_SYSCALL_NR(®s->regs), +			    UPT_SYSCALL_ARG1(®s->regs), +			    UPT_SYSCALL_ARG2(®s->regs), +			    UPT_SYSCALL_ARG3(®s->regs), +			    UPT_SYSCALL_ARG4(®s->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, ®s->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);  }  | 
