Changeset View
Changeset View
Standalone View
Standalone View
sys/sparc64/sparc64/pmap.c
Show First 20 Lines • Show All 841 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 | ||||
pmap_extract_and_hold(pmap_t pm, vm_offset_t va, vm_prot_t prot) | pmap_extract_and_hold(pmap_t pm, vm_offset_t va, vm_prot_t prot) | ||||
{ | { | ||||
struct tte *tp; | struct tte *tp; | ||||
vm_page_t m; | vm_page_t m; | ||||
vm_paddr_t pa; | |||||
m = NULL; | m = NULL; | ||||
pa = 0; | |||||
PMAP_LOCK(pm); | PMAP_LOCK(pm); | ||||
retry: | |||||
if (pm == kernel_pmap) { | if (pm == kernel_pmap) { | ||||
if (va >= VM_MIN_DIRECT_ADDRESS) { | if (va >= VM_MIN_DIRECT_ADDRESS) { | ||||
tp = NULL; | tp = NULL; | ||||
m = PHYS_TO_VM_PAGE(TLB_DIRECT_TO_PHYS(va)); | m = PHYS_TO_VM_PAGE(TLB_DIRECT_TO_PHYS(va)); | ||||
(void)vm_page_pa_tryrelock(pm, TLB_DIRECT_TO_PHYS(va), | if (!vm_page_wire_mapped(m)) | ||||
&pa); | m = NULL; | ||||
vm_page_wire(m); | |||||
} else { | } else { | ||||
tp = tsb_kvtotte(va); | tp = tsb_kvtotte(va); | ||||
if ((tp->tte_data & TD_V) == 0) | if ((tp->tte_data & TD_V) == 0) | ||||
tp = NULL; | tp = NULL; | ||||
} | } | ||||
} else | } else | ||||
tp = tsb_tte_lookup(pm, va); | tp = tsb_tte_lookup(pm, va); | ||||
if (tp != NULL && ((tp->tte_data & TD_SW) || | if (tp != NULL && ((tp->tte_data & TD_SW) || | ||||
(prot & VM_PROT_WRITE) == 0)) { | (prot & VM_PROT_WRITE) == 0)) { | ||||
if (vm_page_pa_tryrelock(pm, TTE_GET_PA(tp), &pa)) | |||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(TTE_GET_PA(tp)); | m = PHYS_TO_VM_PAGE(TTE_GET_PA(tp)); | ||||
vm_page_wire(m); | if (!vm_page_wire_mapped(m)) | ||||
m = NULL; | |||||
} | } | ||||
PA_UNLOCK_COND(pa); | |||||
PMAP_UNLOCK(pm); | PMAP_UNLOCK(pm); | ||||
return (m); | return (m); | ||||
} | } | ||||
/* | /* | ||||
* Extract the physical page address associated with the given kernel virtual | * Extract the physical page address associated with the given kernel virtual | ||||
* address. | * address. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 1,442 Lines • Show Last 20 Lines |