浏览代码

[MIPS] Rewrite spurious_interrupt from assembler to C.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Ralf Baechle 19 年之前
父节点
当前提交
93373ed4d8

+ 2 - 1
arch/mips/au1000/common/int-handler.S

@@ -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)

+ 2 - 1
arch/mips/ddb5xxx/ddb5476/int-handler.S

@@ -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

+ 1 - 3
arch/mips/ddb5xxx/ddb5476/vrc5476_irq.c

@@ -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);
 }

+ 2 - 2
arch/mips/ddb5xxx/ddb5477/int-handler.S

@@ -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

+ 3 - 1
arch/mips/dec/int-handler.S

@@ -282,7 +282,9 @@ fpu:
 #endif
 
 spurious:
-		j	spurious_interrupt
+		jal	spurious_interrupt
+		 nop
+		j	ret_from_irq
 		 nop
 		END(decstation_handle_int)
 

+ 2 - 1
arch/mips/galileo-boards/ev96100/int-handler.S

@@ -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)

+ 2 - 1
arch/mips/gt64120/ev64120/int-handler.S

@@ -39,8 +39,9 @@
 		nop
 
     /* wrong alarm or masked ... */
-		j	spurious_interrupt
+		jal	spurious_interrupt
 		nop
+		j	ret_from_irq
 		END(galileo_handle_int)
 
 

+ 2 - 1
arch/mips/jazz/int-handler.S

@@ -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

+ 0 - 26
arch/mips/kernel/entry.S

@@ -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)

+ 5 - 0
arch/mips/kernel/irq.c

@@ -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);

+ 3 - 1
arch/mips/mips-boards/generic/mipsIRQ.S

@@ -150,6 +150,8 @@
 
 
 spurious:
-	j	spurious_interrupt
+	jal	spurious_interrupt
+	 nop
+	j	ret_from_irq
 	 nop
 	END(mipsIRQ)

+ 3 - 1
arch/mips/mips-boards/sim/sim_irq.S

@@ -94,6 +94,8 @@
 
 
 spurious:
-	j	spurious_interrupt
+	jal	spurious_interrupt
+	 nop
+	j	ret_from_irq
 	 nop
 	END(simIRQ)

+ 3 - 1
arch/mips/momentum/ocelot_3/int-handler.S

@@ -78,8 +78,10 @@
 		.set	reorder
 
 		/* wrong alarm or masked ... */
-		j	spurious_interrupt
+		jal	spurious_interrupt
 		nop
+		j	ret_from_irq
+		 nop
 		END(ocelot3_handle_int)
 
 		.align	5

+ 2 - 1
arch/mips/momentum/ocelot_c/int-handler.S

@@ -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

+ 2 - 1
arch/mips/philips/pnx8550/common/mipsIRQ.S

@@ -46,8 +46,9 @@
 
 		/* wrong alarm or masked ... */
 
-		j	spurious_interrupt
+		jal	spurious_interrupt
 		nop
+		j	ret_from_irq
 		END(cp0_irqdispatch)
 
 		.align	5

+ 2 - 1
arch/mips/tx4927/common/tx4927_irq_handler.S

@@ -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

+ 3 - 1
arch/mips/vr41xx/common/int-handler.S

@@ -98,8 +98,10 @@
 		bnez	t1, handle_irq
 		li	a0, 1
 
-		j	spurious_interrupt
+		jal	spurious_interrupt
 		nop
+		j	ret_from_irq
+		 nop
 
 handle_int:
 		jal	irq_dispatch

+ 1 - 0
include/asm-mips/irq.h

@@ -46,5 +46,6 @@ do {									\
 #endif
 
 extern void arch_init_irq(void);
+extern void spurious_interrupt(struct pt_regs *regs);
 
 #endif /* _ASM_IRQ_H */