Module Name:    src
Committed By:   simonb
Date:           Sun Jun 14 06:50:31 UTC 2020

Modified Files:
        src/sys/arch/mips/include: locore.h
        src/sys/arch/mips/mips: cpu_subr.c db_interface.c mips_machdep.c

Log Message:
Retire MIPS_CP0FL_USERLOCAL and MIPS_CP0FL_HWRENA and the flawed
logic that tried to deal with a MIPS processor that supports the ULR
CP0 register.  Probe correctly and save probed info somewhere we can
actually use it.  Avoids problems where libc expects ULR set to a
value but the CPU definition in the CPU table didn't have the right
combination of magic flags and thus never set ULR in the first place.


To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/sys/arch/mips/include/locore.h
cvs rdiff -u -r1.47 -r1.48 src/sys/arch/mips/mips/cpu_subr.c
cvs rdiff -u -r1.82 -r1.83 src/sys/arch/mips/mips/db_interface.c
cvs rdiff -u -r1.287 -r1.288 src/sys/arch/mips/mips/mips_machdep.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/mips/include/locore.h
diff -u src/sys/arch/mips/include/locore.h:1.106 src/sys/arch/mips/include/locore.h:1.107
--- src/sys/arch/mips/include/locore.h:1.106	Sat Jun 13 14:26:33 2020
+++ src/sys/arch/mips/include/locore.h	Sun Jun 14 06:50:31 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.h,v 1.106 2020/06/13 14:26:33 simonb Exp $ */
+/* $NetBSD: locore.h,v 1.107 2020/06/14 06:50:31 simonb Exp $ */
 
 /*
  * This file should not be included by MI code!!!
@@ -146,22 +146,23 @@ struct mips_options {
 #define	CPU_ARCH_MIPS32R2	(1 << 7)
 #define	CPU_ARCH_MIPS64R2	(1 << 8)
 
-#define	CPU_MIPS_R4K_MMU		0x0001
-#define	CPU_MIPS_NO_LLSC		0x0002
-#define	CPU_MIPS_CAUSE_IV		0x0004
-#define	CPU_MIPS_HAVE_SPECIAL_CCA	0x0008	/* Defaults to '3' if not set. */
-#define	CPU_MIPS_CACHED_CCA_MASK	0x0070
+#define	CPU_MIPS_R4K_MMU		0x00001
+#define	CPU_MIPS_NO_LLSC		0x00002
+#define	CPU_MIPS_CAUSE_IV		0x00004
+#define	CPU_MIPS_HAVE_SPECIAL_CCA	0x00008	/* Defaults to '3' if not set. */
+#define	CPU_MIPS_CACHED_CCA_MASK	0x00070
 #define	CPU_MIPS_CACHED_CCA_SHIFT	 4
-#define	CPU_MIPS_DOUBLE_COUNT		0x0080	/* 1 cp0 count == 2 clock cycles */
-#define	CPU_MIPS_USE_WAIT		0x0100	/* Use "wait"-based cpu_idle() */
-#define	CPU_MIPS_NO_WAIT		0x0200	/* Inverse of previous, for mips32/64 */
-#define	CPU_MIPS_D_CACHE_COHERENT	0x0400	/* D-cache is fully coherent */
-#define	CPU_MIPS_I_D_CACHE_COHERENT	0x0800	/* I-cache funcs don't need to flush the D-cache */
-#define	CPU_MIPS_NO_LLADDR		0x1000
-#define	CPU_MIPS_HAVE_MxCR		0x2000	/* have mfcr, mtcr insns */
-#define	CPU_MIPS_LOONGSON2		0x4000
-#define	MIPS_NOT_SUPP			0x8000
+#define	CPU_MIPS_DOUBLE_COUNT		0x00080	/* 1 cp0 count == 2 clock cycles */
+#define	CPU_MIPS_USE_WAIT		0x00100	/* Use "wait"-based cpu_idle() */
+#define	CPU_MIPS_NO_WAIT		0x00200	/* Inverse of previous, for mips32/64 */
+#define	CPU_MIPS_D_CACHE_COHERENT	0x00400	/* D-cache is fully coherent */
+#define	CPU_MIPS_I_D_CACHE_COHERENT	0x00800	/* I-cache funcs don't need to flush the D-cache */
+#define	CPU_MIPS_NO_LLADDR		0x01000
+#define	CPU_MIPS_HAVE_MxCR		0x02000	/* have mfcr, mtcr insns */
+#define	CPU_MIPS_LOONGSON2		0x04000
+#define	MIPS_NOT_SUPP			0x08000
 #define	CPU_MIPS_HAVE_DSP		0x10000
+#define	CPU_MIPS_HAVE_USERLOCAL		0x20000
 
 #endif	/* !_LOCORE */
 
@@ -181,8 +182,9 @@ struct mips_options {
 # define MIPS_HAS_CLOCK		0
 # define MIPS_HAS_LLSC		0
 # define MIPS_HAS_LLADDR	0
-# define MIPS_HAS_DSP		0
 # define MIPS_HAS_LMMI		0
+# define MIPS_HAS_DSP		0
+# define MIPS_HAS_USERLOCAL	0
 
 #elif defined(MIPS3) || defined(MIPS4)
 
@@ -206,12 +208,14 @@ struct mips_options {
 #  define MIPS_HAS_LLSC		(mips_options.mips_has_llsc)
 # endif	/* _LOCORE */
 # define MIPS_HAS_LLADDR	((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
-# define MIPS_HAS_DSP		0
 # if defined(MIPS3_LOONGSON2)
 #  define MIPS_HAS_LMMI		((mips_options.mips_cpu_flags & CPU_MIPS_LOONGSON2) != 0)
 # else
 #  define MIPS_HAS_LMMI		0
 # endif
+# define MIPS_HAS_DSP		0
+# define MIPS_HAS_USERLOCAL	0
+
 #elif defined(MIPS32)
 
 # define CPUISMIPS3		1
@@ -226,8 +230,9 @@ struct mips_options {
 # define MIPS_HAS_CLOCK		1
 # define MIPS_HAS_LLSC		1
 # define MIPS_HAS_LLADDR	((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
-# define MIPS_HAS_DSP		0
 # define MIPS_HAS_LMMI		0
+# define MIPS_HAS_DSP		0
+# define MIPS_HAS_USERLOCAL	0
 
 #elif defined(MIPS32R2)
 
@@ -243,8 +248,9 @@ struct mips_options {
 # define MIPS_HAS_CLOCK		1
 # define MIPS_HAS_LLSC		1
 # define MIPS_HAS_LLADDR	((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
-# define MIPS_HAS_DSP		(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_DSP)
 # define MIPS_HAS_LMMI		0
+# define MIPS_HAS_DSP		(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_DSP)
+# define MIPS_HAS_USERLOCAL	(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_USERLOCAL)
 
 #elif defined(MIPS64)
 
@@ -260,8 +266,9 @@ struct mips_options {
 # define MIPS_HAS_CLOCK		1
 # define MIPS_HAS_LLSC		1
 # define MIPS_HAS_LLADDR	((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
-# define MIPS_HAS_DSP		0
 # define MIPS_HAS_LMMI		0
+# define MIPS_HAS_DSP		0
+# define MIPS_HAS_USERLOCAL	0
 
 #elif defined(MIPS64R2)
 
@@ -277,8 +284,9 @@ struct mips_options {
 # define MIPS_HAS_CLOCK		1
 # define MIPS_HAS_LLSC		1
 # define MIPS_HAS_LLADDR	((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
-# define MIPS_HAS_DSP		(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_DSP)
 # define MIPS_HAS_LMMI		0
+# define MIPS_HAS_DSP		(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_DSP)
+# define MIPS_HAS_USERLOCAL	(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_USERLOCAL)
 
 #endif
 
@@ -297,6 +305,7 @@ struct mips_options {
 #endif
 #define	MIPS_HAS_LLADDR		((mips_options.mips_cpu_flags & CPU_MIPS_NO_LLADDR) == 0)
 #define MIPS_HAS_DSP		(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_DSP)
+# define MIPS_HAS_USERLOCAL	(mips_options.mips_cpu_flags & CPU_MIPS_HAVE_USERLOCAL)
 
 /* This test is ... rather bogus */
 #define	CPUISMIPS3	((mips_options.mips_cpu_arch & \
@@ -309,7 +318,10 @@ struct mips_options {
 #define	CPUISMIPS32R2	((mips_options.mips_cpu_arch & CPU_ARCH_MIPS32R2) != 0)
 #define	CPUISMIPS64	((mips_options.mips_cpu_arch & CPU_ARCH_MIPS64) != 0)
 #define	CPUISMIPS64R2	((mips_options.mips_cpu_arch & CPU_ARCH_MIPS64R2) != 0)
-#define	CPUISMIPSNN	((mips_options.mips_cpu_arch & (CPU_ARCH_MIPS32 | CPU_ARCH_MIPS32R2 | CPU_ARCH_MIPS64 | CPU_ARCH_MIPS64R2)) != 0)
+#define	CPUISMIPSNN	((mips_options.mips_cpu_arch & \
+	(CPU_ARCH_MIPS32 | CPU_ARCH_MIPS32R2 | CPU_ARCH_MIPS64 | CPU_ARCH_MIPS64R2)) != 0)
+#define	CPUISMIPSNNR2	((mips_options.mips_cpu_arch & \
+	(CPU_ARCH_MIPS32R2 | CPU_ARCH_MIPS64R2)) != 0)
 #define	CPUIS64BITS	((mips_options.mips_cpu_arch & \
 	(CPU_ARCH_MIPS3 | CPU_ARCH_MIPS4 | CPU_ARCH_MIPS64 | CPU_ARCH_MIPS64R2)) != 0)
 
@@ -866,8 +878,6 @@ struct pridtab {
 #define  MIPS_CP0FL_CONFIG5	__BIT(11) /* XXX probeable - shouldn't be hard coded */
 #define  MIPS_CP0FL_CONFIG6	__BIT(12) /* XXX probeable - shouldn't be hard coded */
 #define  MIPS_CP0FL_CONFIG7	__BIT(13) /* XXX probeable - shouldn't be hard coded */
-#define  MIPS_CP0FL_USERLOCAL	__BIT(14) /* XXX probeable - shouldn't be hard coded */
-#define  MIPS_CP0FL_HWRENA	__BIT(15) /* XXX probeable - shouldn't be hard coded */
 
 /*
  * cpu_cidflags defines, by company

Index: src/sys/arch/mips/mips/cpu_subr.c
diff -u src/sys/arch/mips/mips/cpu_subr.c:1.47 src/sys/arch/mips/mips/cpu_subr.c:1.48
--- src/sys/arch/mips/mips/cpu_subr.c:1.47	Thu Jun 11 19:20:44 2020
+++ src/sys/arch/mips/mips/cpu_subr.c	Sun Jun 14 06:50:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.47 2020/06/11 19:20:44 ad Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.48 2020/06/14 06:50:31 simonb Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.47 2020/06/11 19:20:44 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.48 2020/06/14 06:50:31 simonb Exp $");
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
@@ -209,14 +209,14 @@ cpu_hwrena_setup(void)
 	if ((cp0flags & MIPS_CP0FL_USE) == 0)
 		return;
 
-	if (cp0flags & MIPS_CP0FL_HWRENA) {
+	if (CPUISMIPSNNR2) {
 		mipsNN_cp0_hwrena_write(
-		    MIPS_HWRENA_UL
-		    |MIPS_HWRENA_CCRES
-		    |MIPS_HWRENA_CC
-		    |MIPS_HWRENA_SYNCI_STEP
-		    |MIPS_HWRENA_CPUNUM);
-		if (cp0flags & MIPS_CP0FL_USERLOCAL) {
+		    (MIPS_HAS_USERLOCAL ? MIPS_HWRENA_UL : 0)
+		    | MIPS_HWRENA_CCRES
+		    | MIPS_HWRENA_CC
+		    | MIPS_HWRENA_SYNCI_STEP
+		    | MIPS_HWRENA_CPUNUM);
+		if (MIPS_HAS_USERLOCAL) {
 			mipsNN_cp0_userlocal_write(curlwp->l_private);
 		}
 	}
@@ -1022,8 +1022,7 @@ int
 cpu_lwp_setprivate(lwp_t *l, void *v)
 {
 #if (MIPS32R2 + MIPS64R2) > 0
-	if (l == curlwp
-	    && (mips_options.mips_cpu->cpu_cp0flags & MIPS_CP0FL_USERLOCAL)) {
+	if (l == curlwp && MIPS_HAS_USERLOCAL) {
 		mipsNN_cp0_userlocal_write(v);
 	}
 #endif

Index: src/sys/arch/mips/mips/db_interface.c
diff -u src/sys/arch/mips/mips/db_interface.c:1.82 src/sys/arch/mips/mips/db_interface.c:1.83
--- src/sys/arch/mips/mips/db_interface.c:1.82	Sat Apr  6 03:06:26 2019
+++ src/sys/arch/mips/mips/db_interface.c	Sun Jun 14 06:50:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_interface.c,v 1.82 2019/04/06 03:06:26 thorpej Exp $	*/
+/*	$NetBSD: db_interface.c,v 1.83 2020/06/14 06:50:31 simonb Exp $	*/
 
 /*
  * Mach Operating System
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.82 2019/04/06 03:06:26 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.83 2020/06/14 06:50:31 simonb Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_cputype.h"	/* which mips CPUs do we support? */
@@ -466,9 +466,9 @@ db_cp0dump_cmd(db_expr_t addr, bool have
 			SHOW32SEL(16, 6, "config6");
 		if ((cp0flags & MIPS_CP0FL_CONFIG7) != 0)
 			SHOW32SEL(16, 7, "config7");
-		if ((cp0flags & MIPS_CP0FL_HWRENA) != 0)
+		if (CPUISMIPSNNR2)
 			SHOW32(7, "hwrena");
-		if ((cp0flags & MIPS_CP0FL_USERLOCAL) != 0)
+		if (MIPS_HAS_USERLOCAL)
 			SHOW32SEL(4, 2, "userlocal");
 	} else {
 		SHOW32(MIPS_COP_0_CONFIG, "config");

Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.287 src/sys/arch/mips/mips/mips_machdep.c:1.288
--- src/sys/arch/mips/mips/mips_machdep.c:1.287	Sat Jun 13 14:45:17 2020
+++ src/sys/arch/mips/mips/mips_machdep.c	Sun Jun 14 06:50:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: mips_machdep.c,v 1.287 2020/06/13 14:45:17 simonb Exp $	*/
+/*	$NetBSD: mips_machdep.c,v 1.288 2020/06/14 06:50:31 simonb Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -111,7 +111,7 @@
  */
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.287 2020/06/13 14:45:17 simonb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.288 2020/06/14 06:50:31 simonb Exp $");
 
 #define __INTR_PRIVATE
 #include "opt_cputype.h"
@@ -460,21 +460,21 @@ static const struct pridtab cputab[] = {
 	{ MIPS_PRID_CID_MTI, MIPS_24K, -1, -1,	-1, 0,
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG7,
 	  0, "24K" },
 	{ MIPS_PRID_CID_MTI, MIPS_24KE, -1, -1,	-1, 0,
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG7,
 	  0, "24KE" },
 	{ MIPS_PRID_CID_MTI, MIPS_34K, -1, -1,	-1, 0,
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG7,
 	  0, "34K" },
@@ -482,21 +482,21 @@ static const struct pridtab cputab[] = {
 	  CPU_MIPS_HAVE_SPECIAL_CCA | (0 << CPU_MIPS_CACHED_CCA_SHIFT) |
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
 	  0, "74K" },
 	{ MIPS_PRID_CID_MTI, MIPS_1004K, -1, -1,	-1, 0,
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
 	  0, "1004K" },
 	{ MIPS_PRID_CID_MTI, MIPS_1074K, -1, -1,	-1, 0,
 	  MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE |
 	  MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
 	  MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
 	  0, "1074K" },
@@ -659,7 +659,7 @@ static const struct pridtab cputab[] = {
 	{ MIPS_PRID_CID_CAVIUM, MIPS_CN50XX, -1, -1, -1, 0,
 	  MIPS64_FLAGS | CPU_MIPS_D_CACHE_COHERENT | CPU_MIPS_NO_LLADDR,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_CONFIG | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE | MIPS_CP0FL_CONFIG |
 	  MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 | MIPS_CP0FL_CONFIG3,
 	  0,
 	  "CN50xx"		},
@@ -667,7 +667,7 @@ static const struct pridtab cputab[] = {
 	{ MIPS_PRID_CID_CAVIUM, MIPS_CN70XX, -1, -1, -1, 0,
 	  MIPS64_FLAGS | CPU_MIPS_D_CACHE_COHERENT | CPU_MIPS_NO_LLADDR,
 	  MIPS_CP0FL_USE |
-	  MIPS_CP0FL_EBASE | MIPS_CP0FL_CONFIG | MIPS_CP0FL_HWRENA |
+	  MIPS_CP0FL_EBASE | MIPS_CP0FL_CONFIG |
 	  MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 | MIPS_CP0FL_CONFIG3,
 	  0,
 	  "CN70xx/CN71xx"	},
@@ -932,21 +932,21 @@ mips32r2_vector_init(const struct splsw 
 	/*
 	 * Let's see if this cpu has USERLOCAL or DSP V2 ASE...
 	 */
-	uint32_t cp0flags = mips_options.mips_cpu->cpu_cp0flags;
 	if (mipsNN_cp0_config2_read() & MIPSNN_CFG2_M) {
 		const uint32_t cfg3 = mipsNN_cp0_config3_read();
 		if (cfg3 & MIPSNN_CFG3_ULRI) {
-			cp0flags |= MIPS_CP0FL_USERLOCAL;
+			mips_options.mips_cpu_flags |= CPU_MIPS_HAVE_USERLOCAL;
 		}
 		if (cfg3 & MIPSNN_CFG3_DSP2P) {
 			mips_options.mips_cpu_flags |= CPU_MIPS_HAVE_DSP;
 		}
 	}
+
 	/*
 	 * If this CPU doesn't have a COP0 USERLOCAL register, at the end
 	 * of cpu_switch resume overwrite the instructions which update it.
 	 */
-	if (!(cp0flags & MIPS_CP0FL_USERLOCAL)) {
+	if (!MIPS_HAS_USERLOCAL && cpunum == 0) {
 		extern uint32_t mips32r2_cpu_switch_resume[];
 		for (uint32_t *insnp = mips32r2_cpu_switch_resume;; insnp++) {
 			KASSERT(insnp[0] != JR_RA);
@@ -962,7 +962,8 @@ mips32r2_vector_init(const struct splsw 
 	/*
 	 * Copy locore-function vector.
 	 */
-	mips_locore_jumpvec = mips32r2_locore_vec;
+	if (cpunum == 0)
+		mips_locore_jumpvec = mips32r2_locore_vec;
 
 	mips_icache_sync_all();
 	mips_dcache_wbinv_all();
@@ -1078,11 +1079,10 @@ mips64r2_vector_init(const struct splsw 
 	/*
 	 * Let's see if this cpu has USERLOCAL or DSP V2 ASE...
 	 */
-	uint32_t cp0flags = mips_options.mips_cpu->cpu_cp0flags;
 	if (mipsNN_cp0_config2_read() & MIPSNN_CFG2_M) {
 		const uint32_t cfg3 = mipsNN_cp0_config3_read();
 		if (cfg3 & MIPSNN_CFG3_ULRI) {
-			cp0flags |= MIPS_CP0FL_USERLOCAL;
+			mips_options.mips_cpu_flags |= CPU_MIPS_HAVE_USERLOCAL;
 		}
 		if (cfg3 & MIPSNN_CFG3_DSP2P) {
 			mips_options.mips_cpu_flags |= CPU_MIPS_HAVE_DSP;
@@ -1093,7 +1093,7 @@ mips64r2_vector_init(const struct splsw 
 	 * If this CPU doesn't have a COP0 USERLOCAL register, at the end
 	 * of cpu_switch resume overwrite the instructions which update it.
 	 */
-	if (!(cp0flags & MIPS_CP0FL_USERLOCAL) && cpunum == 0) {
+	if (!MIPS_HAS_USERLOCAL && cpunum == 0) {
 		extern uint32_t mips64r2_cpu_switch_resume[];
 		for (uint32_t *insnp = mips64r2_cpu_switch_resume;; insnp++) {
 			KASSERT(insnp[0] != JR_RA);

Reply via email to