|
@@ -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);
|