| 4430 | } |
| 4431 | |
| 4432 | static vm_page_t |
| 4433 | pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, |
| 4434 | vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp) |
| 4435 | { |
| 4436 | pd_entry_t *pde; |
| 4437 | pt_entry_t *l2, *l3, l3_val; |
| 4438 | vm_paddr_t pa; |
| 4439 | int lvl; |
| 4440 | |
| 4441 | KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva || |
| 4442 | (m->oflags & VPO_UNMANAGED) != 0, |
| 4443 | ("pmap_enter_quick_locked: managed mapping within the clean submap")); |
| 4444 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 4445 | PMAP_ASSERT_STAGE1(pmap); |
| 4446 | |
| 4447 | CTR2(KTR_PMAP, "pmap_enter_quick_locked: %p %lx", pmap, va); |
| 4448 | /* |
| 4449 | * In the case that a page table page is not |
| 4450 | * resident, we are creating it here. |
| 4451 | */ |
| 4452 | if (va < VM_MAXUSER_ADDRESS) { |
| 4453 | vm_pindex_t l2pindex; |
| 4454 | |
| 4455 | /* |
| 4456 | * Calculate pagetable page index |
| 4457 | */ |
| 4458 | l2pindex = pmap_l2_pindex(va); |
| 4459 | if (mpte && (mpte->pindex == l2pindex)) { |
| 4460 | mpte->ref_count++; |
| 4461 | } else { |
| 4462 | /* |
| 4463 | * Get the l2 entry |
| 4464 | */ |
| 4465 | pde = pmap_pde(pmap, va, &lvl); |
| 4466 | |
| 4467 | /* |
| 4468 | * If the page table page is mapped, we just increment |
| 4469 | * the hold count, and activate it. Otherwise, we |
| 4470 | * attempt to allocate a page table page. If this |
| 4471 | * attempt fails, we don't retry. Instead, we give up. |
| 4472 | */ |
| 4473 | if (lvl == 1) { |
| 4474 | l2 = pmap_l1_to_l2(pde, va); |
| 4475 | if ((pmap_load(l2) & ATTR_DESCR_MASK) == |
| 4476 | L2_BLOCK) |
| 4477 | return (NULL); |
| 4478 | } |
| 4479 | if (lvl == 2 && pmap_load(pde) != 0) { |
| 4480 | mpte = |
| 4481 | PHYS_TO_VM_PAGE(pmap_load(pde) & ~ATTR_MASK); |
| 4482 | mpte->ref_count++; |
| 4483 | } else { |
| 4484 | /* |
| 4485 | * Pass NULL instead of the PV list lock |
| 4486 | * pointer, because we don't intend to sleep. |
| 4487 | */ |
| 4488 | mpte = _pmap_alloc_l3(pmap, l2pindex, NULL); |
| 4489 | if (mpte == NULL) |
no test coverage detected