x86: compat_ptrace_request
This adds a compat_ptrace_request that is the analogue of ptrace_request for the things that 32-on-64 ptrace implementations can share in common. So far there are just a couple of requests handled generically. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
16c3e389e7
commit
032d82d906
2 changed files with 42 additions and 0 deletions
|
@ -243,6 +243,10 @@ asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
|
|||
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
|
||||
const compat_ulong_t __user *new_nodes);
|
||||
|
||||
extern int compat_ptrace_request(struct task_struct *child,
|
||||
compat_long_t request,
|
||||
compat_ulong_t addr, compat_ulong_t data);
|
||||
|
||||
/*
|
||||
* epoll (fs/eventpoll.c) compat bits follow ...
|
||||
*/
|
||||
|
|
|
@ -607,3 +607,41 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
|
|||
copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
|
||||
return (copied == sizeof(data)) ? 0 : -EIO;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#include <linux/compat.h>
|
||||
|
||||
int compat_ptrace_request(struct task_struct *child, compat_long_t request,
|
||||
compat_ulong_t addr, compat_ulong_t data)
|
||||
{
|
||||
compat_ulong_t __user *datap = compat_ptr(data);
|
||||
compat_ulong_t word;
|
||||
int ret;
|
||||
|
||||
switch (request) {
|
||||
case PTRACE_PEEKTEXT:
|
||||
case PTRACE_PEEKDATA:
|
||||
ret = access_process_vm(child, addr, &word, sizeof(word), 0);
|
||||
if (ret != sizeof(word))
|
||||
ret = -EIO;
|
||||
else
|
||||
ret = put_user(word, datap);
|
||||
break;
|
||||
|
||||
case PTRACE_POKETEXT:
|
||||
case PTRACE_POKEDATA:
|
||||
ret = access_process_vm(child, addr, &data, sizeof(data), 1);
|
||||
ret = (ret != sizeof(data) ? -EIO : 0);
|
||||
break;
|
||||
|
||||
case PTRACE_GETEVENTMSG:
|
||||
ret = put_user((compat_ulong_t) child->ptrace_message, datap);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
|
Loading…
Reference in a new issue