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 76818be6ba7..1ca34104e59 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c @@ -15,6 +15,7 @@   * binaries.   */  #include <linux/compiler.h> +#include <linux/compat.h>  #include <linux/kernel.h>  #include <linux/sched.h>  #include <linux/mm.h> @@ -36,47 +37,17 @@  #include <asm/uaccess.h>  #include <asm/bootinfo.h> -int ptrace_getregs(struct task_struct *child, __s64 __user *data); -int ptrace_setregs(struct task_struct *child, __s64 __user *data); - -int ptrace_getfpregs(struct task_struct *child, __u32 __user *data); -int ptrace_setfpregs(struct task_struct *child, __u32 __user *data); -  /*   * Tracing a 32-bit process with a 64-bit strace and vice versa will not   * work.  I don't know how to fix this.   */ -asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) +long compat_arch_ptrace(struct task_struct *child, compat_long_t request, +			compat_ulong_t caddr, compat_ulong_t cdata)  { -	struct task_struct *child; +	int addr = caddr; +	int data = cdata;  	int ret; -#if 0 -	printk("ptrace(r=%d,pid=%d,addr=%08lx,data=%08lx)\n", -	       (int) request, (int) pid, (unsigned long) addr, -	       (unsigned long) data); -#endif -	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); -		goto out_tsk; -	} - -	ret = ptrace_check_attach(child, request == PTRACE_KILL); -	if (ret < 0) -		goto out_tsk; -  	switch (request) {  	/* when I and D space are separate, these will need to be fixed. */  	case PTRACE_PEEKTEXT: /* read word at location addr. */ @@ -214,7 +185,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)  			if (!cpu_has_dsp) {  				tmp = 0;  				ret = -EIO; -				goto out_tsk; +				goto out;  			}  			dregs = __get_dsp_regs(child);  			tmp = (unsigned long) (dregs[addr - DSP_BASE]); @@ -224,14 +195,14 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)  			if (!cpu_has_dsp) {  				tmp = 0;  				ret = -EIO; -				goto out_tsk; +				goto out;  			}  			tmp = child->thread.dsp.dspcontrol;  			break;  		default:  			tmp = 0;  			ret = -EIO; -			goto out_tsk; +			goto out;  		}  		ret = put_user(tmp, (unsigned __user *) (unsigned long) data);  		break; @@ -410,14 +381,20 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)  				(unsigned long __user *) (unsigned long) data);  		break; +	case PTRACE_GET_WATCH_REGS: +		ret = ptrace_get_watch_regs(child, +			(struct pt_watch_regs __user *) (unsigned long) addr); +		break; + +	case PTRACE_SET_WATCH_REGS: +		ret = ptrace_set_watch_regs(child, +			(struct pt_watch_regs __user *) (unsigned long) addr); +		break; +  	default:  		ret = ptrace_request(child, request, addr, data);  		break;  	} - -out_tsk: -	put_task_struct(child);  out: -	unlock_kernel();  	return ret;  }  | 
