| 2322 | } |
| 2323 | |
| 2324 | static vm_page_t |
| 2325 | pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, |
| 2326 | vm_prot_t prot, vm_page_t mpte) |
| 2327 | { |
| 2328 | pt_entry_t *pte, npte; |
| 2329 | vm_paddr_t pa; |
| 2330 | |
| 2331 | KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || |
| 2332 | (m->oflags & VPO_UNMANAGED) != 0, |
| 2333 | ("pmap_enter_quick_locked: managed mapping within the clean submap")); |
| 2334 | rw_assert(&pvh_global_lock, RA_WLOCKED); |
| 2335 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 2336 | |
| 2337 | /* |
| 2338 | * In the case that a page table page is not resident, we are |
| 2339 | * creating it here. |
| 2340 | */ |
| 2341 | if (va < VM_MAXUSER_ADDRESS) { |
| 2342 | pd_entry_t *pde; |
| 2343 | unsigned ptepindex; |
| 2344 | |
| 2345 | /* |
| 2346 | * Calculate pagetable page index |
| 2347 | */ |
| 2348 | ptepindex = pmap_pde_pindex(va); |
| 2349 | if (mpte && (mpte->pindex == ptepindex)) { |
| 2350 | mpte->ref_count++; |
| 2351 | } else { |
| 2352 | /* |
| 2353 | * Get the page directory entry |
| 2354 | */ |
| 2355 | pde = pmap_pde(pmap, va); |
| 2356 | |
| 2357 | /* |
| 2358 | * If the page table page is mapped, we just |
| 2359 | * increment the hold count, and activate it. |
| 2360 | */ |
| 2361 | if (pde && *pde != 0) { |
| 2362 | mpte = PHYS_TO_VM_PAGE( |
| 2363 | MIPS_DIRECT_TO_PHYS(*pde)); |
| 2364 | mpte->ref_count++; |
| 2365 | } else { |
| 2366 | mpte = _pmap_allocpte(pmap, ptepindex, |
| 2367 | PMAP_ENTER_NOSLEEP); |
| 2368 | if (mpte == NULL) |
| 2369 | return (mpte); |
| 2370 | } |
| 2371 | } |
| 2372 | } else { |
| 2373 | mpte = NULL; |
| 2374 | } |
| 2375 | |
| 2376 | pte = pmap_pte(pmap, va); |
| 2377 | if (pte_test(pte, PTE_V)) { |
| 2378 | if (mpte != NULL) { |
| 2379 | mpte->ref_count--; |
| 2380 | mpte = NULL; |
| 2381 | } |
no test coverage detected