[MIPS] Rewrite spurious_interrupt from assembler to C.
authorRalf Baechle <ralf@linux-mips.org>
Sat, 1 Apr 2006 20:17:45 +0000 (21:17 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 19 Apr 2006 02:14:18 +0000 (04:14 +0200)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
18 files changed:
arch/mips/au1000/common/int-handler.S
arch/mips/ddb5xxx/ddb5476/int-handler.S
arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c
arch/mips/ddb5xxx/ddb5477/int-handler.S
arch/mips/dec/int-handler.S
arch/mips/galileo-boards/ev96100/int-handler.S
arch/mips/gt64120/ev64120/int-handler.S
arch/mips/jazz/int-handler.S
arch/mips/kernel/entry.S
arch/mips/kernel/irq.c
arch/mips/mips-boards/generic/mipsIRQ.S
arch/mips/mips-boards/sim/sim_irq.S
arch/mips/momentum/ocelot_3/int-handler.S
arch/mips/momentum/ocelot_c/int-handler.S
arch/mips/philips/pnx8550/common/mipsIRQ.S
arch/mips/tx4927/common/tx4927_irq_handler.S
arch/mips/vr41xx/common/int-handler.S
include/asm-mips/irq.h

index 1c4ca88..65baa8a 100644 (file)
@@ -64,5 +64,6 @@ NESTED(au1000_IRQ, PT_SIZE, sp)
 
 5:
        move    a0, sp
-       j       spurious_interrupt
+       jal     spurious_interrupt
+       j       ret_from_irq
 END(au1000_IRQ)
index 12c292e..0c2bdae 100644 (file)
@@ -54,7 +54,8 @@
        .set    reorder
 
        /* wrong alarm or masked ... */
-       // j    spurious_interrupt
+       // jal  spurious_interrupt
+       // j    ret_from_irq
        move    a0, sp
        jal     vrc5476_irq_dispatch
        j       ret_from_irq
index f66fe5b..581eaba 100644 (file)
@@ -80,8 +80,6 @@ vrc5476_irq_init(u32 base)
 asmlinkage void
 vrc5476_irq_dispatch(struct pt_regs *regs)
 {
-       extern void spurious_interrupt(void);
-
        u32 mask;
        int nile4_irq;
 
@@ -107,5 +105,5 @@ vrc5476_irq_dispatch(struct pt_regs *regs)
                        return;
                }
        }
-       spurious_interrupt();
+       spurious_interrupt(regs);
 }
index a2502a1..9884874 100644 (file)
@@ -44,8 +44,8 @@
        .set    reorder
 
        /* wrong alarm or masked ... */
-       j       spurious_interrupt
-       nop
+       jal     spurious_interrupt
+       j       ret_from_irq
        END(ddb5477_handle_int)
 
        .align  5
index 41fa372..5bafd58 100644 (file)
@@ -282,7 +282,9 @@ fpu:
 #endif
 
 spurious:
-               j       spurious_interrupt
+               jal     spurious_interrupt
+                nop
+               j       ret_from_irq
                 nop
                END(decstation_handle_int)
 
index ff4d10a..0edf1fe 100644 (file)
@@ -29,5 +29,6 @@ NESTED(ev96100IRQ, PT_SIZE, sp)
        jal     ev96100_cpu_irq
        j       ret_from_irq
 
-3:     j       spurious_interrupt
+3:     jal     spurious_interrupt
+       j       ret_from_irq
        END(ev96100IRQ)
index 752435f..9dda5b4 100644 (file)
@@ -39,8 +39,9 @@
                nop
 
     /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(galileo_handle_int)
 
 
index dc752c6..e35f5fc 100644 (file)
@@ -263,7 +263,8 @@ loc_call:   /*
 /*
  * "Jump extender" to reach spurious_interrupt
  */
-3:             j       spurious_interrupt
+3:             jal     spurious_interrupt
+               j       ret_from_irq
 
 /*
  * Vectors for interrupts generated by local devices
index 83c87fe..371571f 100644 (file)
@@ -119,29 +119,3 @@ syscall_exit_work:
        li      a1, 1
        jal     do_syscall_trace
        b       resume_userspace
-
-/*
- * Common spurious interrupt handler.
- */
-LEAF(spurious_interrupt)
-       /*
-        * Someone tried to fool us by sending an interrupt but we
-        * couldn't find a cause for it.
-        */
-       PTR_LA  t1, irq_err_count
-#ifdef CONFIG_SMP
-1:     ll      t0, (t1)
-       addiu   t0, 1
-       sc      t0, (t1)
-#if R10000_LLSC_WAR
-       beqzl   t0, 1b
-#else
-       beqz    t0, 1b
-#endif
-#else
-       lw      t0, (t1)
-       addiu   t0, 1
-       sw      t0, (t1)
-#endif
-       j       ret_from_irq
-       END(spurious_interrupt)
index 3dd76b3..e0efc4f 100644 (file)
@@ -101,6 +101,11 @@ skip:
        return 0;
 }
 
+asmlinkage void spurious_interrupt(struct pt_regs *regs)
+{
+       atomic_inc(&irq_err_count);
+}
+
 #ifdef CONFIG_KGDB
 extern void breakpoint(void);
 extern void set_debug_traps(void);
index ddd5c73..973e10a 100644 (file)
 
 
 spurious:
-       j       spurious_interrupt
+       jal     spurious_interrupt
+        nop
+       j       ret_from_irq
         nop
        END(mipsIRQ)
index da52297..d16cf38 100644 (file)
@@ -94,6 +94,8 @@
 
 
 spurious:
-       j       spurious_interrupt
+       jal     spurious_interrupt
+        nop
+       j       ret_from_irq
         nop
        END(simIRQ)
index 4522f09..b120726 100644 (file)
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
+                nop
                END(ocelot3_handle_int)
 
                .align  5
index 52349d9..f778341 100644 (file)
@@ -52,8 +52,9 @@
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(ocelot_handle_int)
 
                .align  5
index 338bffd..e049a71 100644 (file)
@@ -46,8 +46,9 @@
 
                /* wrong alarm or masked ... */
 
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(cp0_irqdispatch)
 
                .align  5
index dd3ceda..0b2ea02 100644 (file)
@@ -63,8 +63,9 @@
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(tx4927_irq_handler)
 
                .align  5
index 2b6043f..e865234 100644 (file)
                bnez    t1, handle_irq
                li      a0, 1
 
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
+                nop
 
 handle_int:
                jal     irq_dispatch
index 8a342cc..d7aecca 100644 (file)
@@ -46,5 +46,6 @@ do {                                                                  \
 #endif
 
 extern void arch_init_irq(void);
+extern void spurious_interrupt(struct pt_regs *regs);
 
 #endif /* _ASM_IRQ_H */