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
This commit is contained in:
Oleksandr Tymoshenko 2021-01-29 22:11:24 -08:00
parent 5299d64b2b
commit e0a0a3efcb
2 changed files with 22 additions and 36 deletions

View File

@ -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.
*/

View File

@ -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