* Release any resources held by the given physical map. * Called when a pmap initialized by pmap_pinit is being released. * Should only be called if the map contains no valid mappings. */
| 4642 | * Should only be called if the map contains no valid mappings. |
| 4643 | */ |
| 4644 | void |
| 4645 | pmap_release(pmap_t pmap) |
| 4646 | { |
| 4647 | vm_page_t m; |
| 4648 | int i; |
| 4649 | |
| 4650 | KASSERT(pmap->pm_stats.resident_count == 0, |
| 4651 | ("pmap_release: pmap %p resident count %ld != 0", |
| 4652 | pmap, pmap->pm_stats.resident_count)); |
| 4653 | KASSERT(vm_radix_is_empty(&pmap->pm_root), |
| 4654 | ("pmap_release: pmap %p has reserved page table page(s)", |
| 4655 | pmap)); |
| 4656 | KASSERT(CPU_EMPTY(&pmap->pm_active), |
| 4657 | ("releasing active pmap %p", pmap)); |
| 4658 | |
| 4659 | m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_pmltop)); |
| 4660 | |
| 4661 | if (pmap_is_la57(pmap)) { |
| 4662 | pmap->pm_pmltop[pmap_pml5e_index(UPT_MAX_ADDRESS)] = 0; |
| 4663 | pmap->pm_pmltop[PML5PML5I] = 0; |
| 4664 | } else { |
| 4665 | for (i = 0; i < NKPML4E; i++) /* KVA */ |
| 4666 | pmap->pm_pmltop[KPML4BASE + i] = 0; |
| 4667 | for (i = 0; i < ndmpdpphys; i++)/* Direct Map */ |
| 4668 | pmap->pm_pmltop[DMPML4I + i] = 0; |
| 4669 | pmap->pm_pmltop[PML4PML4I] = 0; /* Recursive Mapping */ |
| 4670 | for (i = 0; i < lm_ents; i++) /* Large Map */ |
| 4671 | pmap->pm_pmltop[LMSPML4I + i] = 0; |
| 4672 | } |
| 4673 | |
| 4674 | vm_page_unwire_noq(m); |
| 4675 | vm_page_free_zero(m); |
| 4676 | |
| 4677 | if (pmap->pm_pmltopu != NULL) { |
| 4678 | m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap-> |
| 4679 | pm_pmltopu)); |
| 4680 | vm_page_unwire_noq(m); |
| 4681 | vm_page_free(m); |
| 4682 | } |
| 4683 | if (pmap->pm_type == PT_X86 && |
| 4684 | (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) |
| 4685 | rangeset_fini(&pmap->pm_pkru); |
| 4686 | } |
| 4687 | |
| 4688 | static int |
| 4689 | kvm_size(SYSCTL_HANDLER_ARGS) |
nothing calls this directly
no test coverage detected