5:
        move    a0, sp
-       j       spurious_interrupt
+       jal     spurious_interrupt
+       j       ret_from_irq
 END(au1000_IRQ)
 
        .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
 
 asmlinkage void
 vrc5476_irq_dispatch(struct pt_regs *regs)
 {
-       extern void spurious_interrupt(void);
-
        u32 mask;
        int nile4_irq;
 
                        return;
                }
        }
-       spurious_interrupt();
+       spurious_interrupt(regs);
 }
 
        .set    reorder
 
        /* wrong alarm or masked ... */
-       j       spurious_interrupt
-       nop
+       jal     spurious_interrupt
+       j       ret_from_irq
        END(ddb5477_handle_int)
 
        .align  5
 
 #endif
 
 spurious:
-               j       spurious_interrupt
+               jal     spurious_interrupt
+                nop
+               j       ret_from_irq
                 nop
                END(decstation_handle_int)
 
 
        jal     ev96100_cpu_irq
        j       ret_from_irq
 
-3:     j       spurious_interrupt
+3:     jal     spurious_interrupt
+       j       ret_from_irq
        END(ev96100IRQ)
 
                nop
 
     /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(galileo_handle_int)
 
 
 
 /*
  * "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
 
        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)
 
        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);
 
 
 
 spurious:
-       j       spurious_interrupt
+       jal     spurious_interrupt
+        nop
+       j       ret_from_irq
         nop
        END(mipsIRQ)
 
 
 
 spurious:
-       j       spurious_interrupt
+       jal     spurious_interrupt
+        nop
+       j       ret_from_irq
         nop
        END(simIRQ)
 
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
+                nop
                END(ocelot3_handle_int)
 
                .align  5
 
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(ocelot_handle_int)
 
                .align  5
 
 
                /* wrong alarm or masked ... */
 
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(cp0_irqdispatch)
 
                .align  5
 
                .set    reorder
 
                /* wrong alarm or masked ... */
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
                END(tx4927_irq_handler)
 
                .align  5
 
                bnez    t1, handle_irq
                li      a0, 1
 
-               j       spurious_interrupt
+               jal     spurious_interrupt
                nop
+               j       ret_from_irq
+                nop
 
 handle_int:
                jal     irq_dispatch
 
 #endif
 
 extern void arch_init_irq(void);
+extern void spurious_interrupt(struct pt_regs *regs);
 
 #endif /* _ASM_IRQ_H */