diff options
Diffstat (limited to 'arch/mips/kernel/ptrace32.c')
| -rw-r--r-- | arch/mips/kernel/ptrace32.c | 59 |
1 files changed, 18 insertions, 41 deletions
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index 76818be6ba7c..1ca34104e593 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | * binaries. | 15 | * binaries. |
| 16 | */ | 16 | */ |
| 17 | #include <linux/compiler.h> | 17 | #include <linux/compiler.h> |
| 18 | #include <linux/compat.h> | ||
| 18 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
| 20 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
| @@ -36,47 +37,17 @@ | |||
| 36 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
| 37 | #include <asm/bootinfo.h> | 38 | #include <asm/bootinfo.h> |
| 38 | 39 | ||
| 39 | int ptrace_getregs(struct task_struct *child, __s64 __user *data); | ||
| 40 | int ptrace_setregs(struct task_struct *child, __s64 __user *data); | ||
| 41 | |||
| 42 | int ptrace_getfpregs(struct task_struct *child, __u32 __user *data); | ||
| 43 | int ptrace_setfpregs(struct task_struct *child, __u32 __user *data); | ||
| 44 | |||
| 45 | /* | 40 | /* |
| 46 | * Tracing a 32-bit process with a 64-bit strace and vice versa will not | 41 | * Tracing a 32-bit process with a 64-bit strace and vice versa will not |
| 47 | * work. I don't know how to fix this. | 42 | * work. I don't know how to fix this. |
| 48 | */ | 43 | */ |
| 49 | asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | 44 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
| 45 | compat_ulong_t caddr, compat_ulong_t cdata) | ||
| 50 | { | 46 | { |
| 51 | struct task_struct *child; | 47 | int addr = caddr; |
| 48 | int data = cdata; | ||
| 52 | int ret; | 49 | int ret; |
| 53 | 50 | ||
| 54 | #if 0 | ||
| 55 | printk("ptrace(r=%d,pid=%d,addr=%08lx,data=%08lx)\n", | ||
| 56 | (int) request, (int) pid, (unsigned long) addr, | ||
| 57 | (unsigned long) data); | ||
| 58 | #endif | ||
| 59 | lock_kernel(); | ||
| 60 | if (request == PTRACE_TRACEME) { | ||
| 61 | ret = ptrace_traceme(); | ||
| 62 | goto out; | ||
| 63 | } | ||
| 64 | |||
| 65 | child = ptrace_get_task_struct(pid); | ||
| 66 | if (IS_ERR(child)) { | ||
| 67 | ret = PTR_ERR(child); | ||
| 68 | goto out; | ||
| 69 | } | ||
| 70 | |||
| 71 | if (request == PTRACE_ATTACH) { | ||
| 72 | ret = ptrace_attach(child); | ||
| 73 | goto out_tsk; | ||
| 74 | } | ||
| 75 | |||
| 76 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
| 77 | if (ret < 0) | ||
| 78 | goto out_tsk; | ||
| 79 | |||
| 80 | switch (request) { | 51 | switch (request) { |
| 81 | /* when I and D space are separate, these will need to be fixed. */ | 52 | /* when I and D space are separate, these will need to be fixed. */ |
| 82 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | 53 | case PTRACE_PEEKTEXT: /* read word at location addr. */ |
| @@ -214,7 +185,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
| 214 | if (!cpu_has_dsp) { | 185 | if (!cpu_has_dsp) { |
| 215 | tmp = 0; | 186 | tmp = 0; |
| 216 | ret = -EIO; | 187 | ret = -EIO; |
| 217 | goto out_tsk; | 188 | goto out; |
| 218 | } | 189 | } |
| 219 | dregs = __get_dsp_regs(child); | 190 | dregs = __get_dsp_regs(child); |
| 220 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); | 191 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); |
| @@ -224,14 +195,14 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
| 224 | if (!cpu_has_dsp) { | 195 | if (!cpu_has_dsp) { |
| 225 | tmp = 0; | 196 | tmp = 0; |
| 226 | ret = -EIO; | 197 | ret = -EIO; |
| 227 | goto out_tsk; | 198 | goto out; |
| 228 | } | 199 | } |
| 229 | tmp = child->thread.dsp.dspcontrol; | 200 | tmp = child->thread.dsp.dspcontrol; |
| 230 | break; | 201 | break; |
| 231 | default: | 202 | default: |
| 232 | tmp = 0; | 203 | tmp = 0; |
| 233 | ret = -EIO; | 204 | ret = -EIO; |
| 234 | goto out_tsk; | 205 | goto out; |
| 235 | } | 206 | } |
| 236 | ret = put_user(tmp, (unsigned __user *) (unsigned long) data); | 207 | ret = put_user(tmp, (unsigned __user *) (unsigned long) data); |
| 237 | break; | 208 | break; |
| @@ -410,14 +381,20 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
| 410 | (unsigned long __user *) (unsigned long) data); | 381 | (unsigned long __user *) (unsigned long) data); |
| 411 | break; | 382 | break; |
| 412 | 383 | ||
| 384 | case PTRACE_GET_WATCH_REGS: | ||
| 385 | ret = ptrace_get_watch_regs(child, | ||
| 386 | (struct pt_watch_regs __user *) (unsigned long) addr); | ||
| 387 | break; | ||
| 388 | |||
| 389 | case PTRACE_SET_WATCH_REGS: | ||
| 390 | ret = ptrace_set_watch_regs(child, | ||
| 391 | (struct pt_watch_regs __user *) (unsigned long) addr); | ||
| 392 | break; | ||
| 393 | |||
| 413 | default: | 394 | default: |
| 414 | ret = ptrace_request(child, request, addr, data); | 395 | ret = ptrace_request(child, request, addr, data); |
| 415 | break; | 396 | break; |
| 416 | } | 397 | } |
| 417 | |||
| 418 | out_tsk: | ||
| 419 | put_task_struct(child); | ||
| 420 | out: | 398 | out: |
| 421 | unlock_kernel(); | ||
| 422 | return ret; | 399 | return ret; |
| 423 | } | 400 | } |
