diff options
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 6aa0c663e24..158972341a2 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -248,7 +248,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)  				   addr, regs->nip, regs->link, code);  	} -	if (!arch_irq_disabled_regs(regs)) +	if (arch_irqs_disabled() && !arch_irq_disabled_regs(regs))  		local_irq_enable();  	memset(&info, 0, sizeof(info)); @@ -1019,7 +1019,9 @@ void __kprobes program_check_exception(struct pt_regs *regs)  		return;  	} -	local_irq_enable(); +	/* We restore the interrupt state now */ +	if (!arch_irq_disabled_regs(regs)) +		local_irq_enable();  #ifdef CONFIG_MATH_EMULATION  	/* (reason & REASON_ILLEGAL) would be the obvious thing here, @@ -1069,6 +1071,10 @@ void alignment_exception(struct pt_regs *regs)  {  	int sig, code, fixed = 0; +	/* We restore the interrupt state now */ +	if (!arch_irq_disabled_regs(regs)) +		local_irq_enable(); +  	/* we don't implement logging of alignment exceptions */  	if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))  		fixed = fix_alignment(regs);  |