* Do the things to unmap a page in a process. */
| 4104 | * Do the things to unmap a page in a process. |
| 4105 | */ |
| 4106 | static int |
| 4107 | pmap_remove_pte2(pmap_t pmap, pt2_entry_t *pte2p, vm_offset_t va, |
| 4108 | struct spglist *free) |
| 4109 | { |
| 4110 | pt2_entry_t opte2; |
| 4111 | vm_page_t m; |
| 4112 | |
| 4113 | rw_assert(&pvh_global_lock, RA_WLOCKED); |
| 4114 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 4115 | |
| 4116 | /* Clear and invalidate the mapping. */ |
| 4117 | opte2 = pte2_load_clear(pte2p); |
| 4118 | pmap_tlb_flush(pmap, va); |
| 4119 | |
| 4120 | KASSERT(pte2_is_valid(opte2), ("%s: pmap %p va %#x not link pte2 %#x", |
| 4121 | __func__, pmap, va, opte2)); |
| 4122 | |
| 4123 | if (opte2 & PTE2_W) |
| 4124 | pmap->pm_stats.wired_count -= 1; |
| 4125 | pmap->pm_stats.resident_count -= 1; |
| 4126 | if (pte2_is_managed(opte2)) { |
| 4127 | m = PHYS_TO_VM_PAGE(pte2_pa(opte2)); |
| 4128 | if (pte2_is_dirty(opte2)) |
| 4129 | vm_page_dirty(m); |
| 4130 | if (opte2 & PTE2_A) |
| 4131 | vm_page_aflag_set(m, PGA_REFERENCED); |
| 4132 | pmap_remove_entry(pmap, m, va); |
| 4133 | } |
| 4134 | return (pmap_unuse_pt2(pmap, va, free)); |
| 4135 | } |
| 4136 | |
| 4137 | /* |
| 4138 | * Remove a single page from a process address space. |
no test coverage detected