Module Name:    src
Committed By:   jdolecek
Date:           Wed Feb 21 21:53:54 UTC 2018

Modified Files:
        src/sys/uvm/pmap: pmap_tlb.c

Log Message:
KERNEL_PID is > 0 on powerpc/ibm4xx, need to mask all bits <0,
KERNEL_PID> to avoid triggering KASSERT() checking allocated asid
is bigger than KERNEL_PID; adjust also TLBINFO_ASID_INITIAL_FREE()
accordingly

discussed with Nick


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/uvm/pmap/pmap_tlb.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/uvm/pmap/pmap_tlb.c
diff -u src/sys/uvm/pmap/pmap_tlb.c:1.25 src/sys/uvm/pmap/pmap_tlb.c:1.26
--- src/sys/uvm/pmap/pmap_tlb.c:1.25	Mon Feb 19 22:01:15 2018
+++ src/sys/uvm/pmap/pmap_tlb.c	Wed Feb 21 21:53:54 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_tlb.c,v 1.25 2018/02/19 22:01:15 jdolecek Exp $	*/
+/*	$NetBSD: pmap_tlb.c,v 1.26 2018/02/21 21:53:54 jdolecek Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.25 2018/02/19 22:01:15 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.26 2018/02/21 21:53:54 jdolecek Exp $");
 
 /*
  * Manages address spaces in a TLB.
@@ -144,14 +144,30 @@ static kmutex_t pmap_tlb0_lock __cacheli
 #error "KERNEL_PID expected in range 0-31"
 #endif
 
+#define	TLBINFO_ASID_MARK_UNUSED(ti, asid) \
+	__BITMAP_CLR((asid), &(ti)->ti_asid_bitmap)
+#define	TLBINFO_ASID_MARK_USED(ti, asid) \
+	__BITMAP_SET((asid), &(ti)->ti_asid_bitmap)
+#define	TLBINFO_ASID_INUSE_P(ti, asid) \
+	__BITMAP_ISSET((asid), &(ti)->ti_asid_bitmap)
+#define	TLBINFO_ASID_RESET(ti) \
+	do {								\
+		__BITMAP_ZERO(&ti->ti_asid_bitmap);			\
+		for (tlb_asid_t asid = 0; asid <= KERNEL_PID; asid++) 	\
+			TLBINFO_ASID_MARK_USED(ti, asid);	 	\
+	} while (0)
+#define	TLBINFO_ASID_INITIAL_FREE(asid_max) \
+	(asid_max + 1 /* 0 */ - (1 + KERNEL_PID))
+
 struct pmap_tlb_info pmap_tlb0_info = {
 	.ti_name = "tlb0",
 	.ti_asid_hint = KERNEL_PID + 1,
 #ifdef PMAP_TLB_NUM_PIDS
 	.ti_asid_max = IFCONSTANT(PMAP_TLB_NUM_PIDS - 1),
-	.ti_asids_free = IFCONSTANT(PMAP_TLB_NUM_PIDS - (1 + KERNEL_PID)),
+	.ti_asids_free = IFCONSTANT(
+		TLBINFO_ASID_INITIAL_FREE(PMAP_TLB_NUM_PIDS - 1)),
 #endif
-	.ti_asid_bitmap._b[0] = __BIT(KERNEL_PID),
+	.ti_asid_bitmap._b[0] = __BITS(0, KERNEL_PID),
 #ifdef PMAP_TLB_WIRED_UPAGES
 	.ti_wired = PMAP_TLB_WIRED_UPAGES,
 #endif
@@ -171,20 +187,6 @@ struct pmap_tlb_info *pmap_tlbs[PMAP_TLB
 u_int pmap_ntlbs = 1;
 #endif
 
-#define	TLBINFO_ASID_MARK_UNUSED(ti, asid) \
-	__BITMAP_CLR((asid), &(ti)->ti_asid_bitmap)
-#define	TLBINFO_ASID_MARK_USED(ti, asid) \
-	__BITMAP_SET((asid), &(ti)->ti_asid_bitmap)
-#define	TLBINFO_ASID_INUSE_P(ti, asid) \
-	__BITMAP_ISSET((asid), &(ti)->ti_asid_bitmap)
-#define	TLBINFO_ASID_RESET(ti) \
-	do {						\
-		__BITMAP_ZERO(&ti->ti_asid_bitmap);	\
-		TLBINFO_ASID_MARK_USED(ti, KERNEL_PID); \
-	} while (0)
-#define	TLBINFO_ASID_INITIAL_FREE(ti) \
-	((ti)->ti_asid_max + 1 /* 0 */ - 1 /* reserved KERNEL_PID */)
-
 #ifdef MULTIPROCESSOR
 __unused static inline bool
 pmap_tlb_intersecting_active_p(pmap_t pm, struct pmap_tlb_info *ti)
@@ -338,10 +340,10 @@ pmap_tlb_info_init(struct pmap_tlb_info 
 		KASSERT(pmap_tlbs[pmap_ntlbs] == NULL);
 
 		ti->ti_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_SCHED);
-		TLBINFO_ASID_MARK_USED(ti, KERNEL_PID);
+		TLBINFO_ASID_RESET(ti);
 		ti->ti_asid_hint = KERNEL_PID + 1;
 		ti->ti_asid_max = pmap_tlbs[0]->ti_asid_max;
-		ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti);
+		ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti->ti_asid_max);
 		ti->ti_tlbinvop = TLBINV_NOBODY;
 		ti->ti_victim = NULL;
 		kcpuset_create(&ti->ti_kcpuset, true);
@@ -368,7 +370,7 @@ pmap_tlb_info_init(struct pmap_tlb_info 
 	//printf("asid ");
 	if (ti->ti_asid_max == 0) {
 		ti->ti_asid_max = pmap_md_tlb_asid_max();
-		ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti);
+		ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti->ti_asid_max);
 	}
 
 	KASSERT(ti->ti_asid_max < PMAP_TLB_BITMAP_LENGTH);
@@ -427,7 +429,7 @@ pmap_tlb_asid_reinitialize(struct pmap_t
 	 * First, clear the ASID bitmap (except for ASID 0 which belongs
 	 * to the kernel).
 	 */
-	ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti);
+	ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti->ti_asid_max);
 	ti->ti_asid_hint = KERNEL_PID + 1;
 	TLBINFO_ASID_RESET(ti);
 
@@ -471,7 +473,8 @@ pmap_tlb_asid_reinitialize(struct pmap_t
 			tlb_invalidate_all();
 #endif /* MULTIPROCESSOR && !PMAP_TLB_NEED_SHOOTDOWN */
 			TLBINFO_ASID_RESET(ti);
-			ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(ti);
+			ti->ti_asids_free = TLBINFO_ASID_INITIAL_FREE(
+				ti->ti_asid_max);
 #if !defined(MULTIPROCESSOR) || defined(PMAP_TLB_NEED_SHOOTDOWN)
 		} else {
 			ti->ti_asids_free -= asids_found;

Reply via email to