diff options
Diffstat (limited to 'arch/arm/kernel/ptrace.c')
| -rw-r--r-- | arch/arm/kernel/ptrace.c | 60 | 
1 files changed, 12 insertions, 48 deletions
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 08f899fb76a..3f562a7c0a9 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -452,12 +452,23 @@ void ptrace_cancel_bpt(struct task_struct *child)  		clear_breakpoint(child, &child->thread.debug.bp[i]);  } +void user_disable_single_step(struct task_struct *task) +{ +	task->ptrace &= ~PT_SINGLESTEP; +	ptrace_cancel_bpt(task); +} + +void user_enable_single_step(struct task_struct *task) +{ +	task->ptrace |= PT_SINGLESTEP; +} +  /*   * Called by kernel/ptrace.c when detaching..   */  void ptrace_disable(struct task_struct *child)  { -	single_step_disable(child); +	user_disable_single_step(child);  }  /* @@ -753,53 +764,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)  			ret = ptrace_write_user(child, addr, data);  			break; -		/* -		 * continue/restart and stop at next (return from) syscall -		 */ -		case PTRACE_SYSCALL: -		case PTRACE_CONT: -			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; -			single_step_disable(child); -			wake_up_process(child); -			ret = 0; -			break; - -		/* -		 * make the child exit.  Best I can do is send it a sigkill. -		 * perhaps it should be put in the status that it wants to -		 * exit. -		 */ -		case PTRACE_KILL: -			single_step_disable(child); -			if (child->exit_state != EXIT_ZOMBIE) { -				child->exit_code = SIGKILL; -				wake_up_process(child); -			} -			ret = 0; -			break; - -		/* -		 * execute single instruction. -		 */ -		case PTRACE_SINGLESTEP: -			ret = -EIO; -			if (!valid_signal(data)) -				break; -			single_step_enable(child); -			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); -			child->exit_code = data; -			/* give it a chance to run. */ -			wake_up_process(child); -			ret = 0; -			break; -  		case PTRACE_GETREGS:  			ret = ptrace_getregs(child, (void __user *)data);  			break;  |