diff options
Diffstat (limited to 'arch/powerpc/kernel/signal_32.c')
| -rw-r--r-- | arch/powerpc/kernel/signal_32.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index d670429a1608..266610119f66 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -1078,7 +1078,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx,  	int i;  	unsigned char tmp;  	unsigned long new_msr = regs->msr; -#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) +#ifdef CONFIG_PPC_ADV_DEBUG_REGS  	unsigned long new_dbcr0 = current->thread.dbcr0;  #endif @@ -1087,13 +1087,17 @@ int sys_debug_setcontext(struct ucontext __user *ctx,  			return -EFAULT;  		switch (op.dbg_type) {  		case SIG_DBG_SINGLE_STEPPING: -#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) +#ifdef CONFIG_PPC_ADV_DEBUG_REGS  			if (op.dbg_value) {  				new_msr |= MSR_DE;  				new_dbcr0 |= (DBCR0_IDM | DBCR0_IC);  			} else { -				new_msr &= ~MSR_DE; -				new_dbcr0 &= ~(DBCR0_IDM | DBCR0_IC); +				new_dbcr0 &= ~DBCR0_IC; +				if (!DBCR_ACTIVE_EVENTS(new_dbcr0, +						current->thread.dbcr1)) { +					new_msr &= ~MSR_DE; +					new_dbcr0 &= ~DBCR0_IDM; +				}  			}  #else  			if (op.dbg_value) @@ -1103,7 +1107,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx,  #endif  			break;  		case SIG_DBG_BRANCH_TRACING: -#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) +#ifdef CONFIG_PPC_ADV_DEBUG_REGS  			return -EINVAL;  #else  			if (op.dbg_value) @@ -1124,7 +1128,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx,  	   failure is a problem, anyway, and it's very unlikely unless  	   the user is really doing something wrong. */  	regs->msr = new_msr; -#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) +#ifdef CONFIG_PPC_ADV_DEBUG_REGS  	current->thread.dbcr0 = new_dbcr0;  #endif  |