diff options
Diffstat (limited to 'arch/m32r/kernel/ptrace.c')
| -rw-r--r-- | arch/m32r/kernel/ptrace.c | 97 | 
1 files changed, 29 insertions, 68 deletions
diff --git a/arch/m32r/kernel/ptrace.c b/arch/m32r/kernel/ptrace.c index 98682bba0ed..e555091eb97 100644 --- a/arch/m32r/kernel/ptrace.c +++ b/arch/m32r/kernel/ptrace.c @@ -580,6 +580,35 @@ init_debug_traps(struct task_struct *child)  	}  } +void user_enable_single_step(struct task_struct *child) +{ +	unsigned long next_pc; +	unsigned long pc, insn; + +	clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); + +	/* Compute next pc.  */ +	pc = get_stack_long(child, PT_BPC); + +	if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) +	    != sizeof(insn)) +		break; + +	compute_next_pc(insn, pc, &next_pc, child); +	if (next_pc & 0x80000000) +		break; + +	if (embed_debug_trap(child, next_pc)) +		break; + +	invalidate_cache(); +} + +void user_disable_single_step(struct task_struct *child) +{ +	unregister_all_debug_traps(child); +	invalidate_cache(); +}  /*   * Called by kernel/ptrace.c when detaching.. @@ -630,74 +659,6 @@ 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; -		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: { -		ret = 0; -		unregister_all_debug_traps(child); -		invalidate_cache(); -		if (child->exit_state == EXIT_ZOMBIE)	/* already dead */ -			break; -		child->exit_code = SIGKILL; -		wake_up_process(child); -		break; -	} - -	/* -	 * execute single instruction. -	 */ -	case PTRACE_SINGLESTEP: { -		unsigned long next_pc; -		unsigned long pc, insn; - -		ret = -EIO; -		if (!valid_signal(data)) -			break; -		clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); - -		/* Compute next pc.  */ -		pc = get_stack_long(child, PT_BPC); - -		if (access_process_vm(child, pc&~3, &insn, sizeof(insn), 0) -		    != sizeof(insn)) -			break; - -		compute_next_pc(insn, pc, &next_pc, child); -		if (next_pc & 0x80000000) -			break; - -		if (embed_debug_trap(child, next_pc)) -			break; - -		invalidate_cache(); -		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;  |