Changeset View
Changeset View
Standalone View
Standalone View
head/sys/powerpc/booke/pmap.c
Show First 20 Lines • Show All 2,272 Lines • ▼ Show 20 Lines | mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, | ||||
if (su) { | if (su) { | ||||
KASSERT(((va >= virtual_avail) && | KASSERT(((va >= virtual_avail) && | ||||
(va <= VM_MAX_KERNEL_ADDRESS)), | (va <= VM_MAX_KERNEL_ADDRESS)), | ||||
("mmu_booke_enter_locked: kernel pmap, non kernel va")); | ("mmu_booke_enter_locked: kernel pmap, non kernel va")); | ||||
} else { | } else { | ||||
KASSERT((va <= VM_MAXUSER_ADDRESS), | KASSERT((va <= VM_MAXUSER_ADDRESS), | ||||
("mmu_booke_enter_locked: user pmap, non user va")); | ("mmu_booke_enter_locked: user pmap, non user va")); | ||||
} | } | ||||
if ((m->oflags & VPO_UNMANAGED) == 0) | if ((m->oflags & VPO_UNMANAGED) == 0) { | ||||
if ((pmap_flags & PMAP_ENTER_QUICK_LOCKED) == 0) | |||||
VM_PAGE_OBJECT_BUSY_ASSERT(m); | VM_PAGE_OBJECT_BUSY_ASSERT(m); | ||||
else | |||||
VM_OBJECT_ASSERT_LOCKED(m->object); | |||||
} | |||||
PMAP_LOCK_ASSERT(pmap, MA_OWNED); | PMAP_LOCK_ASSERT(pmap, MA_OWNED); | ||||
/* | /* | ||||
* If there is an existing mapping, and the physical address has not | * If there is an existing mapping, and the physical address has not | ||||
* changed, must be protection or wiring change. | * changed, must be protection or wiring change. | ||||
*/ | */ | ||||
if (((pte = pte_find(mmu, pmap, va)) != NULL) && | if (((pte = pte_find(mmu, pmap, va)) != NULL) && | ||||
▲ Show 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | mmu_booke_enter_object(mmu_t mmu, pmap_t pmap, vm_offset_t start, | ||||
psize = atop(end - start); | psize = atop(end - start); | ||||
m = m_start; | m = m_start; | ||||
rw_wlock(&pvh_global_lock); | rw_wlock(&pvh_global_lock); | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { | while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { | ||||
mmu_booke_enter_locked(mmu, pmap, start + ptoa(diff), m, | mmu_booke_enter_locked(mmu, pmap, start + ptoa(diff), m, | ||||
prot & (VM_PROT_READ | VM_PROT_EXECUTE), | prot & (VM_PROT_READ | VM_PROT_EXECUTE), | ||||
PMAP_ENTER_NOSLEEP, 0); | PMAP_ENTER_NOSLEEP | PMAP_ENTER_QUICK_LOCKED, 0); | ||||
m = TAILQ_NEXT(m, listq); | m = TAILQ_NEXT(m, listq); | ||||
} | } | ||||
rw_wunlock(&pvh_global_lock); | rw_wunlock(&pvh_global_lock); | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
} | } | ||||
static void | static void | ||||
mmu_booke_enter_quick(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, | mmu_booke_enter_quick(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, | ||||
vm_prot_t prot) | vm_prot_t prot) | ||||
{ | { | ||||
rw_wlock(&pvh_global_lock); | rw_wlock(&pvh_global_lock); | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
mmu_booke_enter_locked(mmu, pmap, va, m, | mmu_booke_enter_locked(mmu, pmap, va, m, | ||||
prot & (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP, | prot & (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP | | ||||
0); | PMAP_ENTER_QUICK_LOCKED, 0); | ||||
rw_wunlock(&pvh_global_lock); | rw_wunlock(&pvh_global_lock); | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
} | } | ||||
/* | /* | ||||
* Remove the given range of addresses from the specified map. | * Remove the given range of addresses from the specified map. | ||||
* | * | ||||
* It is assumed that the start and end are properly rounded to the page size. | * It is assumed that the start and end are properly rounded to the page size. | ||||
▲ Show 20 Lines • Show All 1,889 Lines • Show Last 20 Lines |