summaryrefslogtreecommitdiff
path: root/sys/arch/i386
diff options
context:
space:
mode:
authorGordon Willem Klok <gwk@cvs.openbsd.org>2006-06-12 04:41:31 +0000
committerGordon Willem Klok <gwk@cvs.openbsd.org>2006-06-12 04:41:31 +0000
commit66d5ede8096a7994bf1c6a73ffc308bfef3adbea (patch)
treefdc39854a9bf627579b24a18227d609e65830055 /sys/arch/i386
parente86a9e40fffd8bb16bee41043276f81501cfc590 (diff)
Add stray interrupt reporting to the apicvec.s, fix the code for stray
interrupt reporting in vector.s. Stray interrupts will only be reported if a kernel is compiled with option DEBUG, in the case of a non-ioapic kernel some stray interrupts may be erroneously reported durring the boot process. ok toby@, "get it in" deraadt@
Diffstat (limited to 'sys/arch/i386')
-rw-r--r--sys/arch/i386/i386/apicvec.s31
-rw-r--r--sys/arch/i386/i386/ioapic.c16
-rw-r--r--sys/arch/i386/i386/vector.s10
3 files changed, 47 insertions, 10 deletions
diff --git a/sys/arch/i386/i386/apicvec.s b/sys/arch/i386/i386/apicvec.s
index 4bd274b2a5e..48a3f8e4f5a 100644
--- a/sys/arch/i386/i386/apicvec.s
+++ b/sys/arch/i386/i386/apicvec.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: apicvec.s,v 1.6 2006/03/14 14:46:53 mickey Exp $ */
+/* $OpenBSD: apicvec.s,v 1.7 2006/06/12 04:41:30 gwk Exp $ */
/* $NetBSD: apicvec.s,v 1.1.2.2 2000/02/21 21:54:01 sommerfeld Exp $ */
/*-
@@ -48,6 +48,8 @@
#define XINTR(vec) _Xintr/**/vec
#endif
+ .globl _C_LABEL(apic_stray)
+
#ifdef MULTIPROCESSOR
.globl XINTR(ipi)
XINTR(ipi):
@@ -167,7 +169,6 @@ XINTR(softtty):
* We sort out which one is which based on the value of
* the processor priority register.
*
- * XXX no stray interrupt mangling stuff..
* XXX use cmove when appropriate.
*/
@@ -189,7 +190,8 @@ _C_LABEL(Xintr_/**/name/**/num): \
incl _C_LABEL(apic_intrcount)(,%eax,4) ;\
movl _C_LABEL(apic_intrhand)(,%eax,4),%ebx /* chain head */ ;\
testl %ebx,%ebx ;\
- jz 8f /* oops, no handlers.. */ ;\
+ jz _C_LABEL(Xstray_/**/name/**/num) ;\
+ APIC_STRAY_INIT /* nobody claimed it yet */ ;\
7: \
LOCK_KERNEL(IF_PPL(%esp)) ;\
movl IH_ARG(%ebx),%eax /* get handler arg */ ;\
@@ -200,6 +202,7 @@ _C_LABEL(Xintr_/**/name/**/num): \
pushl %eax ;\
call *IH_FUN(%ebx) /* call it */ ;\
addl $4,%esp /* toss the arg */ ;\
+ APIC_STRAY_INTEGRATE /* maybe he claimed it */ ;\
orl %eax,%eax /* should it be counted? */ ;\
jz 4f ;\
addl $1,IH_COUNT(%ebx) /* count the intrs */ ;\
@@ -209,10 +212,30 @@ _C_LABEL(Xintr_/**/name/**/num): \
movl IH_NEXT(%ebx),%ebx /* next handler in chain */ ;\
testl %ebx,%ebx ;\
jnz 7b ;\
+ APIC_STRAY_TEST(name,num) /* see if it's a stray */ ;\
8: \
unmask(num) /* unmask it in hardware */ ;\
late_ack(num) ;\
- jmp _C_LABEL(Xdoreti)
+ jmp _C_LABEL(Xdoreti) ;\
+_C_LABEL(Xstray_/**/name/**/num): \
+ pushl $num ;\
+ call _C_LABEL(apic_stray) ;\
+ addl $4,%esp ;\
+ jmp 8b ;\
+
+#if defined(DEBUG)
+#define APIC_STRAY_INIT \
+ xorl %esi,%esi
+#define APIC_STRAY_INTEGRATE \
+ orl %eax,%esi
+#define APIC_STRAY_TEST(name,num) \
+ testl %esi,%esi ;\
+ jz _C_LABEL(Xstray_/**/name/**/num)
+#else /* !DEBUG */
+#define APIC_STRAY_INIT
+#define APIC_STRAY_INTEGRATE
+#define APIC_STRAY_TEST(name,num)
+#endif /* DEBUG */
APICINTR(ioapic,0, voidop, ioapic_asm_ack, voidop, voidop, voidop)
APICINTR(ioapic,1, voidop, ioapic_asm_ack, voidop, voidop, voidop)
diff --git a/sys/arch/i386/i386/ioapic.c b/sys/arch/i386/i386/ioapic.c
index 1cdb463ebaf..fa719aa3099 100644
--- a/sys/arch/i386/i386/ioapic.c
+++ b/sys/arch/i386/i386/ioapic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ioapic.c,v 1.10 2006/05/11 13:21:11 mickey Exp $ */
+/* $OpenBSD: ioapic.c,v 1.11 2006/06/12 04:41:30 gwk Exp $ */
/* $NetBSD: ioapic.c,v 1.7 2003/07/14 22:32:40 lukem Exp $ */
/*-
@@ -107,6 +107,8 @@ extern int bus_mem_add_mapping(bus_addr_t, bus_size_t, int,
void apic_set_redir(struct ioapic_softc *, int);
void apic_vectorset(struct ioapic_softc *, int, int, int);
+void apic_stray(int);
+
int apic_verbose = 0;
int ioapic_bsp_id = 0;
@@ -781,6 +783,18 @@ apic_intr_disestablish(void *arg)
free(ih, M_DEVBUF);
}
+void
+apic_stray(int irqnum) {
+ unsigned int apicid;
+ struct ioapic_softc *sc;
+
+ apicid = APIC_IRQ_APIC(irqnum);
+ sc = ioapic_find(apicid);
+ if (sc == NULL)
+ return;
+ printf("%s: stray interrupt %d\n", sc->sc_dev.dv_xname, irqnum);
+}
+
#ifdef DDB
void ioapic_dump(void);
diff --git a/sys/arch/i386/i386/vector.s b/sys/arch/i386/i386/vector.s
index 534bc424635..78052d1f95d 100644
--- a/sys/arch/i386/i386/vector.s
+++ b/sys/arch/i386/i386/vector.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: vector.s,v 1.7 2005/12/13 16:14:49 aaron Exp $ */
+/* $OpenBSD: vector.s,v 1.8 2006/06/12 04:41:30 gwk Exp $ */
/* $NetBSD: vector.s,v 1.32 1996/01/07 21:29:47 mycroft Exp $ */
/*
@@ -141,7 +141,7 @@ _C_LABEL(Xintr_/**/name/**/num): ;\
testl %ebx,%ebx ;\
jnz 7b ;\
UNLOCK_KERNEL(IF_PPL(%esp)) ;\
- STRAY_TEST /* see if it's a stray */ ;\
+ STRAY_TEST(name,num) /* see if it's a stray */ ;\
6: unmask(num) /* unmask it in hardware */ ;\
late_ack(num) ;\
jmp _C_LABEL(Xdoreti) /* lower spl and do ASTs */ ;\
@@ -154,18 +154,18 @@ IDTVEC(hold_/**/name/**/num) ;\
orb $IRQ_BIT(num),_C_LABEL(ipending) + IRQ_BYTE(num) ;\
INTRFASTEXIT
-#if defined(DEBUG) && defined(notdef)
+#if defined(DEBUG)
#define STRAY_INITIALIZE \
xorl %esi,%esi
#define STRAY_INTEGRATE \
orl %eax,%esi
-#define STRAY_TEST \
+#define STRAY_TEST(name,num) \
testl %esi,%esi ;\
jz _C_LABEL(Xstray_/**/name/**/num)
#else /* !DEBUG */
#define STRAY_INITIALIZE
#define STRAY_INTEGRATE
-#define STRAY_TEST
+#define STRAY_TEST(name,num)
#endif /* DEBUG */
#ifdef DDB