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

Mateusz Guzik mjguzik at gmail.com
Mon Feb 1 05:02:26 UTC 2021


This breaks building mips XLP64:

linking kernel.full
ld: error: undefined symbol: intrcnt
>>> referenced by kern_clock.c:813 (/usr/src/sys/kern/kern_clock.c:813)
>>>               kern_clock.o:(hardclock)
>>> referenced by kern_clock.c:813 (/usr/src/sys/kern/kern_clock.c:813)
>>>               kern_clock.o:(hardclock)
>>> referenced by kern_clock.c:813 (/usr/src/sys/kern/kern_clock.c:813)
>>>               kern_clock.o:(hardclock)
>>> referenced 21 more times

and so on

On 1/31/21, Oleksandr Tymoshenko <gonzo at freebsd.org> wrote:
> 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
> _______________________________________________
> dev-commits-src-all at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
> To unsubscribe, send any mail to
> "dev-commits-src-all-unsubscribe at freebsd.org"
>


-- 
Mateusz Guzik <mjguzik gmail.com>


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