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))) {