Changeset View
Changeset View
Standalone View
Standalone View
head/sys/powerpc/booke/pmap.c
Show First 20 Lines • Show All 2,784 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
static vm_page_t | static vm_page_t | ||||
mmu_booke_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, | mmu_booke_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, | ||||
vm_prot_t prot) | vm_prot_t prot) | ||||
{ | { | ||||
pte_t *pte; | pte_t *pte; | ||||
vm_page_t m; | vm_page_t m; | ||||
uint32_t pte_wbit; | uint32_t pte_wbit; | ||||
vm_paddr_t pa; | |||||
m = NULL; | m = NULL; | ||||
pa = 0; | |||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
pte = pte_find(mmu, pmap, va); | pte = pte_find(mmu, pmap, va); | ||||
if ((pte != NULL) && PTE_ISVALID(pte)) { | if ((pte != NULL) && PTE_ISVALID(pte)) { | ||||
if (pmap == kernel_pmap) | if (pmap == kernel_pmap) | ||||
pte_wbit = PTE_SW; | pte_wbit = PTE_SW; | ||||
else | else | ||||
pte_wbit = PTE_UW; | pte_wbit = PTE_UW; | ||||
if ((*pte & pte_wbit) || ((prot & VM_PROT_WRITE) == 0)) { | if ((*pte & pte_wbit) != 0 || (prot & VM_PROT_WRITE) == 0) { | ||||
if (vm_page_pa_tryrelock(pmap, PTE_PA(pte), &pa)) | |||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(PTE_PA(pte)); | m = PHYS_TO_VM_PAGE(PTE_PA(pte)); | ||||
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); | ||||
} | } | ||||
/* | /* | ||||
* Initialize a vm_page's machine-dependent fields. | * Initialize a vm_page's machine-dependent fields. | ||||
*/ | */ | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 1,560 Lines • Show Last 20 Lines |