]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/ptrace.c
[IPG]: add IP1000A driver to kernel tree
[linux-2.6-omap-h63xx.git] / kernel / ptrace.c
index ad7949a589dd580900f4349f01888cf006d9328c..3eca7a55f2ee8b13fb2fb6f3e09ea2d7a685acaf 100644 (file)
@@ -142,7 +142,7 @@ static int may_attach(struct task_struct *task)
                return -EPERM;
        smp_rmb();
        if (task->mm)
-               dumpable = task->mm->dumpable;
+               dumpable = get_dumpable(task->mm);
        if (!dumpable && !capable(CAP_SYS_PTRACE))
                return -EPERM;
 
@@ -161,6 +161,7 @@ int ptrace_may_attach(struct task_struct *task)
 int ptrace_attach(struct task_struct *task)
 {
        int retval;
+       unsigned long flags;
 
        audit_ptrace(task);
 
@@ -181,9 +182,7 @@ repeat:
         * cpu's that may have task_lock).
         */
        task_lock(task);
-       local_irq_disable();
-       if (!write_trylock(&tasklist_lock)) {
-               local_irq_enable();
+       if (!write_trylock_irqsave(&tasklist_lock, flags)) {
                task_unlock(task);
                do {
                        cpu_relax();
@@ -211,7 +210,7 @@ repeat:
        force_sig_specific(SIGSTOP, task);
 
 bad:
-       write_unlock_irq(&tasklist_lock);
+       write_unlock_irqrestore(&tasklist_lock, flags);
        task_unlock(task);
 out:
        return retval;
@@ -234,6 +233,7 @@ int ptrace_detach(struct task_struct *child, unsigned int data)
 
        /* Architecture-specific hardware disable .. */
        ptrace_disable(child);
+       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
 
        write_lock_irq(&tasklist_lock);
        /* protect against de_thread()->release_task() */
@@ -491,3 +491,22 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
        return ret;
 }
 #endif /* __ARCH_SYS_PTRACE */
+
+int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data)
+{
+       unsigned long tmp;
+       int copied;
+
+       copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0);
+       if (copied != sizeof(tmp))
+               return -EIO;
+       return put_user(tmp, (unsigned long __user *)data);
+}
+
+int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
+{
+       int copied;
+
+       copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
+       return (copied == sizeof(data)) ? 0 : -EIO;
+}