ARM: 6538/1: Subarch IRQ handler macros V3
Magnus Damm [Wed, 22 Dec 2010 12:20:08 +0000 (13:20 +0100)]
Per subarch interrupt handler macros V3.

This patch breaks out code from the irq_handler macro
into arch_irq_handler and arch_irq_handler_default.

The macros are put in the header file "entry-macro-multi.S"

The arch_irq_handler_default macro is designed to be
used by irq_handler in entry-armv.S while arch_irq_handler
is suitable for per-subarch use.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

arch/arm/include/asm/entry-macro-multi.S [new file with mode: 0644]
arch/arm/kernel/entry-armv.S

diff --git a/arch/arm/include/asm/entry-macro-multi.S b/arch/arm/include/asm/entry-macro-multi.S
new file mode 100644 (file)
index 0000000..44f21d4
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Interrupt handling.  Preserves r7, r8, r9
+ */
+       .macro  arch_irq_handler_default
+       get_irqnr_preamble r5, lr
+1:     get_irqnr_and_base r0, r6, r5, lr
+       movne   r1, sp
+       @
+       @ routine called with r0 = irq number, r1 = struct pt_regs *
+       @
+       adrne   lr, BSYM(1b)
+       bne     asm_do_IRQ
+
+#ifdef CONFIG_SMP
+       /*
+        * XXX
+        *
+        * this macro assumes that irqstat (r6) and base (r5) are
+        * preserved from get_irqnr_and_base above
+        */
+       ALT_SMP(test_for_ipi r0, r6, r5, lr)
+       ALT_UP_B(9997f)
+       movne   r0, sp
+       adrne   lr, BSYM(1b)
+       bne     do_IPI
+
+#ifdef CONFIG_LOCAL_TIMERS
+       test_for_ltirq r0, r6, r5, lr
+       movne   r0, sp
+       adrne   lr, BSYM(1b)
+       bne     do_local_timer
+#endif
+#endif
+9997:
+       .endm
+
+       .macro  arch_irq_handler, symbol_name
+       .align  5
+       .global \symbol_name
+\symbol_name:
+       mov     r4, lr
+       arch_irq_handler_default
+       mov     pc, r4
+       .endm
index caa6c39..a866dce 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/tls.h>
 
 #include "entry-header.S"
+#include <asm/entry-macro-multi.S>
 
 /*
  * Interrupt handling.  Preserves r7, r8, r9
        teq     r5, #0
        movne   pc, r5
 #endif
-       get_irqnr_preamble r5, lr
-1:     get_irqnr_and_base r0, r6, r5, lr
-       movne   r1, sp
-       @
-       @ routine called with r0 = irq number, r1 = struct pt_regs *
-       @
-       adrne   lr, BSYM(1b)
-       bne     asm_do_IRQ
-
-#ifdef CONFIG_SMP
-       /*
-        * XXX
-        *
-        * this macro assumes that irqstat (r6) and base (r5) are
-        * preserved from get_irqnr_and_base above
-        */
-       ALT_SMP(test_for_ipi r0, r6, r5, lr)
-       ALT_UP_B(9997f)
-       movne   r0, sp
-       adrne   lr, BSYM(1b)
-       bne     do_IPI
-
-#ifdef CONFIG_LOCAL_TIMERS
-       test_for_ltirq r0, r6, r5, lr
-       movne   r0, sp
-       adrne   lr, BSYM(1b)
-       bne     do_local_timer
-#endif
-#endif
+       arch_irq_handler_default
 9997:
        .endm