diff options
-rw-r--r-- | arch/mips/kernel/ptrace32.c | 43 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-o32.S | 2 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 12 | ||||
-rw-r--r-- | include/asm-mips/ptrace.h | 3 |
5 files changed, 25 insertions, 37 deletions
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index 76818be6ba7c..cac56a8c8679 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> |
@@ -46,37 +47,13 @@ int ptrace_setfpregs(struct task_struct *child, __u32 __user *data); | |||
46 | * Tracing a 32-bit process with a 64-bit strace and vice versa will not | 47 | * 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. | 48 | * work. I don't know how to fix this. |
48 | */ | 49 | */ |
49 | asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | 50 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
51 | compat_ulong_t caddr, compat_ulong_t cdata) | ||
50 | { | 52 | { |
51 | struct task_struct *child; | 53 | int addr = caddr; |
54 | int data = cdata; | ||
52 | int ret; | 55 | int ret; |
53 | 56 | ||
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) { | 57 | switch (request) { |
81 | /* when I and D space are separate, these will need to be fixed. */ | 58 | /* when I and D space are separate, these will need to be fixed. */ |
82 | case PTRACE_PEEKTEXT: /* read word at location addr. */ | 59 | case PTRACE_PEEKTEXT: /* read word at location addr. */ |
@@ -214,7 +191,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
214 | if (!cpu_has_dsp) { | 191 | if (!cpu_has_dsp) { |
215 | tmp = 0; | 192 | tmp = 0; |
216 | ret = -EIO; | 193 | ret = -EIO; |
217 | goto out_tsk; | 194 | goto out; |
218 | } | 195 | } |
219 | dregs = __get_dsp_regs(child); | 196 | dregs = __get_dsp_regs(child); |
220 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); | 197 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); |
@@ -224,14 +201,14 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
224 | if (!cpu_has_dsp) { | 201 | if (!cpu_has_dsp) { |
225 | tmp = 0; | 202 | tmp = 0; |
226 | ret = -EIO; | 203 | ret = -EIO; |
227 | goto out_tsk; | 204 | goto out; |
228 | } | 205 | } |
229 | tmp = child->thread.dsp.dspcontrol; | 206 | tmp = child->thread.dsp.dspcontrol; |
230 | break; | 207 | break; |
231 | default: | 208 | default: |
232 | tmp = 0; | 209 | tmp = 0; |
233 | ret = -EIO; | 210 | ret = -EIO; |
234 | goto out_tsk; | 211 | goto out; |
235 | } | 212 | } |
236 | ret = put_user(tmp, (unsigned __user *) (unsigned long) data); | 213 | ret = put_user(tmp, (unsigned __user *) (unsigned long) data); |
237 | break; | 214 | break; |
@@ -414,10 +391,6 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
414 | ret = ptrace_request(child, request, addr, data); | 391 | ret = ptrace_request(child, request, addr, data); |
415 | break; | 392 | break; |
416 | } | 393 | } |
417 | |||
418 | out_tsk: | ||
419 | put_task_struct(child); | ||
420 | out: | 394 | out: |
421 | unlock_kernel(); | ||
422 | return ret; | 395 | return ret; |
423 | } | 396 | } |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index da7f1b6ea0fb..324c5499dec2 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -219,7 +219,7 @@ EXPORT(sysn32_call_table) | |||
219 | PTR compat_sys_getrusage | 219 | PTR compat_sys_getrusage |
220 | PTR compat_sys_sysinfo | 220 | PTR compat_sys_sysinfo |
221 | PTR compat_sys_times | 221 | PTR compat_sys_times |
222 | PTR sys32_ptrace | 222 | PTR compat_sys_ptrace |
223 | PTR sys_getuid /* 6100 */ | 223 | PTR sys_getuid /* 6100 */ |
224 | PTR sys_syslog | 224 | PTR sys_syslog |
225 | PTR sys_getgid | 225 | PTR sys_getgid |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index d7cd1aac9ada..85fedac99a57 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -231,7 +231,7 @@ sys_call_table: | |||
231 | PTR sys_setuid | 231 | PTR sys_setuid |
232 | PTR sys_getuid | 232 | PTR sys_getuid |
233 | PTR compat_sys_stime /* 4025 */ | 233 | PTR compat_sys_stime /* 4025 */ |
234 | PTR sys32_ptrace | 234 | PTR compat_sys_ptrace |
235 | PTR sys_alarm | 235 | PTR sys_alarm |
236 | PTR sys_ni_syscall /* was sys_fstat */ | 236 | PTR sys_ni_syscall /* was sys_fstat */ |
237 | PTR sys_pause | 237 | PTR sys_pause |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 572c610db1b1..652709b353ad 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -482,6 +482,18 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | |||
482 | return err; | 482 | return err; |
483 | } | 483 | } |
484 | 484 | ||
485 | int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | ||
486 | { | ||
487 | memset(to, 0, sizeof *to); | ||
488 | |||
489 | if (copy_from_user(to, from, 3*sizeof(int)) || | ||
490 | copy_from_user(to->_sifields._pad, | ||
491 | from->_sifields._pad, SI_PAD_SIZE32)) | ||
492 | return -EFAULT; | ||
493 | |||
494 | return 0; | ||
495 | } | ||
496 | |||
485 | asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs) | 497 | asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs) |
486 | { | 498 | { |
487 | struct sigframe32 __user *frame; | 499 | struct sigframe32 __user *frame; |
diff --git a/include/asm-mips/ptrace.h b/include/asm-mips/ptrace.h index 786f7e3c99bc..c00cca24dae0 100644 --- a/include/asm-mips/ptrace.h +++ b/include/asm-mips/ptrace.h | |||
@@ -9,6 +9,9 @@ | |||
9 | #ifndef _ASM_PTRACE_H | 9 | #ifndef _ASM_PTRACE_H |
10 | #define _ASM_PTRACE_H | 10 | #define _ASM_PTRACE_H |
11 | 11 | ||
12 | #ifdef CONFIG_64BIT | ||
13 | #define __ARCH_WANT_COMPAT_SYS_PTRACE | ||
14 | #endif | ||
12 | 15 | ||
13 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ | 16 | /* 0 - 31 are integer registers, 32 - 63 are fp registers. */ |
14 | #define FPR_BASE 32 | 17 | #define FPR_BASE 32 |