Module Name:    src
Committed By:   skrll
Date:           Mon Jan  1 17:18:02 UTC 2024

Modified Files:
        src/sys/arch/riscv/include: pmap.h
        src/sys/arch/riscv/riscv: pmap_machdep.c

Log Message:
risc-v: probe the number of supported ASIDs

Flush the entire TLB if no ASIDs are supported on pmap_activate.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/riscv/include/pmap.h
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/riscv/riscv/pmap_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/include/pmap.h
diff -u src/sys/arch/riscv/include/pmap.h:1.22 src/sys/arch/riscv/include/pmap.h:1.23
--- src/sys/arch/riscv/include/pmap.h:1.22	Fri Oct  6 08:48:49 2023
+++ src/sys/arch/riscv/include/pmap.h	Mon Jan  1 17:18:02 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.22 2023/10/06 08:48:49 skrll Exp $ */
+/* $NetBSD: pmap.h,v 1.23 2024/01/01 17:18:02 skrll Exp $ */
 
 /*
  * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -217,7 +217,16 @@ pmap_md_vca_clean(struct vm_page_md *mdp
 static inline size_t
 pmap_md_tlb_asid_max(void)
 {
-	return PMAP_TLB_NUM_PIDS - 1;
+	const register_t satp = csr_satp_read();
+	const register_t test = satp | SATP_ASID;
+
+	csr_satp_write(test);
+
+	const register_t ret = __SHIFTOUT(csr_satp_read(), SATP_ASID);
+	csr_satp_write(satp);
+
+	KASSERT(ret < PMAP_TLB_NUM_PIDS);
+	return ret;
 }
 
 static inline pt_entry_t *

Index: src/sys/arch/riscv/riscv/pmap_machdep.c
diff -u src/sys/arch/riscv/riscv/pmap_machdep.c:1.19 src/sys/arch/riscv/riscv/pmap_machdep.c:1.20
--- src/sys/arch/riscv/riscv/pmap_machdep.c:1.19	Sun Sep  3 08:48:20 2023
+++ src/sys/arch/riscv/riscv/pmap_machdep.c	Mon Jan  1 17:18:02 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_machdep.c,v 1.19 2023/09/03 08:48:20 skrll Exp $ */
+/* $NetBSD: pmap_machdep.c,v 1.20 2024/01/01 17:18:02 skrll Exp $ */
 
 /*
  * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #define	__PMAP_PRIVATE
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pmap_machdep.c,v 1.19 2023/09/03 08:48:20 skrll Exp $");
+__RCSID("$NetBSD: pmap_machdep.c,v 1.20 2024/01/01 17:18:02 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -177,7 +177,8 @@ pmap_md_xtab_activate(struct pmap *pmap,
 //	UVMHIST_FUNC(__func__); UVMHIST_CALLED(maphist);
 
 //	struct cpu_info * const ci = curcpu();
-	struct pmap_asid_info * const pai = PMAP_PAI(pmap, cpu_tlb_info(ci));
+	struct pmap_tlb_info * const ti = cpu_tlb_info(ci);
+	struct pmap_asid_info * const pai = PMAP_PAI(pmap, ti);
 
 	uint64_t satp =
 #ifdef _LP64
@@ -189,6 +190,10 @@ pmap_md_xtab_activate(struct pmap *pmap,
 	    __SHIFTIN(pmap->pm_md.md_ppn, SATP_PPN);
 
 	csr_satp_write(satp);
+
+	if (l && !tlbinfo_asids_p(ti)) {
+		tlb_invalidate_all();
+	}
 }
 
 void
@@ -329,6 +334,8 @@ pmap_bootstrap(vaddr_t vstart, vaddr_t v
 	// XXXNH per cpu?
 	pmap_tlb_info_init(&pmap_tlb0_info);
 
+	VPRINTF("ASID max %x ", pmap_tlb0_info.ti_asid_max);
+
 #ifdef MULTIPROCESSOR
 	VPRINTF("kcpusets ");
 

Reply via email to