version 1.308.4.1, 2019/06/10 22:06:48 |
version 1.308.4.2, 2020/04/08 14:07:54 |
Line 1473 pmap_create(void) |
|
Line 1473 pmap_create(void) |
|
memset(pm, 0, sizeof *pm); |
memset(pm, 0, sizeof *pm); |
DPRINTF(PDB_CREATE, ("pmap_create(): created %p\n", pm)); |
DPRINTF(PDB_CREATE, ("pmap_create(): created %p\n", pm)); |
|
|
mutex_init(&pm->pm_obj_lock, MUTEX_DEFAULT, IPL_NONE); |
pm->pm_refs = 1; |
uvm_obj_init(&pm->pm_obj, NULL, false, 1); |
TAILQ_INIT(&pm->pm_ptps); |
uvm_obj_setlock(&pm->pm_obj, &pm->pm_obj_lock); |
|
|
|
if (pm != pmap_kernel()) { |
if (pm != pmap_kernel()) { |
while (!pmap_get_page(&pm->pm_physaddr)) { |
while (!pmap_get_page(&pm->pm_physaddr)) { |
uvm_wait("pmap_create"); |
uvm_wait("pmap_create"); |
Line 1510 pmap_destroy(struct pmap *pm) |
|
Line 1508 pmap_destroy(struct pmap *pm) |
|
#else |
#else |
#define pmap_cpus_active 0 |
#define pmap_cpus_active 0 |
#endif |
#endif |
struct vm_page *pg, *nextpg; |
struct vm_page *pg; |
|
|
if ((int)atomic_dec_uint_nv(&pm->pm_refs) > 0) { |
if ((int)atomic_dec_uint_nv(&pm->pm_refs) > 0) { |
return; |
return; |
Line 1538 pmap_destroy(struct pmap *pm) |
|
Line 1536 pmap_destroy(struct pmap *pm) |
|
#endif |
#endif |
|
|
/* we could be a little smarter and leave pages zeroed */ |
/* we could be a little smarter and leave pages zeroed */ |
for (pg = TAILQ_FIRST(&pm->pm_obj.memq); pg != NULL; pg = nextpg) { |
while ((pg = TAILQ_FIRST(&pm->pm_ptps)) != NULL) { |
#ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
struct vm_page_md *md = VM_PAGE_TO_MD(pg); |
struct vm_page_md *md = VM_PAGE_TO_MD(pg); |
#endif |
#endif |
|
|
KASSERT((pg->flags & PG_MARKER) == 0); |
TAILQ_REMOVE(&pm->pm_ptps, pg, pageq.queue); |
nextpg = TAILQ_NEXT(pg, listq.queue); |
|
TAILQ_REMOVE(&pm->pm_obj.memq, pg, listq.queue); |
|
KASSERT(md->mdpg_pvh.pv_pmap == NULL); |
KASSERT(md->mdpg_pvh.pv_pmap == NULL); |
dcache_flush_page_cpuset(VM_PAGE_TO_PHYS(pg), pmap_cpus_active); |
dcache_flush_page_cpuset(VM_PAGE_TO_PHYS(pg), pmap_cpus_active); |
uvm_pagefree(pg); |
uvm_pagefree(pg); |
} |
} |
pmap_free_page((paddr_t)(u_long)pm->pm_segs, pmap_cpus_active); |
pmap_free_page((paddr_t)(u_long)pm->pm_segs, pmap_cpus_active); |
|
|
uvm_obj_destroy(&pm->pm_obj, false); |
|
mutex_destroy(&pm->pm_obj_lock); |
|
pool_cache_put(&pmap_cache, pm); |
pool_cache_put(&pmap_cache, pm); |
} |
} |
|
|
Line 1904 pmap_enter(struct pmap *pm, vaddr_t va, |
|
Line 1898 pmap_enter(struct pmap *pm, vaddr_t va, |
|
ptpg = PHYS_TO_VM_PAGE(ptp); |
ptpg = PHYS_TO_VM_PAGE(ptp); |
if (ptpg) { |
if (ptpg) { |
ptpg->offset = (uint64_t)va & (0xfffffLL << 23); |
ptpg->offset = (uint64_t)va & (0xfffffLL << 23); |
TAILQ_INSERT_TAIL(&pm->pm_obj.memq, ptpg, listq.queue); |
TAILQ_INSERT_TAIL(&pm->pm_ptps, ptpg, pageq.queue); |
} else { |
} else { |
KASSERT(pm == pmap_kernel()); |
KASSERT(pm == pmap_kernel()); |
} |
} |
Line 1916 pmap_enter(struct pmap *pm, vaddr_t va, |
|
Line 1910 pmap_enter(struct pmap *pm, vaddr_t va, |
|
ptpg = PHYS_TO_VM_PAGE(ptp); |
ptpg = PHYS_TO_VM_PAGE(ptp); |
if (ptpg) { |
if (ptpg) { |
ptpg->offset = (((uint64_t)va >> 43) & 0x3ffLL) << 13; |
ptpg->offset = (((uint64_t)va >> 43) & 0x3ffLL) << 13; |
TAILQ_INSERT_TAIL(&pm->pm_obj.memq, ptpg, listq.queue); |
TAILQ_INSERT_TAIL(&pm->pm_ptps, ptpg, pageq.queue); |
} else { |
} else { |
KASSERT(pm == pmap_kernel()); |
KASSERT(pm == pmap_kernel()); |
} |
} |
Line 2024 pmap_enter(struct pmap *pm, vaddr_t va, |
|
Line 2018 pmap_enter(struct pmap *pm, vaddr_t va, |
|
return error; |
return error; |
} |
} |
|
|
void |
bool |
pmap_remove_all(struct pmap *pm) |
pmap_remove_all(struct pmap *pm) |
{ |
{ |
#ifdef MULTIPROCESSOR |
#ifdef MULTIPROCESSOR |
Line 2033 pmap_remove_all(struct pmap *pm) |
|
Line 2027 pmap_remove_all(struct pmap *pm) |
|
#endif |
#endif |
|
|
if (pm == pmap_kernel()) { |
if (pm == pmap_kernel()) { |
return; |
return false; |
} |
} |
write_user_windows(); |
write_user_windows(); |
pm->pm_refs = 0; |
pm->pm_refs = 0; |
Line 2069 pmap_remove_all(struct pmap *pm) |
|
Line 2063 pmap_remove_all(struct pmap *pm) |
|
* only flush the right context on each CPU? |
* only flush the right context on each CPU? |
*/ |
*/ |
blast_dcache(); |
blast_dcache(); |
|
return false; |
} |
} |
|
|
/* |
/* |