Module Name:    src
Committed By:   skrll
Date:           Sun Sep  3 08:48:20 UTC 2023

Modified Files:
        src/sys/arch/riscv/conf: GENERIC.common files.riscv
        src/sys/arch/riscv/fdt: cpu_fdt.c
        src/sys/arch/riscv/include: cpu.h intr.h pmap.h
        src/sys/arch/riscv/riscv: cpu.c cpu_subr.c db_interface.c ipifuncs.c
            locore.S pmap_machdep.c riscv_machdep.c riscv_tlb.c

Log Message:
Fix and enable MULTIPROCESSOR


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/riscv/conf/GENERIC.common
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/riscv/conf/files.riscv
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/riscv/fdt/cpu_fdt.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/riscv/include/cpu.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/include/intr.h
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/riscv/include/pmap.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/riscv/cpu.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/riscv/riscv/cpu_subr.c \
    src/sys/arch/riscv/riscv/db_interface.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/riscv/riscv/ipifuncs.c \
    src/sys/arch/riscv/riscv/riscv_tlb.c
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/riscv/riscv/locore.S
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/riscv/riscv/pmap_machdep.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/riscv/riscv/riscv_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/riscv/conf/GENERIC.common
diff -u src/sys/arch/riscv/conf/GENERIC.common:1.6 src/sys/arch/riscv/conf/GENERIC.common:1.7
--- src/sys/arch/riscv/conf/GENERIC.common:1.6	Tue Aug  1 22:06:23 2023
+++ src/sys/arch/riscv/conf/GENERIC.common	Sun Sep  3 08:48:19 2023
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: GENERIC.common,v 1.6 2023/08/01 22:06:23 rjs Exp $
+#	$NetBSD: GENERIC.common,v 1.7 2023/09/03 08:48:19 skrll Exp $
 #
 #	GENERIC common RISC-V kernel config items shared between 32 and 64
 #	kernels
@@ -8,7 +8,7 @@
 maxusers 	64		# estimated number of users
 
 options 	FDT
-#options 	MULTIPROCESSOR
+options 	MULTIPROCESSOR
 
 # Standard system options
 options 	FPE		# Floating-point extension support

Index: src/sys/arch/riscv/conf/files.riscv
diff -u src/sys/arch/riscv/conf/files.riscv:1.13 src/sys/arch/riscv/conf/files.riscv:1.14
--- src/sys/arch/riscv/conf/files.riscv:1.13	Mon Jun 12 19:04:13 2023
+++ src/sys/arch/riscv/conf/files.riscv	Sun Sep  3 08:48:19 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: files.riscv,v 1.13 2023/06/12 19:04:13 skrll Exp $
+#	$NetBSD: files.riscv,v 1.14 2023/09/03 08:48:19 skrll Exp $
 #
 
 maxpartitions	16
@@ -64,7 +64,6 @@ file	kern/subr_disk_mbr.c			disk
 file	uvm/pmap/pmap.c
 file	uvm/pmap/pmap_devmap.c
 file	uvm/pmap/pmap_segtab.c
-file	uvm/pmap/pmap_synci.c
 file	uvm/pmap/pmap_tlb.c
 
 device  plic

Index: src/sys/arch/riscv/fdt/cpu_fdt.c
diff -u src/sys/arch/riscv/fdt/cpu_fdt.c:1.2 src/sys/arch/riscv/fdt/cpu_fdt.c:1.3
--- src/sys/arch/riscv/fdt/cpu_fdt.c:1.2	Mon Jun 12 19:04:13 2023
+++ src/sys/arch/riscv/fdt/cpu_fdt.c	Sun Sep  3 08:48:19 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu_fdt.c,v 1.2 2023/06/12 19:04:13 skrll Exp $ */
+/* $NetBSD: cpu_fdt.c,v 1.3 2023/09/03 08:48:19 skrll Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca>
@@ -29,7 +29,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_fdt.c,v 1.2 2023/06/12 19:04:13 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_fdt.c,v 1.3 2023/09/03 08:48:19 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -44,7 +44,6 @@ __KERNEL_RCSID(0, "$NetBSD: cpu_fdt.c,v 
 #include <riscv/fdt/riscv_fdtvar.h>
 
 
-#ifdef MULTIPROCESSOR
 static bool
 riscv_fdt_cpu_okay(const int child)
 {
@@ -65,33 +64,32 @@ riscv_fdt_cpu_okay(const int child)
 		return true;
 	}
 }
-#endif /* MULTIPROCESSOR */
 
 void
 riscv_fdt_cpu_bootstrap(void)
 {
-#ifdef MULTIPROCESSOR
-
 	const int cpus = OF_finddevice("/cpus");
 	if (cpus == -1) {
 		aprint_error("%s: no /cpus node found\n", __func__);
-		riscv_cpu_max = 1;
 		return;
 	}
 
-	/* Count harts and add hart IDs to to cpu_hartid array */
-	size_t cpuindex = 1;
+	/* Count harts and add hart index numbers to the cpu_hartindex array */
+	u_int cpuindex = 1;
 	for (int child = OF_child(cpus); child; child = OF_peer(child)) {
 		if (!riscv_fdt_cpu_okay(child))
 			continue;
 
-		riscv_cpu_max++;
-
 		uint64_t reg;
 		if (fdtbus_get_reg64(child, 0, &reg, NULL) != 0)
 			continue;
 
 		const cpuid_t hartid = reg;
+		if (hartid > MAXCPUS) {
+			aprint_error("hart id too big %lu (%u)", hartid,
+			    MAXCPUS);
+			continue;
+		}
 
 		struct sbiret sbiret = sbi_hart_get_status(hartid);
 		switch (sbiret.error) {
@@ -107,22 +105,19 @@ riscv_fdt_cpu_bootstrap(void)
 
 		/* Assume the BP is the only one started. */
 		if (sbiret.value == SBI_HART_STARTED) {
-			if (cpu_hartid[0] != -1) {
+			if (cpu_bphartid != ~0UL) {
 				panic("more than 1 hart started");
 			}
-			cpu_hartid[0] = hartid;
+			cpu_bphartid = hartid;
+			cpu_hartindex[hartid] = 0;
 			continue;
 		}
 
 		KASSERT(cpuindex < MAXCPUS);
-		cpu_hartid[cpuindex] = hartid;
-		cpu_dcache_wb_range((vaddr_t)&cpu_hartid[cpuindex],
-		    sizeof(cpu_hartid[cpuindex]));
-
-		cpuindex++;
+		cpu_hartindex[hartid] = cpuindex++;
 	}
-#endif
 }
+
 int
 riscv_fdt_cpu_mpstart(void)
 {
@@ -134,11 +129,8 @@ riscv_fdt_cpu_mpstart(void)
 		return 0;
 	}
 
-	// riscv_fdt_cpu_bootstrap put the boot hart id in cpu_hartid[0]
-	const cpuid_t bp_hartid = cpu_hartid[0];
-
 	/* BootAPs */
-	size_t cpuindex = 1;
+	u_int cpuindex = 1;
 	for (int child = OF_child(cpus); child; child = OF_peer(child)) {
 		if (!riscv_fdt_cpu_okay(child))
 			continue;
@@ -147,13 +139,12 @@ riscv_fdt_cpu_mpstart(void)
 		if (fdtbus_get_reg64(child, 0, &reg, NULL) != 0)
 			continue;
 
-		cpuid_t hartid = reg;
-
-		if (hartid == bp_hartid)
+		const cpuid_t hartid = reg;
+		if (hartid == cpu_bphartid)
 			continue;		/* BP already started */
 
 		const paddr_t entry = KERN_VTOPHYS(cpu_mpstart);
-		struct sbiret sbiret = sbi_hart_start(hartid, entry, 0);
+		struct sbiret sbiret = sbi_hart_start(hartid, entry, cpuindex);
 		switch (sbiret.error) {
 		case SBI_SUCCESS:
 			break;
@@ -179,8 +170,8 @@ riscv_fdt_cpu_mpstart(void)
 
 		if (i == 0) {
 			ret++;
-			aprint_error("cpu%zu: WARNING: AP failed to start\n",
-			    cpuindex);
+			aprint_error("hart%ld: WARNING: AP %u failed to start\n",
+			    hartid, cpuindex);
 		}
 
 		cpuindex++;
@@ -207,13 +198,14 @@ cpu_fdt_attach(device_t parent, device_t
 {
 	struct fdt_attach_args * const faa = aux;
 	const int phandle = faa->faa_phandle;
-	bus_addr_t cpuid;
+	bus_addr_t hartid;
+
 
-	if (fdtbus_get_reg(phandle, 0, &cpuid, NULL) != 0)
-		cpuid = 0;
+	if (fdtbus_get_reg(phandle, 0, &hartid, NULL) != 0)
+		hartid = 0;
 
 	/* Attach the CPU */
-	cpu_attach(self, cpuid);
+	cpu_attach(self, hartid);
 
 	fdt_add_bus(self, phandle, faa);
 }

Index: src/sys/arch/riscv/include/cpu.h
diff -u src/sys/arch/riscv/include/cpu.h:1.13 src/sys/arch/riscv/include/cpu.h:1.14
--- src/sys/arch/riscv/include/cpu.h:1.13	Sat Jul 29 06:59:47 2023
+++ src/sys/arch/riscv/include/cpu.h	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.13 2023/07/29 06:59:47 skrll Exp $ */
+/* $NetBSD: cpu.h,v 1.14 2023/09/03 08:48:20 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -91,7 +91,6 @@ struct cpu_info {
 #define	CPUF_PRESENT	__BIT(1)		/* CPU is present */
 #define	CPUF_RUNNING	__BIT(2)		/* CPU is running */
 #define	CPUF_PAUSED	__BIT(3)		/* CPU is paused */
-#define	CPUF_USERPMAP	__BIT(4)		/* CPU has a user pmap activated */
 
 	volatile u_long ci_request_ipis;
 						/* bitmask of IPIs requested */
@@ -118,23 +117,21 @@ struct cpu_info {
 
 #ifdef _KERNEL
 
-extern struct cpu_info *cpu_info[];
 extern struct cpu_info cpu_info_store[];
-
+extern cpuid_t cpu_bphartid;
+extern u_int cpu_hartindex[];
 
 #ifdef MULTIPROCESSOR
-extern u_int riscv_cpu_max;
-extern cpuid_t cpu_hartid[];
 
-void cpu_hatch(struct cpu_info *);
+void cpu_hatch(struct cpu_info *, unsigned long);
 
-void cpu_init_secondary_processor(int);
+void cpu_init_secondary_processor(u_int);
 void cpu_boot_secondary_processors(void);
 void cpu_mpstart(void);
 bool cpu_hatched_p(u_int);
 
-void cpu_clr_mbox(int);
-void cpu_set_hatched(int);
+void cpu_clr_mbox(u_int);
+void cpu_set_hatched(u_int);
 
 
 void	cpu_halt(void);
@@ -201,9 +198,9 @@ void	cpu_boot_secondary_processors(void)
 #ifdef MULTIPROCESSOR
 #define	CPU_IS_PRIMARY(ci)	((ci)->ci_flags & CPUF_PRIMARY)
 #define	CPU_INFO_FOREACH(cii, ci)		\
-    cii = 0, ci = &cpu_info_store[0]; 		\
-    ci != NULL; 				\
-    cii++, ncpu ? (ci = cpu_infos[cii]) 	\
+    cii = 0, ci = &cpu_info_store[0];		\
+    ci != NULL;					\
+    cii++, ncpu ? (ci = cpu_infos[cii])		\
 		: (ci = NULL)
 #else
 #define CPU_IS_PRIMARY(ci)	true

Index: src/sys/arch/riscv/include/intr.h
diff -u src/sys/arch/riscv/include/intr.h:1.4 src/sys/arch/riscv/include/intr.h:1.5
--- src/sys/arch/riscv/include/intr.h:1.4	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/include/intr.h	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.4 2023/06/12 19:04:14 skrll Exp $ */
+/* $NetBSD: intr.h,v 1.5 2023/09/03 08:48:20 skrll Exp $ */
 
 /*-
  * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
@@ -70,14 +70,12 @@
 
 #define	IPI_NOP		0		/* do nothing, interrupt only */
 #define	IPI_AST		1		/* force ast */
-#define	IPI_SHOOTDOWN	2		/* do a tlb shootdown */
-#define	IPI_SYNCICACHE	3		/* sync icache for pages */
-#define	IPI_KPREEMPT	4		/* schedule a kernel preemption */
-#define	IPI_SUSPEND	5		/* DDB suspend signaling */
-#define	IPI_HALT	6		/* halt cpu */
-#define	IPI_XCALL	7		/* xcall */
-#define	IPI_GENERIC	8		/* generic IPI */
-#define	NIPIS		9
+#define	IPI_KPREEMPT	2		/* schedule a kernel preemption */
+#define	IPI_SUSPEND	3		/* DDB suspend signaling */
+#define	IPI_HALT	4		/* halt cpu */
+#define	IPI_XCALL	5		/* xcall */
+#define	IPI_GENERIC	6		/* generic IPI */
+#define	NIPIS		7
 
 #ifdef __INTR_PRIVATE
 #if 0

Index: src/sys/arch/riscv/include/pmap.h
diff -u src/sys/arch/riscv/include/pmap.h:1.20 src/sys/arch/riscv/include/pmap.h:1.21
--- src/sys/arch/riscv/include/pmap.h:1.20	Sat Aug 12 07:48:11 2023
+++ src/sys/arch/riscv/include/pmap.h	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.20 2023/08/12 07:48:11 skrll Exp $ */
+/* $NetBSD: pmap.h,v 1.21 2023/09/03 08:48:20 skrll Exp $ */
 
 /*
  * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -80,7 +80,7 @@
 #define	KERNEL_PID	0
 
 #define	PMAP_HWPAGEWALKER		1
-#define	PMAP_TLB_MAX			MAXCPUS
+#define	PMAP_TLB_MAX			1
 #ifdef _LP64
 #define	PMAP_INVALID_PDETAB_ADDRESS	((pmap_pdetab_t *)(VM_MIN_KERNEL_ADDRESS - PAGE_SIZE))
 #define	PMAP_INVALID_SEGTAB_ADDRESS	((pmap_segtab_t *)(VM_MIN_KERNEL_ADDRESS - PAGE_SIZE))
@@ -90,9 +90,7 @@
 #endif
 #define	PMAP_TLB_NUM_PIDS		(__SHIFTOUT_MASK(SATP_ASID) + 1)
 #define	PMAP_TLB_BITMAP_LENGTH          PMAP_TLB_NUM_PIDS
-// Should use SBI TLB ops
-#define	PMAP_TLB_NEED_SHOOTDOWN		1
-#define	PMAP_TLB_FLUSH_ASID_ON_RESET	false
+#define	PMAP_TLB_FLUSH_ASID_ON_RESET	true
 
 #define	pmap_phys_address(x)		(x)
 

Index: src/sys/arch/riscv/riscv/cpu.c
diff -u src/sys/arch/riscv/riscv/cpu.c:1.4 src/sys/arch/riscv/riscv/cpu.c:1.5
--- src/sys/arch/riscv/riscv/cpu.c:1.4	Mon Aug 28 11:12:42 2023
+++ src/sys/arch/riscv/riscv/cpu.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.4 2023/08/28 11:12:42 skrll Exp $	*/
+/*	$NetBSD: cpu.c,v 1.5 2023/09/03 08:48:20 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.4 2023/08/28 11:12:42 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.5 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 
@@ -95,8 +95,7 @@ struct cpu_vendor {
 };
 
 /*
- * Our exported cpu_info structs; these will be first used by the
- * secondary cpus as part of cpu_mpstart and the hatching process.
+ * Our exported cpu_info structs; indexed by BP as 0 and APs [1, ncpu - 1]
  */
 struct cpu_info cpu_info_store[NCPUINFO] = {
 	[0] = {
@@ -109,7 +108,6 @@ struct cpu_info cpu_info_store[NCPUINFO]
 	}
 };
 
-
 /*
  * setup the per-cpu sysctl tree.
  */
@@ -177,14 +175,15 @@ cpu_identify(device_t self, struct cpu_i
 
 
 void
-cpu_attach(device_t dv, cpuid_t id)
+cpu_attach(device_t dv, cpuid_t hartid)
 {
-	const int unit = device_unit(dv);
 	struct cpu_info *ci;
 
-	if (unit == 0) {
+	/* Check for the BP */
+	if (hartid == cpu_bphartid) {
 		ci = curcpu();
-		ci->ci_cpuid = id;
+		KASSERTMSG(ci == &cpu_info_store[0], "ci %p", ci);
+		ci->ci_cpuid = hartid;
 	} else {
 #ifdef MULTIPROCESSOR
 		if ((boothowto & RB_MD1) != 0) {
@@ -193,14 +192,15 @@ cpu_attach(device_t dv, cpuid_t id)
 			return;
 		}
 
-		KASSERT(unit < MAXCPUS);
-		ci = &cpu_info_store[unit];
+		KASSERT(hartid < MAXCPUS);
+		KASSERT(cpu_hartindex[hartid] < MAXCPUS);
+
+		ci = &cpu_info_store[cpu_hartindex[hartid]];
 
 		ci->ci_cpl = IPL_HIGH;
-		ci->ci_cpuid = id;
-		/* ci_cpuid is stored by own cpus when hatching */
+		ci->ci_cpuid = hartid;
 
-		if (cpu_hatched_p(unit) == 0) {
+		if (!cpu_hatched_p(cpu_hartindex[hartid])) {
 			ci->ci_dev = dv;
 			device_set_private(dv, ci);
 			ci->ci_index = -1;
@@ -230,18 +230,11 @@ cpu_attach(device_t dv, cpuid_t id)
 	kcpuset_create(&ci->ci_watchcpus, true);
 	kcpuset_create(&ci->ci_ddbcpus, true);
 
-	if (unit != 0) {
+	if (hartid != cpu_bphartid) {
 		mi_cpu_attach(ci);
-		struct pmap_tlb_info *ti = kmem_zalloc(sizeof(*ti), KM_SLEEP);
-		pmap_tlb_info_init(ti);
-		pmap_tlb_info_attach(ti, ci);
 	}
 #endif /* MULTIPROCESSOR */
 	cpu_setup_sysctl(dv, ci);
-
-	if (unit != 0) {
-	    return;
-	}
 }
 
 #ifdef MULTIPROCESSOR
@@ -252,7 +245,7 @@ cpu_attach(device_t dv, cpuid_t id)
  *
  */
 void __noasan
-cpu_init_secondary_processor(int cpuindex)
+cpu_init_secondary_processor(u_int cpuindex)
 {
 	cpu_set_hatched(cpuindex);
 
@@ -267,14 +260,20 @@ cpu_init_secondary_processor(int cpuinde
  * of the idlelwp for this cpu.
  */
 void
-cpu_hatch(struct cpu_info *ci)
+cpu_hatch(struct cpu_info *ci, unsigned long cpuindex)
 {
 	KASSERT(curcpu() == ci);
 
+	// Show this CPU as present.
+	atomic_or_ulong(&ci->ci_flags, CPUF_PRESENT);
+
 	ci->ci_cpu_freq = riscv_timer_frequency_get();
 
 	riscv_timer_init();
 
+	kcpuset_set(cpus_hatched, cpu_index(ci));
+	kcpuset_set(cpus_running, cpu_index(ci));
+
 	/*
 	 * clear my bit of the mailbox to tell cpu_boot_secondary_processors().
 	 * Consider that if there are cpu0, 1, 2, 3, and cpu2 is unresponsive,
@@ -282,6 +281,6 @@ cpu_hatch(struct cpu_info *ci)
 	 * therefore we have to use device_unit instead of ci_index for mbox.
 	 */
 
-	cpu_clr_mbox(device_unit(ci->ci_dev));
+	cpu_clr_mbox(cpuindex);
 }
 #endif /* MULTIPROCESSOR */

Index: src/sys/arch/riscv/riscv/cpu_subr.c
diff -u src/sys/arch/riscv/riscv/cpu_subr.c:1.3 src/sys/arch/riscv/riscv/cpu_subr.c:1.4
--- src/sys/arch/riscv/riscv/cpu_subr.c:1.3	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/cpu_subr.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.3 2023/06/12 19:04:14 skrll Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.4 2023/09/03 08:48:20 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #include "opt_riscv_debug.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.3 2023/06/12 19:04:14 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.4 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -56,16 +56,12 @@ __KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v
 #define VPRINTF(...)	__nothing
 #endif
 
-#ifdef MULTIPROCESSOR
-#define NCPUINFO	MAXCPUS
-#else
-#define NCPUINFO	1
-#endif /* MULTIPROCESSOR */
-
-unsigned long cpu_hartid[NCPUINFO] = {
-	[0 ... NCPUINFO - 1] = ~0,
+unsigned int cpu_hartindex[MAXCPUS] = {
+	[0 ... MAXCPUS - 1] = ~0U,
 };
 
+cpuid_t cpu_bphartid = ~0UL;
+
 #ifdef MULTIPROCESSOR
 
 kcpuset_t *cpus_halted;
@@ -82,16 +78,17 @@ kcpuset_t *cpus_running;
 CTASSERT(N == 1);
 volatile u_long riscv_cpu_hatched[N] __cacheline_aligned = { };
 volatile u_long riscv_cpu_mbox[N] __cacheline_aligned = { };
-u_int riscv_cpu_max = 1;
 
 /* IPI all APs to GO! */
 static void
 cpu_ipi_aps(void)
 {
 	unsigned long hartmask = 0;
+
 	// BP is index 0
 	for (size_t i = 1; i < ncpu; i++) {
-		const cpuid_t hartid = cpu_hartid[i];
+		const struct cpu_info * const ci = &cpu_info_store[i];
+		const cpuid_t hartid = ci->ci_cpuid;
 		KASSERT(hartid < sizeof(unsigned long) * NBBY);
 		hartmask |= __BIT(hartid);
 	}
@@ -103,8 +100,6 @@ cpu_ipi_aps(void)
 void
 cpu_boot_secondary_processors(void)
 {
-	u_int cpuno;
-
 	if ((boothowto & RB_MD1) != 0)
 		return;
 
@@ -120,21 +115,25 @@ cpu_boot_secondary_processors(void)
 	cpu_ipi_aps();
 
 	/* wait for all cpus to have done cpu_hatch() */
-	for (cpuno = 1; cpuno < ncpu; cpuno++) {
-		if (!cpu_hatched_p(cpuno))
+	for (u_int cpuindex = 1; cpuindex < ncpu; cpuindex++) {
+		if (!cpu_hatched_p(cpuindex))
 			continue;
 
-		const size_t off = cpuno / CPUINDEX_DIVISOR;
-		const u_long bit = __BIT(cpuno % CPUINDEX_DIVISOR);
+		const size_t off = cpuindex / CPUINDEX_DIVISOR;
+		const u_long bit = __BIT(cpuindex % CPUINDEX_DIVISOR);
 
 		/* load-acquire matches cpu_clr_mbox */
 		while (atomic_load_acquire(&riscv_cpu_mbox[off]) & bit) {
 			/* spin - it shouldn't be long */
 			;
 		}
+		struct cpu_info *ci = &cpu_info_store[cpuindex];
+		atomic_or_ulong(&ci->ci_flags, CPUF_RUNNING);
+		kcpuset_set(cpus_running, cpu_index(ci));
 	}
 
-	VPRINTF("%s: secondary processors hatched\n", __func__);
+	VPRINTF("%s: secondary processors hatched. %d running\n", __func__,
+	    kcpuset_countset(cpus_running));
 }
 
 bool
@@ -149,7 +148,7 @@ cpu_hatched_p(u_int cpuindex)
 
 
 void
-cpu_set_hatched(int cpuindex)
+cpu_set_hatched(u_int cpuindex)
 {
 
 	const size_t off = cpuindex / CPUINDEX_DIVISOR;
@@ -163,7 +162,7 @@ cpu_set_hatched(int cpuindex)
 }
 
 void
-cpu_clr_mbox(int cpuindex)
+cpu_clr_mbox(u_int cpuindex)
 {
 
 	const size_t off = cpuindex / CPUINDEX_DIVISOR;
@@ -213,8 +212,7 @@ cpu_ipi_wait(const char *s, const kcpuse
 	kcpuset_t *kcp = ci->ci_watchcpus;
 
 	/* some finite amount of time */
-
-	for (u_long limit = curcpu()->ci_cpu_freq / 10; !done && limit--; ) {
+	for (u_long limit = curcpu()->ci_cpu_freq /* / 10 */; !done && limit--; ) {
 		kcpuset_copy(kcp, watchset);
 		kcpuset_intersect(kcp, wanted);
 		done = kcpuset_match(kcp, wanted);
@@ -288,7 +286,7 @@ cpu_halt_others(void)
  * Pause this cpu
  */
 void
-cpu_pause(void	)
+cpu_pause(void)
 {
 	const int s = splhigh();
 	cpuid_t cii = cpu_index(curcpu());
@@ -349,6 +347,7 @@ cpu_resume(cpuid_t cii)
 	struct cpu_info * const ci = curcpu();
 	kcpuset_t *kcp = ci->ci_ddbcpus;
 
+	kcpuset_zero(kcp);
 	kcpuset_set(kcp, cii);
 	kcpuset_atomicly_remove(cpus_resumed, cpus_resumed);
 	kcpuset_atomic_clear(cpus_paused, cii);
@@ -391,20 +390,21 @@ cpu_debug_dump(void)
 	CPU_INFO_ITERATOR cii;
 	struct cpu_info *ci;
 	char running, hatched, paused, resumed, halted;
-	db_printf("CPU CPUID STATE CPUINFO            CPL INT MTX IPIS(A/R)\n");
+	db_printf("CPU CPUID  STATE CPUINFO            CPL INT MTX IPIS(A/R)\n");
 	for (CPU_INFO_FOREACH(cii, ci)) {
 		hatched = (kcpuset_isset(cpus_hatched, cpu_index(ci)) ? 'H' : '-');
 		running = (kcpuset_isset(cpus_running, cpu_index(ci)) ? 'R' : '-');
 		paused  = (kcpuset_isset(cpus_paused,  cpu_index(ci)) ? 'P' : '-');
 		resumed = (kcpuset_isset(cpus_resumed, cpu_index(ci)) ? 'r' : '-');
 		halted  = (kcpuset_isset(cpus_halted,  cpu_index(ci)) ? 'h' : '-');
-		db_printf("%3d 0x%03lx %c%c%c%c%c %p "
-			"%3d %3d %3d "
-			"0x%02lx/0x%02lx\n",
-			cpu_index(ci), ci->ci_cpuid,
-			running, hatched, paused, resumed, halted,
-			ci, ci->ci_cpl, ci->ci_intr_depth, ci->ci_mtx_count,
-			ci->ci_active_ipis, ci->ci_request_ipis);
+		db_printf("%3d 0x%03lx%c%c%c%c%c%c%c %p "
+		    "%3d %3d %3d 0x%02lx/0x%02lx\n",
+		    cpu_index(ci), ci->ci_cpuid,
+		    ci == curcpu() ? '<' : ' ',
+		    CPU_IS_PRIMARY(ci) ? '*' : ' ',
+		    hatched, running, paused, resumed, halted,
+		    ci, ci->ci_cpl, ci->ci_intr_depth, ci->ci_mtx_count,
+		    ci->ci_active_ipis, ci->ci_request_ipis);
 	}
 }
 #endif
Index: src/sys/arch/riscv/riscv/db_interface.c
diff -u src/sys/arch/riscv/riscv/db_interface.c:1.3 src/sys/arch/riscv/riscv/db_interface.c:1.4
--- src/sys/arch/riscv/riscv/db_interface.c:1.3	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/db_interface.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_interface.c,v 1.3 2023/06/12 19:04:14 skrll Exp $	*/
+/*	$NetBSD: db_interface.c,v 1.4 2023/09/03 08:48:20 skrll Exp $	*/
 
 /*
  * Mach Operating System
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.3 2023/06/12 19:04:14 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.4 2023/09/03 08:48:20 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_multiprocessor.h"
@@ -107,10 +107,11 @@ kdb_trap(int type, db_regs_t *regs)
 	}
 
 	s = splhigh();
+	struct cpu_info * const ci = curcpu();
 
 #if defined(MULTIPROCESSOR)
 	bool first_in_ddb = false;
-	const u_int cpu_me = cpu_number();
+	const u_int cpu_me = cpu_index(ci);
 	const u_int old_ddb_cpu = atomic_cas_uint(&ddb_cpu, NOCPU, cpu_me);
 	if (old_ddb_cpu == NOCPU) {
 		first_in_ddb = true;
@@ -125,7 +126,6 @@ kdb_trap(int type, db_regs_t *regs)
 	}
 	KASSERT(!cpu_is_paused(cpu_me));
 #endif
-	struct cpu_info * const ci = curcpu();
 
 	ddb_regs = *regs;
 	ci->ci_ddb_regs = &ddb_regs;
@@ -201,7 +201,7 @@ const struct db_command db_machine_comma
 bool
 ddb_running_on_this_cpu_p(void)
 {
-	return ddb_cpu == cpu_number();
+	return ddb_cpu == cpu_index(curcpu());
 }
 
 bool
@@ -213,7 +213,7 @@ ddb_running_on_any_cpu_p(void)
 void
 db_resume_others(void)
 {
-	u_int cpu_me = cpu_number();
+	u_int cpu_me = cpu_index(curcpu());
 
 	if (atomic_cas_uint(&ddb_cpu, cpu_me, NOCPU) == cpu_me)
 		cpu_resume_others();
@@ -242,7 +242,7 @@ db_mach_cpu_cmd(db_expr_t addr, bool hav
 			db_printf("CPU %ld not paused\n", (long)addr);
 			return;
 		}
-		(void)atomic_cas_uint(&ddb_cpu, cpu_number(), cpu_index(ci));
+		(void)atomic_cas_uint(&ddb_cpu, cpu_index(curcpu()), cpu_index(ci));
 		db_continue_cmd(0, false, 0, "");
 	}
 }

Index: src/sys/arch/riscv/riscv/ipifuncs.c
diff -u src/sys/arch/riscv/riscv/ipifuncs.c:1.1 src/sys/arch/riscv/riscv/ipifuncs.c:1.2
--- src/sys/arch/riscv/riscv/ipifuncs.c:1.1	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/ipifuncs.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipifuncs.c,v 1.1 2023/06/12 19:04:14 skrll Exp $	*/
+/*	$NetBSD: ipifuncs.c,v 1.2 2023/09/03 08:48:20 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.1 2023/06/12 19:04:14 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.2 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 
@@ -49,8 +49,6 @@ static void ipi_halt(void) __dead;
 static const char * const ipi_names[] = {
 	[IPI_NOP]	= "ipi nop",
 	[IPI_AST]	= "ipi ast",
-	[IPI_SHOOTDOWN]	= "ipi shootdown",
-	[IPI_SYNCICACHE]= "ipi isync",
 	[IPI_KPREEMPT]	= "ipi kpreempt",
 	[IPI_SUSPEND]	= "ipi suspend",
 	[IPI_HALT]	= "ipi halt",
@@ -73,18 +71,6 @@ ipi_ast(struct cpu_info *ci)
 	ci->ci_onproc->l_md.md_astpending = 1;
 }
 
-static void
-ipi_shootdown(struct cpu_info *ci)
-{
-	pmap_tlb_shootdown_process();
-}
-
-static inline void
-ipi_syncicache(struct cpu_info *ci)
-{
-	pmap_tlb_syncicache_wanted(ci);
-}
-
 #ifdef __HAVE_PREEMPTION
 static inline void
 ipi_kpreempt(struct cpu_info *ci)
@@ -100,7 +86,7 @@ ipi_kpreempt(struct cpu_info *ci)
 static void
 ipi_halt(void)
 {
-	const u_int my_cpu = cpu_number();
+	const u_int my_cpu = cpu_index(curcpu());
 	printf("cpu%u: shutting down\n", my_cpu);
 	kcpuset_set(cpus_halted, my_cpu);
 	splhigh();
@@ -122,14 +108,6 @@ ipi_process(struct cpu_info *ci, unsigne
 		ci->ci_evcnt_per_ipi[IPI_AST].ev_count++;
 		ipi_ast(ci);
 	}
-	if (ipi_mask & __BIT(IPI_SHOOTDOWN)) {
-		ci->ci_evcnt_per_ipi[IPI_SHOOTDOWN].ev_count++;
-		ipi_shootdown(ci);
-	}
-	if (ipi_mask & __BIT(IPI_SYNCICACHE)) {
-		ci->ci_evcnt_per_ipi[IPI_SYNCICACHE].ev_count++;
-		ipi_syncicache(ci);
-	}
 	if (ipi_mask & __BIT(IPI_SUSPEND)) {
 		ci->ci_evcnt_per_ipi[IPI_SUSPEND].ev_count++;
 		cpu_pause();
Index: src/sys/arch/riscv/riscv/riscv_tlb.c
diff -u src/sys/arch/riscv/riscv/riscv_tlb.c:1.1 src/sys/arch/riscv/riscv/riscv_tlb.c:1.2
--- src/sys/arch/riscv/riscv/riscv_tlb.c:1.1	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/riscv_tlb.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: riscv_tlb.c,v 1.1 2023/06/12 19:04:14 skrll Exp $ */
+/* $NetBSD: riscv_tlb.c,v 1.2 2023/09/03 08:48:20 skrll Exp $ */
 
 /*
  * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -34,12 +34,16 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: riscv_tlb.c,v 1.1 2023/06/12 19:04:14 skrll Exp $");
+__RCSID("$NetBSD: riscv_tlb.c,v 1.2 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
 
-#include <uvm/uvm.h>
+#include <sys/cpu.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <riscv/sbi.h>
 
 tlb_asid_t
 tlb_get_asid(void)
@@ -71,13 +75,39 @@ tlb_invalidate_globals(void)
 void
 tlb_invalidate_asids(tlb_asid_t lo, tlb_asid_t hi)
 {
-	for (; lo <= hi; lo++) {
+	tlb_asid_t asid;
+	for (asid = lo; asid <= hi; asid++) {
 		asm volatile("sfence.vma zero, %[asid]"
 		    : /* output operands */
-		    : [asid] "r" (lo)
+		    : [asid] "r" (asid)
 		    : "memory");
 	}
+#ifdef MULTIPROCESSOR
+#if PMAP_TLB_MAX == 1
+	const cpuid_t myhartid = curcpu()->ci_cpuid;
+	unsigned long hartmask = 0;
+	struct cpu_info *ci;
+	CPU_INFO_ITERATOR cii;
+	for (CPU_INFO_FOREACH(cii, ci)) {
+		const cpuid_t hartid = ci->ci_cpuid;
+
+		if (hartid == myhartid)
+			continue;
+
+		KASSERT(hartid < sizeof(unsigned long) * NBBY);
+		hartmask |= __BIT(hartid);
+	}
+	for (asid = lo; asid <= hi; asid++) {
+		struct sbiret sbiret = sbi_remote_sfence_vma_asid(hartmask,
+		    0 /* hartmask_base */, 0, ~0UL, asid);
+
+		KASSERTMSG(sbiret.error == SBI_SUCCESS, "error %ld",
+		    sbiret.error);
+	}
+#endif
+#endif
 }
+
 void
 tlb_invalidate_addr(vaddr_t va, tlb_asid_t asid)
 {
@@ -92,22 +122,36 @@ tlb_invalidate_addr(vaddr_t va, tlb_asid
 		    : [va] "r" (va), [asid] "r" (asid)
 		    : "memory");
 	}
+#ifdef MULTIPROCESSOR
+#if PMAP_TLB_MAX == 1
+	const cpuid_t myhartid = curcpu()->ci_cpuid;
+	unsigned long hartmask = 0;
+	struct cpu_info *ci;
+	CPU_INFO_ITERATOR cii;
+	for (CPU_INFO_FOREACH(cii, ci)) {
+		const cpuid_t hartid = ci->ci_cpuid;
+		if (hartid == myhartid)
+			continue;
+
+		KASSERT(hartid < sizeof(unsigned long) * NBBY);
+		hartmask |= __BIT(hartid);
+	}
+	struct sbiret sbiret = sbi_remote_sfence_vma(hartmask,
+	    0 /* hartmask_base */, va, PAGE_SIZE);
+
+	KASSERTMSG(sbiret.error == SBI_SUCCESS, "error %ld",
+	    sbiret.error);
+#endif
+#endif
 }
 
 bool
 tlb_update_addr(vaddr_t va, tlb_asid_t asid, pt_entry_t pte, bool insert_p)
 {
-	if (asid == KERNEL_PID) {
-		asm volatile("sfence.vma %[va]"
-		    : /* output operands */
-		    : [va] "r" (va)
-		    : "memory");
-	} else {
-		asm volatile("sfence.vma %[va], %[asid]"
-		    : /* output operands */
-		    : [va] "r" (va), [asid] "r" (asid)
-		    : "memory");
-	}
+	KASSERT((va & PAGE_MASK) == 0);
+
+	tlb_invalidate_addr(va, asid);
+
 	return true;
 }
 

Index: src/sys/arch/riscv/riscv/locore.S
diff -u src/sys/arch/riscv/riscv/locore.S:1.42 src/sys/arch/riscv/riscv/locore.S:1.43
--- src/sys/arch/riscv/riscv/locore.S:1.42	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/locore.S	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.42 2023/06/12 19:04:14 skrll Exp $ */
+/* $NetBSD: locore.S,v 1.43 2023/09/03 08:48:20 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014, 2022 The NetBSD Foundation, Inc.
@@ -316,7 +316,6 @@ vstart:
 
 	PTR_LA	tp, _C_LABEL(lwp0)	// put curlwp in tp
 
-
 	/* Set supervisor trap vector base register */
 	PTR_LA	a0, _C_LABEL(cpu_exception_handler)
 	csrw	stvec, a0
@@ -379,30 +378,12 @@ ENTRY(cpu_mpstart)
 	mv	s11, a1			// copy sbi_hart_start cookie
 
 	/*
-	 * resolve our cpuindex. each hartid is stored in
-	 * extern unsigned long cpu_hartid[MAXCPUS]
-	 */
-	PTR_LA	t0, _C_LABEL(cpu_hartid)
-	li	t6, MAXCPUS
-	li	t1, 0
-1:
-	addi	t1, t1, 1
-	bgeu	t1, t6, toomanyharts	/* cpuindex >= MAXCPUS ? */
-
-	slli	t2, t1, LONG_SCALESHIFT
-	add	t2, t0, t2
-	LONG_L	t3, 0(t2)		/* cpu_hartid[cpuindex] */
-	bne	t3, s10, 1b
-
-	mv	s9, t1			/* s9 = cpuindex */
-
-	/*
-	 * s9 = cpuindex
+	 * s11 = cpuindex
 	 */
 
 	/* set stack pointer for boot */
 	li	t1, BOOT_AP_STACKSIZE		// XXXNH do a shift
-	mul	t1, s9, t1
+	mul	t1, s11, t1
 	PTR_LA	t0, _C_LABEL(bootstk)
 	/* sp = bootstk + (BOOT_AP_STACKSIZE * cpuindex) */
 	add	sp, t0, t1
@@ -465,17 +446,17 @@ vmpstart:
 	csrsi	sstatus, SR_SIE		// enable interrupts
 
 	li	tp, 0
-	mv	a0, s9
+	mv	a0, s11
 	call	_C_LABEL(cpu_init_secondary_processor)
 
 	/* t3 = __BIT(cpuindex % (sizeof(u_long) * NBBY)) */
 	li	t3, 1
-	andi	t0, s9, (1U << (LONG_SCALESHIFT + NBBY_SHIFT)) - 1
+	andi	t0, s11, (1U << (LONG_SCALESHIFT + NBBY_SHIFT)) - 1
 	sll	t3, t3, t0
 
 	/* t4 = &riscv_cpu_mbox[cpuindex / (sizeof(u_long) * NBBY)] */
 	PTR_LA	t0, _C_LABEL(riscv_cpu_mbox)
-	srli	t1, s9, LONG_SCALESHIFT + NBBY_SHIFT
+	srli	t1, s11, LONG_SCALESHIFT + NBBY_SHIFT
 	slli	t1, t1, LONG_SCALESHIFT
 	add	t4, t0, t1
 
@@ -494,7 +475,7 @@ vmpstart:
 	csrw	stvec, a0
 
 	li	t0, CI_SIZE
-	mul	t0, s9, t0
+	mul	t0, s11, t0
 	PTR_LA	t1, _C_LABEL(cpu_info_store)
 	add	a0, t0, t1		/* a0 = &cpu_info_store[cpuindex] */
 
@@ -513,6 +494,7 @@ vmpstart:
 
 	li	s0, 0			/* trace back starts here (fp = 0) */
 	PTR_L	a0, L_CPU(tp)		/* curlwp->l_cpu */
+	mv	a1, s11			/* cpuindex */
 	call	_C_LABEL(cpu_hatch)
 
 	li	s0, 0			// zero frame pointer
@@ -618,7 +600,6 @@ cpu_Debugger_ret:
 	ret
 END(cpu_Debugger)
 
-#if defined(VERBOSE_INIT_RISCV)
 ENTRY_NP(locore_prints)
 	addi	sp, sp, -(SZREG * 2)
 	REG_S	s0, (0 * SZREG)(sp)
@@ -642,6 +623,7 @@ ENTRY_NP(locore_prints)
 END(locore_prints)
 
 
+#if defined(VERBOSE_INIT_RISCV)
 ENTRY_NP(locore_printx)
 	addi	sp, sp, -(SZREG * 4)
 	REG_S	s0, (0 * SZREG)(sp)

Index: src/sys/arch/riscv/riscv/pmap_machdep.c
diff -u src/sys/arch/riscv/riscv/pmap_machdep.c:1.18 src/sys/arch/riscv/riscv/pmap_machdep.c:1.19
--- src/sys/arch/riscv/riscv/pmap_machdep.c:1.18	Mon Jun 12 19:04:14 2023
+++ src/sys/arch/riscv/riscv/pmap_machdep.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_machdep.c,v 1.18 2023/06/12 19:04:14 skrll Exp $ */
+/* $NetBSD: pmap_machdep.c,v 1.19 2023/09/03 08:48:20 skrll Exp $ */
 
 /*
  * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -36,10 +36,11 @@
 #define	__PMAP_PRIVATE
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pmap_machdep.c,v 1.18 2023/06/12 19:04:14 skrll Exp $");
+__RCSID("$NetBSD: pmap_machdep.c,v 1.19 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
+#include <sys/cpu.h>
 
 #include <uvm/uvm.h>
 
@@ -175,7 +176,7 @@ pmap_md_xtab_activate(struct pmap *pmap,
 {
 //	UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
 
-	struct cpu_info * const ci = curcpu();
+//	struct cpu_info * const ci = curcpu();
 	struct pmap_asid_info * const pai = PMAP_PAI(pmap, cpu_tlb_info(ci));
 
 	uint64_t satp =
@@ -335,8 +336,9 @@ pmap_bootstrap(vaddr_t vstart, vaddr_t v
 	kcpuset_create(&pm->pm_active, true);
 	KASSERT(pm->pm_onproc != NULL);
 	KASSERT(pm->pm_active != NULL);
-	kcpuset_set(pm->pm_onproc, cpu_number());
-	kcpuset_set(pm->pm_active, cpu_number());
+
+	kcpuset_set(pm->pm_onproc, cpu_index(ci));
+	kcpuset_set(pm->pm_active, cpu_index(ci));
 #endif
 
 	VPRINTF("nkmempages ");

Index: src/sys/arch/riscv/riscv/riscv_machdep.c
diff -u src/sys/arch/riscv/riscv/riscv_machdep.c:1.33 src/sys/arch/riscv/riscv/riscv_machdep.c:1.34
--- src/sys/arch/riscv/riscv/riscv_machdep.c:1.33	Thu Aug 24 05:46:55 2023
+++ src/sys/arch/riscv/riscv/riscv_machdep.c	Sun Sep  3 08:48:20 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: riscv_machdep.c,v 1.33 2023/08/24 05:46:55 rin Exp $	*/
+/*	$NetBSD: riscv_machdep.c,v 1.34 2023/09/03 08:48:20 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2014, 2019, 2022 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 #include "opt_riscv_debug.h"
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: riscv_machdep.c,v 1.33 2023/08/24 05:46:55 rin Exp $");
+__RCSID("$NetBSD: riscv_machdep.c,v 1.34 2023/09/03 08:48:20 skrll Exp $");
 
 #include <sys/param.h>
 
@@ -536,8 +536,8 @@ cpu_startup(void)
 	kcpuset_create(&cpus_running, true);
 	KASSERT(cpus_running != NULL);
 
-	kcpuset_set(cpus_hatched, cpu_number());
-	kcpuset_set(cpus_running, cpu_number());
+	kcpuset_set(cpus_hatched, cpu_index(curcpu()));
+	kcpuset_set(cpus_running, cpu_index(curcpu()));
 #endif
 
 	fdtbus_intr_init();

Reply via email to