vserver 1.9.5.x5
[linux-2.6.git] / arch / arm / kernel / ptrace.c
index 4dcf99a..6dd2a7d 100644 (file)
@@ -485,7 +485,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs)
        info.si_signo = SIGTRAP;
        info.si_errno = 0;
        info.si_code  = TRAP_BRKPT;
-       info.si_addr  = (void *)instruction_pointer(regs);
+       info.si_addr  = (void __user *)instruction_pointer(regs);
 
        force_sig_info(SIGTRAP, &info, tsk);
 }
@@ -622,7 +622,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
                        ret = access_process_vm(child, addr, &tmp,
                                                sizeof(unsigned long), 0);
                        if (ret == sizeof(unsigned long))
-                               ret = put_user(tmp, (unsigned long *) data);
+                               ret = put_user(tmp, (unsigned long __user *) data);
                        else
                                ret = -EIO;
                        break;
@@ -677,7 +677,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
                        /* make sure single-step breakpoint is gone. */
                        child->ptrace &= ~PT_SINGLESTEP;
                        ptrace_cancel_bpt(child);
-                       if (child->state != TASK_ZOMBIE) {
+                       if (child->exit_state != EXIT_ZOMBIE) {
                                child->exit_code = SIGKILL;
                                wake_up_process(child);
                        }
@@ -719,6 +719,11 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
                        ret = ptrace_setfpregs(child, (void __user *)data);
                        break;
 
+               case PTRACE_GET_THREAD_AREA:
+                       ret = put_user(child->thread_info->tp_value,
+                                      (unsigned long __user *) data);
+                       break;
+
                default:
                        ret = ptrace_request(child, request, addr, data);
                        break;
@@ -794,11 +799,8 @@ asmlinkage void syscall_trace(int why, struct pt_regs *regs)
 
        /* the 0x80 provides a way for the tracing parent to distinguish
           between a syscall stop and SIGTRAP delivery */
-       current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
-                                       ? 0x80 : 0);
-       current->state = TASK_STOPPED;
-       notify_parent(current, SIGCHLD);
-       schedule();
+       ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
+                                ? 0x80 : 0));
        /*
         * this isn't the same as continuing with a signal, but it will do
         * for normal use.  strace only continues with a signal if the