| 10307 | } |
| 10308 | |
| 10309 | void |
| 10310 | pmap_large_unmap(void *svaa, vm_size_t len) |
| 10311 | { |
| 10312 | vm_offset_t sva, va; |
| 10313 | vm_size_t inc; |
| 10314 | pdp_entry_t *pdpe, pdp; |
| 10315 | pd_entry_t *pde, pd; |
| 10316 | pt_entry_t *pte; |
| 10317 | vm_page_t m; |
| 10318 | struct spglist spgf; |
| 10319 | |
| 10320 | sva = (vm_offset_t)svaa; |
| 10321 | if (len == 0 || sva + len < sva || (sva >= DMAP_MIN_ADDRESS && |
| 10322 | sva + len <= DMAP_MIN_ADDRESS + dmaplimit)) |
| 10323 | return; |
| 10324 | |
| 10325 | SLIST_INIT(&spgf); |
| 10326 | KASSERT(PMAP_ADDRESS_IN_LARGEMAP(sva) && |
| 10327 | PMAP_ADDRESS_IN_LARGEMAP(sva + len - 1), |
| 10328 | ("not largemap range %#lx %#lx", (u_long)svaa, (u_long)svaa + len)); |
| 10329 | PMAP_LOCK(kernel_pmap); |
| 10330 | for (va = sva; va < sva + len; va += inc) { |
| 10331 | pdpe = pmap_large_map_pdpe(va); |
| 10332 | pdp = *pdpe; |
| 10333 | KASSERT((pdp & X86_PG_V) != 0, |
| 10334 | ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va, |
| 10335 | (u_long)pdpe, pdp)); |
| 10336 | if ((pdp & X86_PG_PS) != 0) { |
| 10337 | KASSERT((amd_feature & AMDID_PAGE1GB) != 0, |
| 10338 | ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va, |
| 10339 | (u_long)pdpe, pdp)); |
| 10340 | KASSERT((va & PDPMASK) == 0, |
| 10341 | ("PDPMASK bit set, va %#lx pdpe %#lx pdp %#lx", va, |
| 10342 | (u_long)pdpe, pdp)); |
| 10343 | KASSERT(va + NBPDP <= sva + len, |
| 10344 | ("unmap covers partial 1GB page, sva %#lx va %#lx " |
| 10345 | "pdpe %#lx pdp %#lx len %#lx", sva, va, |
| 10346 | (u_long)pdpe, pdp, len)); |
| 10347 | *pdpe = 0; |
| 10348 | inc = NBPDP; |
| 10349 | continue; |
| 10350 | } |
| 10351 | pde = pmap_pdpe_to_pde(pdpe, va); |
| 10352 | pd = *pde; |
| 10353 | KASSERT((pd & X86_PG_V) != 0, |
| 10354 | ("invalid pd va %#lx pde %#lx pd %#lx", va, |
| 10355 | (u_long)pde, pd)); |
| 10356 | if ((pd & X86_PG_PS) != 0) { |
| 10357 | KASSERT((va & PDRMASK) == 0, |
| 10358 | ("PDRMASK bit set, va %#lx pde %#lx pd %#lx", va, |
| 10359 | (u_long)pde, pd)); |
| 10360 | KASSERT(va + NBPDR <= sva + len, |
| 10361 | ("unmap covers partial 2MB page, sva %#lx va %#lx " |
| 10362 | "pde %#lx pd %#lx len %#lx", sva, va, (u_long)pde, |
| 10363 | pd, len)); |
| 10364 | pde_store(pde, 0); |
| 10365 | inc = NBPDR; |
| 10366 | m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde)); |
nothing calls this directly
no test coverage detected