git: e0a0a3efcb09 - main - mips: fix early kernel panic when setting up interrupt counters

Oleksandr Tymoshenko gonzo at FreeBSD.org
Sun Jan 31 21:44:59 UTC 2021


The branch main has been updated by gonzo:

URL: https://cgit.FreeBSD.org/src/commit/?id=e0a0a3efcb09a10ad1de29aca622ea580b2663d2

commit e0a0a3efcb09a10ad1de29aca622ea580b2663d2
Author:     Oleksandr Tymoshenko <gonzo at FreeBSD.org>
AuthorDate: 2021-01-30 06:11:24 +0000
Commit:     Oleksandr Tymoshenko <gonzo at FreeBSD.org>
CommitDate: 2021-01-31 21:44:45 +0000

    mips: fix early kernel panic when setting up interrupt counters
    
    Commit 248f0ca converted intrcnt and intrnames from u_long[]
    and char[] to u_long* and char* respectively, but for non-INTRNG mips
    these symbols were defined in .S file as a pre-allocated static arrays,
    so the problem wasn't cought at compile time. Conversion from an array
    to a pointer requires pointer initialization and it wasn't done
    for MIPS, so whatever happenned to be in the begginning of intcnt[]
    array was used as a pointer value.
    
    Move intrcnt/intrnames to C code and allocate them dynamically
    although with a fixed size at the moment.
    
    Reviewed by:    emaste
    PR:             253051
    Differential Revision:  https://reviews.freebsd.org/D28424
    MFC after:      1 day
---
 sys/mips/mips/exception.S    | 36 ------------------------------------
 sys/mips/mips/intr_machdep.c | 22 ++++++++++++++++++++++
 2 files changed, 22 insertions(+), 36 deletions(-)

diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S
index 892bebc8f37f..719904ac83b7 100644
--- a/sys/mips/mips/exception.S
+++ b/sys/mips/mips/exception.S
@@ -80,12 +80,6 @@ dtrace_invop_calltrap_addr:
 	.text
 #endif
 
-/*
- * Reasonable limit
- */
-#define	INTRCNT_COUNT	256
-
-
 /*
  *----------------------------------------------------------------------------
  *
@@ -1206,36 +1200,6 @@ FPReturn:
 	.set pop
 END(MipsFPTrap)
 
-#ifndef INTRNG
-/*
- * Interrupt counters for vmstat.
- */
-	.data
-	.globl intrcnt
-	.globl sintrcnt
-	.globl intrnames
-	.globl sintrnames
-intrnames:
-	.space  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-sintrnames:
-#ifdef __mips_n64
-	.quad  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-#else
-	.int  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
-#endif
-
-	.align	(_MIPS_SZLONG / 8)
-intrcnt:
-	.space  INTRCNT_COUNT * (_MIPS_SZLONG / 8) * 2
-sintrcnt:
-#ifdef __mips_n64
-	.quad  INTRCNT_COUNT * (_MIPS_SZLONG / 8) * 2
-#else
-	.int  INTRCNT_COUNT * (_MIPS_SZLONG / 8) * 2
-#endif
-#endif /* INTRNG */
-
-
 /*
  * Vector to real handler in KSEG1.
  */
diff --git a/sys/mips/mips/intr_machdep.c b/sys/mips/mips/intr_machdep.c
index 3b278276865c..a36944f657ca 100644
--- a/sys/mips/mips/intr_machdep.c
+++ b/sys/mips/mips/intr_machdep.c
@@ -50,6 +50,19 @@ __FBSDID("$FreeBSD$");
 #include <machine/md_var.h>
 #include <machine/trap.h>
 
+#ifndef INTRNG
+#define INTRCNT_COUNT	256
+#define	INTRNAME_LEN	(2*MAXCOMLEN + 1)
+
+MALLOC_DECLARE(M_MIPSINTR);
+MALLOC_DEFINE(M_MIPSINTR, "mipsintr", "MIPS interrupt handling");
+
+u_long *intrcnt;
+char *intrnames;
+size_t sintrcnt;
+size_t sintrnames;
+#endif
+
 static struct intr_event *hardintr_events[NHARD_IRQS];
 static struct intr_event *softintr_events[NSOFT_IRQS];
 static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS];
@@ -121,6 +134,15 @@ cpu_init_interrupts()
 	int i;
 	char name[MAXCOMLEN + 1];
 
+#ifndef INTRNG
+	intrcnt = mallocarray(INTRCNT_COUNT, sizeof(u_long), M_MIPSINTR,
+	    M_WAITOK | M_ZERO);
+	intrnames = mallocarray(INTRCNT_COUNT, INTRNAME_LEN, M_MIPSINTR,
+	    M_WAITOK | M_ZERO);
+	sintrcnt = INTRCNT_COUNT * sizeof(u_long);
+	sintrnames = INTRCNT_COUNT * INTRNAME_LEN;
+#endif
+
 	/*
 	 * Initialize all available vectors so spare IRQ
 	 * would show up in systat output 


More information about the dev-commits-src-all mailing list