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:
parent
5299d64b2b
commit
e0a0a3efcb
@ -80,12 +80,6 @@ dtrace_invop_calltrap_addr:
|
|||||||
.text
|
.text
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Reasonable limit
|
|
||||||
*/
|
|
||||||
#define INTRCNT_COUNT 256
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*----------------------------------------------------------------------------
|
*----------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
@ -1206,36 +1200,6 @@ FPReturn:
|
|||||||
.set pop
|
.set pop
|
||||||
END(MipsFPTrap)
|
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.
|
* Vector to real handler in KSEG1.
|
||||||
*/
|
*/
|
||||||
|
@ -50,6 +50,19 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <machine/md_var.h>
|
#include <machine/md_var.h>
|
||||||
#include <machine/trap.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 *hardintr_events[NHARD_IRQS];
|
||||||
static struct intr_event *softintr_events[NSOFT_IRQS];
|
static struct intr_event *softintr_events[NSOFT_IRQS];
|
||||||
static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS];
|
static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS];
|
||||||
@ -121,6 +134,15 @@ cpu_init_interrupts()
|
|||||||
int i;
|
int i;
|
||||||
char name[MAXCOMLEN + 1];
|
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
|
* Initialize all available vectors so spare IRQ
|
||||||
* would show up in systat output
|
* would show up in systat output
|
||||||
|
Loading…
Reference in New Issue
Block a user