diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index e04857b2dde..4c5ea7491e2 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -791,24 +791,25 @@ pmap_extract(pmap_t pmap, vm_offset_t va) vm_page_t pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) { - pt_entry_t *ptep; - pt_entry_t pte; + pt_entry_t pte, *ptep; + vm_paddr_t pa, pte_pa; vm_page_t m; - vm_paddr_t pa; m = NULL; pa = 0; PMAP_LOCK(pmap); retry: ptep = pmap_pte(pmap, va); - if ((ptep != NULL) && ((pte = *ptep) != 0) && - pte_test(&pte, PTE_V) && - (pte_test(&pte, PTE_D) || (prot & VM_PROT_WRITE) == 0)) { - if (vm_page_pa_tryrelock(pmap, TLBLO_PTE_TO_PA(pte), &pa)) - goto retry; - - m = PHYS_TO_VM_PAGE(TLBLO_PTE_TO_PA(pte)); - vm_page_hold(m); + if (ptep != NULL) { + pte = *ptep; + if (pte_test(&pte, PTE_V) && (!pte_test(&pte, PTE_RO) || + (prot & VM_PROT_WRITE) == 0)) { + pte_pa = TLBLO_PTE_TO_PA(pte); + if (vm_page_pa_tryrelock(pmap, pte_pa, &pa)) + goto retry; + m = PHYS_TO_VM_PAGE(pte_pa); + vm_page_hold(m); + } } PA_UNLOCK_COND(pa); PMAP_UNLOCK(pmap);