| 4279 | } |
| 4280 | |
| 4281 | static pml4_entry_t * |
| 4282 | pmap_allocpte_getpml4(pmap_t pmap, struct rwlock **lockp, vm_offset_t va, |
| 4283 | bool addref) |
| 4284 | { |
| 4285 | vm_pindex_t pml5index; |
| 4286 | pml5_entry_t *pml5; |
| 4287 | pml4_entry_t *pml4; |
| 4288 | vm_page_t pml4pg; |
| 4289 | pt_entry_t PG_V; |
| 4290 | bool allocated; |
| 4291 | |
| 4292 | if (!pmap_is_la57(pmap)) |
| 4293 | return (&pmap->pm_pmltop[pmap_pml4e_index(va)]); |
| 4294 | |
| 4295 | PG_V = pmap_valid_bit(pmap); |
| 4296 | pml5index = pmap_pml5e_index(va); |
| 4297 | pml5 = &pmap->pm_pmltop[pml5index]; |
| 4298 | if ((*pml5 & PG_V) == 0) { |
| 4299 | if (pmap_allocpte_nosleep(pmap, pmap_pml5e_pindex(va), lockp, |
| 4300 | va) == NULL) |
| 4301 | return (NULL); |
| 4302 | allocated = true; |
| 4303 | } else { |
| 4304 | allocated = false; |
| 4305 | } |
| 4306 | pml4 = (pml4_entry_t *)PHYS_TO_DMAP(*pml5 & PG_FRAME); |
| 4307 | pml4 = &pml4[pmap_pml4e_index(va)]; |
| 4308 | if ((*pml4 & PG_V) == 0) { |
| 4309 | pml4pg = PHYS_TO_VM_PAGE(*pml5 & PG_FRAME); |
| 4310 | if (allocated && !addref) |
| 4311 | pml4pg->ref_count--; |
| 4312 | else if (!allocated && addref) |
| 4313 | pml4pg->ref_count++; |
| 4314 | } |
| 4315 | return (pml4); |
| 4316 | } |
| 4317 | |
| 4318 | static pdp_entry_t * |
| 4319 | pmap_allocpte_getpdp(pmap_t pmap, struct rwlock **lockp, vm_offset_t va, |
no test coverage detected