Module Name:    src
Committed By:   matt
Date:           Fri Dec 16 23:15:39 UTC 2011

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: pmap.c

Log Message:
Fix a bug spotted by a user (resident flag becoming stale).
Add a few more KSEGX tests.
Only set pmap_page_colormask if virtual caches aliases are possible.


To generate a diff of this commit:
cvs rdiff -u -r1.179.16.33 -r1.179.16.34 src/sys/arch/mips/mips/pmap.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/mips/pmap.c
diff -u src/sys/arch/mips/mips/pmap.c:1.179.16.33 src/sys/arch/mips/mips/pmap.c:1.179.16.34
--- src/sys/arch/mips/mips/pmap.c:1.179.16.33	Thu Dec  1 23:53:54 2011
+++ src/sys/arch/mips/mips/pmap.c	Fri Dec 16 23:15:39 2011
@@ -412,6 +412,10 @@ pmap_map_ephemeral_page(struct vm_page *
 	vaddr_t va;
 	if (pa <= MIPS_PHYS_MASK) {
 		va = MIPS_PHYS_TO_KSEG0(pa);
+#ifdef ENABLE_MIPS_KSEGX
+	} else if (mips_ksegx_start <= pa && pa < mips_ksegx_start + VM_KSEGX_SIZE) {
+		va = VM_KSEGX_ADDRESS + pa - mips_ksegx_start;
+#endif
 	} else {
 		KASSERT(pmap_initialized);
 		/*
@@ -468,6 +472,11 @@ pmap_unmap_ephemeral_page(struct vm_page
 	/*
 	 * If we had to map using a page table entry, unmap it now.
 	 */
+#ifdef ENABLE_MIPS_KSEGX
+	if (VM_KSEGX_ADDRESS <= va && va < VM_KSEGX_ADDRESS + VM_KSEGX_SIZE)
+		return;
+#endif
+
 	if (va >= VM_MIN_KERNEL_ADDRESS) {
 		pmap_kremove(va, PAGE_SIZE);
 		if (mips_pg_v(old_pt_entry.pt_entry)) {
@@ -489,7 +498,7 @@ pmap_bootstrap(void)
 {
 	vsize_t bufsz;
 
-	if (uvmexp.ncolors)
+	if (MIPS_CACHE_VIRTUAL_ALIAS && uvmexp.ncolors)
 		pmap_page_colormask = (uvmexp.ncolors - 1) << PAGE_SHIFT;
 
 	pmap_tlb_info_init(&pmap_tlb0_info);		/* init the lock */
@@ -1569,20 +1578,21 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
 			pmap->pm_stats.wired_count++;
 			npte |= mips_pg_wired_bit();
 		}
-		if (mips_pg_v(pte->pt_entry)
-		    && mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
-			pmap_remove(pmap, va, va + NBPG);
-			PMAP_COUNT(kernel_mappings_changed);
-		}
-		bool resident = mips_pg_v(pte->pt_entry);
-		if (!resident)
+		const bool resident_p = mips_pg_v(pte->pt_entry);
+		if (resident_p) {
+			if (mips_tlbpfn_to_paddr(pte->pt_entry) != pa) {
+				pmap_remove(pmap, va, va + NBPG);
+				PMAP_COUNT(kernel_mappings_changed);
+			}
+		} else {
 			pmap->pm_stats.resident_count++;
+		}
 		pte->pt_entry = npte;
 
 		/*
 		 * Update the same virtual address entry.
 		 */
-		pmap_tlb_update_addr(pmap, va, npte, resident);
+		pmap_tlb_update_addr(pmap, va, npte, resident_p);
 		kpreempt_enable();
 		return 0;
 	}
@@ -1645,8 +1655,8 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
 	}
 
 	KASSERT(mips_pg_v(npte));
-	bool resident = mips_pg_v(pte->pt_entry);
-	if (!resident)
+	const bool resident_p = mips_pg_v(pte->pt_entry);
+	if (!resident_p)
 		pmap->pm_stats.resident_count++;
 #ifdef PMAP_FAULTINFO
 	if (curpcb->pcb_faultinfo.pfi_faultpte == pte
@@ -1658,7 +1668,7 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd
 #endif
 	pte->pt_entry = npte;
 
-	pmap_tlb_update_addr(pmap, va, npte, resident);
+	pmap_tlb_update_addr(pmap, va, npte, resident_p);
 	kpreempt_enable();
 
 	if (pg != NULL && (prot == (VM_PROT_READ | VM_PROT_EXECUTE))) {

Reply via email to