| 4541 | } |
| 4542 | |
| 4543 | static pd_entry_t * |
| 4544 | pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp, |
| 4545 | struct rwlock **lockp) |
| 4546 | { |
| 4547 | pdp_entry_t *pdpe, PG_V; |
| 4548 | pd_entry_t *pde; |
| 4549 | vm_page_t pdpg; |
| 4550 | vm_pindex_t pdpindex; |
| 4551 | |
| 4552 | PG_V = pmap_valid_bit(pmap); |
| 4553 | |
| 4554 | retry: |
| 4555 | pdpe = pmap_pdpe(pmap, va); |
| 4556 | if (pdpe != NULL && (*pdpe & PG_V) != 0) { |
| 4557 | pde = pmap_pdpe_to_pde(pdpe, va); |
| 4558 | if (va < VM_MAXUSER_ADDRESS) { |
| 4559 | /* Add a reference to the pd page. */ |
| 4560 | pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME); |
| 4561 | pdpg->ref_count++; |
| 4562 | } else |
| 4563 | pdpg = NULL; |
| 4564 | } else if (va < VM_MAXUSER_ADDRESS) { |
| 4565 | /* Allocate a pd page. */ |
| 4566 | pdpindex = pmap_pde_pindex(va) >> NPDPEPGSHIFT; |
| 4567 | pdpg = pmap_allocpte_alloc(pmap, NUPDE + pdpindex, lockp, va); |
| 4568 | if (pdpg == NULL) { |
| 4569 | if (lockp != NULL) |
| 4570 | goto retry; |
| 4571 | else |
| 4572 | return (NULL); |
| 4573 | } |
| 4574 | pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg)); |
| 4575 | pde = &pde[pmap_pde_index(va)]; |
| 4576 | } else |
| 4577 | panic("pmap_alloc_pde: missing page table page for va %#lx", |
| 4578 | va); |
| 4579 | *pdpgp = pdpg; |
| 4580 | return (pde); |
| 4581 | } |
| 4582 | |
| 4583 | static vm_page_t |
| 4584 | pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp) |
no test coverage detected