MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_large_unmap

Function pmap_large_unmap

freebsd/amd64/amd64/pmap.c:10309–10397  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

10307}
10308
10309void
10310pmap_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));

Callers

nothing calls this directly

Calls 7

pmap_large_map_pdpeFunction · 0.85
PHYS_TO_VM_PAGEFunction · 0.85
vm_page_free_pages_toqFunction · 0.85
vmem_freeFunction · 0.85
pmap_pdpe_to_pdeFunction · 0.70
pmap_pde_to_pteFunction · 0.70
pmap_invalidate_rangeFunction · 0.70

Tested by

no test coverage detected