Changeset View
Changeset View
Standalone View
Standalone View
sys/powerpc/aim/mmu_oea.c
Show First 20 Lines • Show All 1,256 Lines • ▼ Show 20 Lines | |||||
* pmap and virtual address pair if that mapping permits the given | * pmap and virtual address pair if that mapping permits the given | ||||
* protection. | * protection. | ||||
*/ | */ | ||||
vm_page_t | vm_page_t | ||||
moea_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_prot_t prot) | moea_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_prot_t prot) | ||||
{ | { | ||||
struct pvo_entry *pvo; | struct pvo_entry *pvo; | ||||
vm_page_t m; | vm_page_t m; | ||||
vm_paddr_t pa; | |||||
m = NULL; | m = NULL; | ||||
pa = 0; | |||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
pvo = moea_pvo_find_va(pmap, va & ~ADDR_POFF, NULL); | pvo = moea_pvo_find_va(pmap, va & ~ADDR_POFF, NULL); | ||||
if (pvo != NULL && (pvo->pvo_pte.pte.pte_hi & PTE_VALID) && | if (pvo != NULL && (pvo->pvo_pte.pte.pte_hi & PTE_VALID) && | ||||
((pvo->pvo_pte.pte.pte_lo & PTE_PP) == PTE_RW || | ((pvo->pvo_pte.pte.pte_lo & PTE_PP) == PTE_RW || | ||||
(prot & VM_PROT_WRITE) == 0)) { | (prot & VM_PROT_WRITE) == 0)) { | ||||
if (vm_page_pa_tryrelock(pmap, pvo->pvo_pte.pte.pte_lo & PTE_RPGN, &pa)) | |||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN); | m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN); | ||||
vm_page_wire(m); | if (!vm_page_wire_mapped(m)) | ||||
m = NULL; | |||||
} | } | ||||
PA_UNLOCK_COND(pa); | |||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
return (m); | return (m); | ||||
} | } | ||||
void | void | ||||
moea_init(mmu_t mmu) | moea_init(mmu_t mmu) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 1,492 Lines • Show Last 20 Lines |