Module Name: src
Committed By: thorpej
Date: Mon Jan 15 17:12:00 UTC 2024
Modified Files:
src/sys/arch/m68k/include: intr.h
src/sys/arch/m68k/m68k: m68k_intr.c
Log Message:
Use evcnt to count interrupts for the non-__HAVE_LEGACY_INTRCNT case.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/m68k/include/intr.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/m68k/m68k/m68k_intr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/m68k/include/intr.h
diff -u src/sys/arch/m68k/include/intr.h:1.2 src/sys/arch/m68k/include/intr.h:1.3
--- src/sys/arch/m68k/include/intr.h:1.2 Mon Jan 15 02:13:16 2024
+++ src/sys/arch/m68k/include/intr.h Mon Jan 15 17:12:00 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.2 2024/01/15 02:13:16 thorpej Exp $ */
+/* $NetBSD: intr.h,v 1.3 2024/01/15 17:12:00 thorpej Exp $ */
/*-
* Copyright (c) 2023, 2024 The NetBSD Foundation, Inc.
@@ -132,7 +132,15 @@ struct m68k_ih_allocfuncs {
struct m68k_ih_allocfuncs;
#endif /* _M68K_INTR_PRIVATE */
-struct evcnt;
+#include <sys/evcnt.h>
+
+#ifndef __HAVE_LEGACY_INTRCNT
+/*
+ * This is exposed here so that platform-specific interrupt handlers
+ * can access it.
+ */
+extern struct evcnt m68k_intr_evcnt[];
+#endif
/*
* Common m68k interrupt dispatch:
Index: src/sys/arch/m68k/m68k/m68k_intr.c
diff -u src/sys/arch/m68k/m68k/m68k_intr.c:1.4 src/sys/arch/m68k/m68k/m68k_intr.c:1.5
--- src/sys/arch/m68k/m68k/m68k_intr.c:1.4 Mon Jan 15 02:13:16 2024
+++ src/sys/arch/m68k/m68k/m68k_intr.c Mon Jan 15 17:12:00 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: m68k_intr.c,v 1.4 2024/01/15 02:13:16 thorpej Exp $ */
+/* $NetBSD: m68k_intr.c,v 1.5 2024/01/15 17:12:00 thorpej Exp $ */
/*-
* Copyright (c) 1996, 2023, 2024 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: m68k_intr.c,v 1.4 2024/01/15 02:13:16 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: m68k_intr.c,v 1.5 2024/01/15 17:12:00 thorpej Exp $");
#define _M68K_INTR_PRIVATE
@@ -70,10 +70,6 @@ extern char intrstub_vectored[];
/* A dummy event counter where interrupt stats go to die. */
static struct evcnt bitbucket;
-#ifdef __HAVE_LEGACY_INTRCNT
-extern u_int intrcnt[]; /* XXX old-style statistics */
-#endif
-
int idepth;
static struct m68k_intrhand_list m68k_intrhands_autovec[NAUTOVECTORS];
@@ -81,6 +77,33 @@ static struct m68k_intrhand_list m68k_in
static struct m68k_intrhand *m68k_intrhands_vectored[NVECHANDS];
#endif
+#ifdef __HAVE_LEGACY_INTRCNT
+extern u_int intrcnt[];
+#define INTRCNT(x) intrcnt[(x)]++
+#else
+#ifndef MACHINE_INTREVCNT_NAMES
+#define MACHINE_INTREVCNT_NAMES \
+ { "spur", "lev1", "lev2", "lev3", "lev4", "lev5", "lev6", "nmi" }
+#endif
+static const char * const m68k_intr_evcnt_names[] = MACHINE_INTREVCNT_NAMES;
+__CTASSERT(__arraycount(m68k_intr_evcnt_names) == NAUTOVECTORS);
+static const char m68k_intr_evcnt_group[] = "cpu";
+
+#define INTRCNT_INIT(x) \
+ EVCNT_INITIALIZER(EVCNT_TYPE_INTR, NULL, m68k_intr_evcnt_group, \
+ m68k_intr_evcnt_names[(x)])
+
+struct evcnt m68k_intr_evcnt[] = {
+ INTRCNT_INIT(0), INTRCNT_INIT(1), INTRCNT_INIT(2), INTRCNT_INIT(3),
+ INTRCNT_INIT(4), INTRCNT_INIT(5), INTRCNT_INIT(6), INTRCNT_INIT(7),
+};
+__CTASSERT(__arraycount(m68k_intr_evcnt) == NAUTOVECTORS);
+
+#undef INTRCNT_INIT
+
+#define INTRCNT(x) m68k_intr_evcnt[(x)].ev_count++
+#endif /* __HAVE_LEGACY_INTRCNT */
+
const uint16_t ipl2psl_table[NIPL] = {
[IPL_NONE] = PSL_S | PSL_IPL0,
[IPL_SOFTBIO] = PSL_S | MACHINE_PSL_IPL_SOFTBIO,
@@ -197,13 +220,15 @@ m68k_intr_init(const struct m68k_ih_allo
for (i = 0; i < NAUTOVECTORS; i++) {
LIST_INIT(&m68k_intrhands_autovec[i]);
+#ifndef __HAVE_LEGACY_INTRCNT
+ evcnt_attach_static(&m68k_intr_evcnt[i]);
+#endif
}
}
/*
* m68k_intr_establish --
* Establish an interrupt handler at the specified vector.
- * XXX We don't do anything with isrpri yet.
* XXX We don't do anything with the flags yet.
*/
void *
@@ -339,9 +364,7 @@ m68k_intr_autovec(struct clockframe fram
idepth++;
-#ifdef __HAVE_LEGACY_INTRCNT
- intrcnt[ipl]++; /* XXX */
-#endif
+ INTRCNT(ipl);
curcpu()->ci_data.cpu_nintr++;
LIST_FOREACH(ih, &m68k_intrhands_autovec[ipl], ih_link) {
@@ -377,9 +400,7 @@ m68k_intr_vectored(struct clockframe fra
idepth++;
-#ifdef __HAVE_LEGACY_INTRCNT
- intrcnt[ipl]++; /* XXX */
-#endif
+ INTRCNT(ipl);
curcpu()->ci_data.cpu_nintr++;
#ifdef DIAGNOSTIC
@@ -394,7 +415,10 @@ m68k_intr_vectored(struct clockframe fra
vec_set_entry(vec, INTR_FREEVEC);
}
- if ((*ih->ih_func)(ih->ih_arg ? ih->ih_arg : &frame) == 0) {
+ if (__predict_true((*ih->ih_func)(ih->ih_arg ? ih->ih_arg
+ : &frame) != 0)) {
+ ih->ih_evcnt->ev_count++;
+ } else {
printf("Spurious interrupt on vector=0x%0x IPL %d\n",
vec, ipl);
}