ARM: fix up nested irq regs usage
authorLinus Torvalds <torvalds@g5.osdl.org>
Fri, 6 Oct 2006 20:11:15 +0000 (13:11 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 6 Oct 2006 20:11:15 +0000 (13:11 -0700)
This should fix up the per-cpu irq register pointer if we have nested
hardware interrupts.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/arm/kernel/irq.c

index e999b11de2c610e1299790d343efdab5b15cf3db..2c4ff1cbe33490df3d4c37e08817eae074ae68ad 100644 (file)
@@ -111,6 +111,7 @@ static struct irq_desc bad_irq_desc = {
  */
 asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
 {
+       struct pt_regs *old_regs = set_irq_regs(regs);
        struct irqdesc *desc = irq_desc + irq;
 
        /*
@@ -122,13 +123,13 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
 
        irq_enter();
 
-       set_irq_regs(regs);
        desc_handle_irq(irq, desc);
 
        /* AT91 specific workaround */
        irq_finish(irq);
 
        irq_exit();
+       set_irq_regs(old_regs);
 }
 
 void set_irq_flags(unsigned int irq, unsigned int iflags)