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