Lines 2382-2389
pmap_pv_insert_l2(pmap_t pmap, vm_offset_t va, pd_entry_t l2e, u_int flags,
Link Here
|
2382 |
return (true); |
2382 |
return (true); |
2383 |
} |
2383 |
} |
2384 |
|
2384 |
|
|
|
2385 |
static void |
2386 |
pmap_remove_kernel_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va) |
2387 |
{ |
2388 |
pt_entry_t newl2, oldl2; |
2389 |
vm_page_t ml3; |
2390 |
vm_paddr_t ml3pa; |
2391 |
|
2392 |
KASSERT(!VIRT_IN_DMAP(va), ("removing direct mapping of %#lx", va)); |
2393 |
KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap)); |
2394 |
PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
2395 |
|
2396 |
ml3 = pmap_remove_pt_page(pmap, va); |
2397 |
if (ml3 == NULL) |
2398 |
panic("pmap_remove_kernel_l2: Missing pt page"); |
2399 |
|
2400 |
ml3pa = VM_PAGE_TO_PHYS(ml3); |
2401 |
newl2 = ml3pa | L2_TABLE; |
2402 |
|
2403 |
/* |
2404 |
* Initialize the page table page. |
2405 |
*/ |
2406 |
pagezero((void *)PHYS_TO_DMAP(ml3pa)); |
2407 |
|
2408 |
/* |
2409 |
* Demote the mapping. The caller must have already invalidated the |
2410 |
* mapping (i.e., the "break" in break-before-make). |
2411 |
*/ |
2412 |
oldl2 = pmap_load_store(l2, newl2); |
2413 |
KASSERT(oldl2 == 0, ("%s: found existing mapping at %p: %#lx", |
2414 |
__func__, l2, oldl2)); |
2415 |
} |
2416 |
|
2385 |
/* |
2417 |
/* |
2386 |
* pmap_remove_l2: do the things to unmap a level 2 superpage in a process |
2418 |
* pmap_remove_l2: Do the things to unmap a level 2 superpage. |
2387 |
*/ |
2419 |
*/ |
2388 |
static int |
2420 |
static int |
2389 |
pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva, |
2421 |
pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva, |
Lines 2419-2434
pmap_remove_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t sva,
Link Here
|
2419 |
vm_page_aflag_clear(m, PGA_WRITEABLE); |
2451 |
vm_page_aflag_clear(m, PGA_WRITEABLE); |
2420 |
} |
2452 |
} |
2421 |
} |
2453 |
} |
2422 |
KASSERT(pmap != kernel_pmap, |
2454 |
if (pmap == kernel_pmap) { |
2423 |
("Attempting to remove an l2 kernel page")); |
2455 |
pmap_remove_kernel_l2(pmap, l2, sva); |
2424 |
ml3 = pmap_remove_pt_page(pmap, sva); |
2456 |
} else { |
2425 |
if (ml3 != NULL) { |
2457 |
ml3 = pmap_remove_pt_page(pmap, sva); |
2426 |
pmap_resident_count_dec(pmap, 1); |
2458 |
if (ml3 != NULL) { |
2427 |
KASSERT(ml3->wire_count == NL3PG, |
2459 |
pmap_resident_count_dec(pmap, 1); |
2428 |
("pmap_remove_l2: l3 page wire count error")); |
2460 |
KASSERT(ml3->wire_count == NL3PG, |
2429 |
ml3->wire_count = 1; |
2461 |
("pmap_remove_l2: l3 page wire count error")); |
2430 |
vm_page_unwire_noq(ml3); |
2462 |
ml3->wire_count = 1; |
2431 |
pmap_add_delayed_free_list(ml3, free, FALSE); |
2463 |
vm_page_unwire_noq(ml3); |
|
|
2464 |
pmap_add_delayed_free_list(ml3, free, FALSE); |
2465 |
} |
2432 |
} |
2466 |
} |
2433 |
return (pmap_unuse_pt(pmap, sva, l1e, free)); |
2467 |
return (pmap_unuse_pt(pmap, sva, l1e, free)); |
2434 |
} |
2468 |
} |