summary refs log tree commit diff
path: root/arch
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-10-06 13:11:15 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-06 13:11:15 -0700
commite630015504cdd4d166c371fec39b8ca258fcbc0e (patch)
treedc9eccdf841b86099f4fa6e14711058f3ddcf573 /arch
parente317c8ccaaf900abf39cc3240e4dc5ba82a3cc67 (diff)
downloadlinux-e630015504cdd4d166c371fec39b8ca258fcbc0e.tar.gz
ARM: fix up nested irq regs usage
This should fix up the per-cpu irq register pointer if we have nested
hardware interrupts.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/kernel/irq.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
index e999b11de2c6..2c4ff1cbe334 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
@@ -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)