Changeset View
Changeset View
Standalone View
Standalone View
sys/i386/i386/pmap.c
Show First 20 Lines • Show All 1,679 Lines • ▼ Show 20 Lines | |||||
* if that mapping permits the given protection. | * if that mapping permits the given protection. | ||||
*/ | */ | ||||
static vm_page_t | static vm_page_t | ||||
__CONCAT(PMTYPE, extract_and_hold)(pmap_t pmap, vm_offset_t va, vm_prot_t prot) | __CONCAT(PMTYPE, extract_and_hold)(pmap_t pmap, vm_offset_t va, vm_prot_t prot) | ||||
{ | { | ||||
pd_entry_t pde; | pd_entry_t pde; | ||||
pt_entry_t pte; | pt_entry_t pte; | ||||
vm_page_t m; | vm_page_t m; | ||||
vm_paddr_t pa; | |||||
pa = 0; | |||||
m = NULL; | m = NULL; | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
pde = *pmap_pde(pmap, va); | pde = *pmap_pde(pmap, va); | ||||
if (pde != 0) { | if (pde != 0) { | ||||
if (pde & PG_PS) { | if (pde & PG_PS) { | ||||
if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) { | if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) | ||||
if (vm_page_pa_tryrelock(pmap, (pde & | m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | | ||||
PG_PS_FRAME) | (va & PDRMASK), &pa)) | (va & PDRMASK)); | ||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(pa); | |||||
} | |||||
} else { | } else { | ||||
pte = pmap_pte_ufast(pmap, va, pde); | pte = pmap_pte_ufast(pmap, va, pde); | ||||
if (pte != 0 && | if (pte != 0 && | ||||
((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) { | ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) | ||||
if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, | m = PHYS_TO_VM_PAGE(pte & PG_FRAME); | ||||
&pa)) | |||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(pa); | |||||
} | } | ||||
if (m != NULL && !vm_page_wire_mapped(m)) | |||||
m = NULL; | |||||
} | } | ||||
if (m != NULL) | |||||
vm_page_wire(m); | |||||
} | |||||
PA_UNLOCK_COND(pa); | |||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
return (m); | return (m); | ||||
} | } | ||||
/*************************************************** | /*************************************************** | ||||
* Low level mapping routines..... | * Low level mapping routines..... | ||||
***************************************************/ | ***************************************************/ | ||||
▲ Show 20 Lines • Show All 4,429 Lines • Show Last 20 Lines |