FreeBSD/Linux Kernel Cross Reference
sys/i386/isa/ithread.c
1 /*-
2 * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Berkeley Software Design Inc's name may not be used to endorse or
13 * promote products derived from this software without specific prior
14 * written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * From BSDI: intr.c,v 1.6.2.5 1999/07/06 19:16:52 cp Exp
29 * $FreeBSD: releng/5.1/sys/i386/isa/ithread.c 89979 2002-01-30 12:23:49Z bde $
30 */
31
32 /* Interrupt thread code. */
33
34 #include <sys/param.h>
35 #include <sys/bus.h>
36 #include <sys/interrupt.h>
37 #include <sys/systm.h>
38 #include <sys/vmmeter.h>
39
40 #include <i386/isa/icu.h>
41 #include <i386/isa/intr_machdep.h>
42
43 struct int_entropy {
44 struct proc *p;
45 int irq;
46 };
47
48 static u_int straycount[ICU_LEN];
49
50 #define MAX_STRAY_LOG 5
51
52 /*
53 * Schedule a heavyweight interrupt process. This function is called
54 * from the interrupt handlers Xintr<num>.
55 */
56 void
57 sched_ithd(void *cookie)
58 {
59 int irq = (int) cookie; /* IRQ we're handling */
60 struct ithd *ithd = ithds[irq]; /* and the process that does it */
61 int error;
62
63 /* This used to be in icu_vector.s */
64 /*
65 * We count software interrupts when we process them. The
66 * code here follows previous practice, but there's an
67 * argument for counting hardware interrupts when they're
68 * processed too.
69 */
70 atomic_add_long(intr_countp[irq], 1); /* one more for this IRQ */
71 atomic_add_int(&cnt.v_intr, 1); /* one more global interrupt */
72
73 /*
74 * Schedule the interrupt thread to run if needed and switch to it
75 * if we schedule it if !cold.
76 */
77 error = ithread_schedule(ithd, !cold);
78
79 /*
80 * Log stray interrupts.
81 */
82 if (error == EINVAL)
83 if (straycount[irq] < MAX_STRAY_LOG) {
84 printf("stray irq %d\n", irq);
85 if (++straycount[irq] == MAX_STRAY_LOG)
86 printf(
87 "got %d stray irq %d's: not logging anymore\n",
88 MAX_STRAY_LOG, irq);
89 }
90 }
Cache object: 4b887c1c9d9d3958d459cb4d0cd7a84b
|