m32r: convert to generic sys_ptrace

Convert m32r to the generic sys_ptrace.  The conversion requires an
architecture hook after ptrace_attach which this patch adds.  The hook
will also be needed for a conersion of ia64 to the generic ptrace code.

Thanks to Hirokazu Takata for fixing a bug in the first version of this
code.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Christoph Hellwig 2007-10-16 01:26:37 -07:00 committed by Linus Torvalds
parent dab8f4963a
commit 0ac1555915
3 changed files with 17 additions and 40 deletions

View file

@ -570,7 +570,7 @@ withdraw_debug_trap(struct pt_regs *regs)
} }
} }
static void void
init_debug_traps(struct task_struct *child) init_debug_traps(struct task_struct *child)
{ {
struct debug_trap *p = &child->thread.debug_trap; struct debug_trap *p = &child->thread.debug_trap;
@ -593,8 +593,8 @@ void ptrace_disable(struct task_struct *child)
/* nothing to do.. */ /* nothing to do.. */
} }
static int long
do_ptrace(long request, struct task_struct *child, long addr, long data) arch_ptrace(struct task_struct *child, long request, long addr, long data)
{ {
int ret; int ret;
@ -720,42 +720,6 @@ do_ptrace(long request, struct task_struct *child, long addr, long data)
return ret; return ret;
} }
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
{
struct task_struct *child;
int ret;
lock_kernel();
if (request == PTRACE_TRACEME) {
ret = ptrace_traceme();
goto out;
}
child = ptrace_get_task_struct(pid);
if (IS_ERR(child)) {
ret = PTR_ERR(child);
goto out;
}
if (request == PTRACE_ATTACH) {
ret = ptrace_attach(child);
if (ret == 0)
init_debug_traps(child);
goto out_tsk;
}
ret = ptrace_check_attach(child, request == PTRACE_KILL);
if (ret == 0)
ret = do_ptrace(request, child, addr, data);
out_tsk:
put_task_struct(child);
out:
unlock_kernel();
return ret;
}
/* notification of system call entry/exit /* notification of system call entry/exit
* - triggered by current->work.syscall_trace * - triggered by current->work.syscall_trace
*/ */

View file

@ -120,7 +120,10 @@ struct pt_regs {
#include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */ #include <asm/m32r.h> /* M32R_PSW_BSM, M32R_PSW_BPM */
#define __ARCH_SYS_PTRACE 1 struct task_struct;
extern void init_debug_traps(struct task_struct *);
#define arch_ptrace_attach(child) \
init_debug_traps(child)
#if defined(CONFIG_ISA_M32R2) || defined(CONFIG_CHIP_VDEC2) #if defined(CONFIG_ISA_M32R2) || defined(CONFIG_CHIP_VDEC2)
#define user_mode(regs) ((M32R_PSW_BPM & (regs)->psw) != 0) #define user_mode(regs) ((M32R_PSW_BPM & (regs)->psw) != 0)

View file

@ -453,6 +453,10 @@ struct task_struct *ptrace_get_task_struct(pid_t pid)
return child; return child;
} }
#ifndef arch_ptrace_attach
#define arch_ptrace_attach(child) do { } while (0)
#endif
#ifndef __ARCH_SYS_PTRACE #ifndef __ARCH_SYS_PTRACE
asmlinkage long sys_ptrace(long request, long pid, long addr, long data) asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
{ {
@ -476,6 +480,12 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
if (request == PTRACE_ATTACH) { if (request == PTRACE_ATTACH) {
ret = ptrace_attach(child); ret = ptrace_attach(child);
/*
* Some architectures need to do book-keeping after
* a ptrace attach.
*/
if (!ret)
arch_ptrace_attach(child);
goto out_put_task_struct; goto out_put_task_struct;
} }