summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2011-06-18 11:27:44 +0000
committermarius <marius@FreeBSD.org>2011-06-18 11:27:44 +0000
commit3d7e5c6374fe3452da95888f2183d61f6d928f05 (patch)
treec8e7ba588a250c7094754740facb4a2c38ce5a31 /sys/sparc64
parent44781533ff6a37d1a1adef814b3f7c92f282a3dd (diff)
downloadFreeBSD-src-3d7e5c6374fe3452da95888f2183d61f6d928f05.zip
FreeBSD-src-3d7e5c6374fe3452da95888f2183d61f6d928f05.tar.gz
- As with stray vector interrupts limit the reporting of stray level
interrupts. Bringup on additional machine models repeatedly reveals firmware that enables interrupts behind our back, causing the console to be flooded otherwise. - As with the regular interrupt counters using uint16_t instead of u_long for counting the stray vector interrupts should be more than sufficient. - Cache the interrupt vector in intr_stray_vector().
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/sparc64/intr_machdep.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c
index ed30182..112ddab 100644
--- a/sys/sparc64/sparc64/intr_machdep.c
+++ b/sys/sparc64/sparc64/intr_machdep.c
@@ -83,10 +83,11 @@ CTASSERT((1 << IV_SHIFT) == sizeof(struct intr_vector));
ih_func_t *intr_handlers[PIL_MAX];
uint16_t pil_countp[PIL_MAX];
+static uint16_t pil_stray_count[PIL_MAX];
struct intr_vector intr_vectors[IV_MAX];
uint16_t intr_countp[IV_MAX];
-static u_long intr_stray_count[IV_MAX];
+static uint16_t intr_stray_count[IV_MAX];
static const char *const pil_names[] = {
"stray",
@@ -199,22 +200,32 @@ intr_setup(int pri, ih_func_t *ihf, int vec, iv_func_t *ivf, void *iva)
static void
intr_stray_level(struct trapframe *tf)
{
-
- printf("stray level interrupt %ld\n", tf->tf_level);
+ uint64_t level;
+
+ level = tf->tf_level;
+ if (pil_stray_count[level] < MAX_STRAY_LOG) {
+ printf("stray level interrupt %ld\n", level);
+ pil_stray_count[level]++;
+ if (pil_stray_count[level] >= MAX_STRAY_LOG)
+ printf("got %d stray level interrupt %ld's: not "
+ "logging anymore\n", MAX_STRAY_LOG, level);
+ }
}
static void
intr_stray_vector(void *cookie)
{
struct intr_vector *iv;
+ u_int vec;
iv = cookie;
- if (intr_stray_count[iv->iv_vec] < MAX_STRAY_LOG) {
- printf("stray vector interrupt %d\n", iv->iv_vec);
- intr_stray_count[iv->iv_vec]++;
- if (intr_stray_count[iv->iv_vec] >= MAX_STRAY_LOG)
- printf("got %d stray interrupt %d's: not logging "
- "anymore\n", MAX_STRAY_LOG, iv->iv_vec);
+ vec = iv->iv_vec;
+ if (intr_stray_count[vec] < MAX_STRAY_LOG) {
+ printf("stray vector interrupt %d\n", vec);
+ intr_stray_count[vec]++;
+ if (intr_stray_count[vec] >= MAX_STRAY_LOG)
+ printf("got %d stray vector interrupt %d's: not "
+ "logging anymore\n", MAX_STRAY_LOG, vec);
}
}
OpenPOWER on IntegriCloud