diff options
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 23 | 
1 files changed, 21 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 3635be61f89..9fa2c7dcd05 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c @@ -704,15 +704,34 @@ void user_enable_single_step(struct task_struct *task)  	if (regs != NULL) {  #if defined(CONFIG_40x) || defined(CONFIG_BOOKE) +		task->thread.dbcr0 &= ~DBCR0_BT;  		task->thread.dbcr0 |= DBCR0_IDM | DBCR0_IC;  		regs->msr |= MSR_DE;  #else +		regs->msr &= ~MSR_BE;  		regs->msr |= MSR_SE;  #endif  	}  	set_tsk_thread_flag(task, TIF_SINGLESTEP);  } +void user_enable_block_step(struct task_struct *task) +{ +	struct pt_regs *regs = task->thread.regs; + +	if (regs != NULL) { +#if defined(CONFIG_40x) || defined(CONFIG_BOOKE) +		task->thread.dbcr0 &= ~DBCR0_IC; +		task->thread.dbcr0 = DBCR0_IDM | DBCR0_BT; +		regs->msr |= MSR_DE; +#else +		regs->msr &= ~MSR_SE; +		regs->msr |= MSR_BE; +#endif +	} +	set_tsk_thread_flag(task, TIF_SINGLESTEP); +} +  void user_disable_single_step(struct task_struct *task)  {  	struct pt_regs *regs = task->thread.regs; @@ -726,10 +745,10 @@ void user_disable_single_step(struct task_struct *task)  	if (regs != NULL) {  #if defined(CONFIG_40x) || defined(CONFIG_BOOKE) -		task->thread.dbcr0 &= ~(DBCR0_IC | DBCR0_IDM); +		task->thread.dbcr0 &= ~(DBCR0_IC | DBCR0_BT | DBCR0_IDM);  		regs->msr &= ~MSR_DE;  #else -		regs->msr &= ~MSR_SE; +		regs->msr &= ~(MSR_SE | MSR_BE);  #endif  	}  	clear_tsk_thread_flag(task, TIF_SINGLESTEP);  |