Blackfin arch: use existing ptrace_disable() func to clear TRACE_BITS and create...
authorMike Frysinger <vapier.adi@gmail.com>
Thu, 9 Oct 2008 07:21:05 +0000 (15:21 +0800)
committerBryan Wu <cooloney@kernel.org>
Thu, 9 Oct 2008 07:21:05 +0000 (15:21 +0800)
Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/kernel/ptrace.c

index b3f4ac792cf13e40ff9d5f25ebfb3e3a2b4dc745..e8172eece0475092261abc24acf42dc6e29300d9 100644 (file)
@@ -175,6 +175,13 @@ static inline int is_user_addr_valid(struct task_struct *child,
        return -EIO;
 }
 
+void ptrace_enable(struct task_struct *child)
+{
+       unsigned long tmp;
+       tmp = get_reg(child, PT_SYSCFG) | (TRACE_BITS);
+       put_reg(child, PT_SYSCFG, tmp);
+}
+
 /*
  * Called by kernel/ptrace.c when detaching..
  *
@@ -347,29 +354,22 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                break;
 
        case PTRACE_SYSCALL:    /* continue and stop at next (return from) syscall */
-       case PTRACE_CONT:
-               {               /* restart after signal. */
-                       long tmp;
-
-                       pr_debug("ptrace: syscall/cont\n");
+       case PTRACE_CONT:       /* restart after signal. */
+               pr_debug("ptrace: syscall/cont\n");
 
-                       ret = -EIO;
-                       if (!valid_signal(data))
-                               break;
-                       if (request == PTRACE_SYSCALL)
-                               set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-                       else
-                               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-
-                       child->exit_code = data;
-                       /* make sure the single step bit is not set. */
-                       tmp = get_reg(child, PT_SYSCFG) & ~(TRACE_BITS);
-                       put_reg(child, PT_SYSCFG, tmp);
-                       pr_debug("ptrace: before wake_up_process\n");
-                       wake_up_process(child);
-                       ret = 0;
+               ret = -EIO;
+               if (!valid_signal(data))
                        break;
-               }
+               if (request == PTRACE_SYSCALL)
+                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+               else
+                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+               child->exit_code = data;
+               ptrace_disable(child);
+               pr_debug("ptrace: before wake_up_process\n");
+               wake_up_process(child);
+               ret = 0;
+               break;
 
        /*
         * make the child exit.  Best I can do is send it a sigkill.
@@ -377,38 +377,25 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
         * exit.
         */
        case PTRACE_KILL:
-               {
-                       long tmp;
-                       ret = 0;
-                       if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
-                               break;
-                       child->exit_code = SIGKILL;
-                       /* make sure the single step bit is not set. */
-                       tmp = get_reg(child, PT_SYSCFG) & ~(TRACE_BITS);
-                       put_reg(child, PT_SYSCFG, tmp);
-                       wake_up_process(child);
+               ret = 0;
+               if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
                        break;
-               }
-
-       case PTRACE_SINGLESTEP:
-               {               /* set the trap flag. */
-                       long tmp;
-
-                       pr_debug("ptrace: single step\n");
-                       ret = -EIO;
-                       if (!valid_signal(data))
-                               break;
-                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-
-                       tmp = get_reg(child, PT_SYSCFG) | (TRACE_BITS);
-                       put_reg(child, PT_SYSCFG, tmp);
+               child->exit_code = SIGKILL;
+               ptrace_disable(child);
+               wake_up_process(child);
+               break;
 
-                       child->exit_code = data;
-                       /* give it a chance to run. */
-                       wake_up_process(child);
-                       ret = 0;
+       case PTRACE_SINGLESTEP: /* set the trap flag. */
+               pr_debug("ptrace: single step\n");
+               ret = -EIO;
+               if (!valid_signal(data))
                        break;
-               }
+               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+               ptrace_enable(child);
+               child->exit_code = data;
+               wake_up_process(child);
+               ret = 0;
+               break;
 
        case PTRACE_GETREGS:
                /* Get all gp regs from the child. */