#include <linux/syscalls.h>
#include <linux/unistd.h>
#include <linux/mm.h>
+#include <linux/ptrace.h>
#include <asm/ptrace.h>
+#include <asm/compat.h>
#include <asm/uaccess.h>
#include <asm/user32.h>
#include <asm/user.h>
#include <asm/debugreg.h>
#include <asm/i387.h>
#include <asm/fpu32.h>
-#include <linux/ptrace.h>
-#include <linux/mm.h>
/* determines which flags the user has access to. */
/* 1 = access 0 = no access */
{
struct task_struct *child;
struct pt_regs *childregs;
+ void __user *datap = compat_ptr(data);
int ret;
__u32 val;
if (access_process_vm(child, addr, &val, sizeof(u32), 0)!=sizeof(u32))
ret = -EIO;
else
- ret = put_user(val, (unsigned int *)(u64)data);
+ ret = put_user(val, (unsigned int __user *)datap);
break;
case PTRACE_POKEDATA:
case PTRACE_PEEKUSR:
ret = getreg32(child, addr, &val);
if (ret == 0)
- ret = put_user(val, (__u32 *)(unsigned long) data);
+ ret = put_user(val, (__u32 __user *)datap);
break;
case PTRACE_POKEUSR:
case PTRACE_GETREGS: { /* Get all gp regs from the child. */
int i;
- if (!access_ok(VERIFY_WRITE, (unsigned *)(unsigned long)data, 16*4)) {
+ if (!access_ok(VERIFY_WRITE, datap, 16*4)) {
ret = -EIO;
break;
}
ret = 0;
for ( i = 0; i <= 16*4 ; i += sizeof(__u32) ) {
getreg32(child, i, &val);
- ret |= __put_user(val,(u32 *) (unsigned long) data);
- data += sizeof(u32);
+ ret |= __put_user(val,(u32 __user *)datap);
+ datap += sizeof(u32);
}
break;
}
case PTRACE_SETREGS: { /* Set all gp regs in the child. */
unsigned long tmp;
int i;
- if (!access_ok(VERIFY_READ, (unsigned *)(unsigned long)data, 16*4)) {
+ if (!access_ok(VERIFY_READ, datap, 16*4)) {
ret = -EIO;
break;
}
ret = 0;
for ( i = 0; i <= 16*4; i += sizeof(u32) ) {
- ret |= __get_user(tmp, (u32 *) (unsigned long) data);
+ ret |= __get_user(tmp, (u32 __user *)datap);
putreg32(child, i, tmp);
- data += sizeof(u32);
+ datap += sizeof(u32);
}
break;
}
case PTRACE_GETFPREGS:
ret = -EIO;
- if (!access_ok(VERIFY_READ, (void *)(u64)data,
+ if (!access_ok(VERIFY_READ, compat_ptr(data),
sizeof(struct user_i387_struct)))
break;
- save_i387_ia32(child, (void *)(u64)data, childregs, 1);
+ save_i387_ia32(child, datap, childregs, 1);
ret = 0;
break;
case PTRACE_SETFPREGS:
ret = -EIO;
- if (!access_ok(VERIFY_WRITE, (void *)(u64)data,
+ if (!access_ok(VERIFY_WRITE, datap,
sizeof(struct user_i387_struct)))
break;
ret = 0;
/* don't check EFAULT to be bug-to-bug compatible to i386 */
- restore_i387_ia32(child, (void *)(u64)data, 1);
+ restore_i387_ia32(child, datap, 1);
break;
case PTRACE_GETFPXREGS: {
- struct user32_fxsr_struct *u = (void *)(u64)data;
+ struct user32_fxsr_struct __user *u = datap;
init_fpu(child);
ret = -EIO;
if (!access_ok(VERIFY_WRITE, u, sizeof(*u)))
break;
}
case PTRACE_SETFPXREGS: {
- struct user32_fxsr_struct *u = (void *)(u64)data;
+ struct user32_fxsr_struct __user *u = datap;
unlazy_fpu(child);
ret = -EIO;
if (!access_ok(VERIFY_READ, u, sizeof(*u)))