mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
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:
parent
dab8f4963a
commit
0ac1555915
3 changed files with 17 additions and 40 deletions
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue