Changeset View
Changeset View
Standalone View
Standalone View
head/sys/riscv/riscv/pmap.c
Show First 20 Lines • Show All 864 Lines • ▼ Show 20 Lines | |||||
* with the given pmap and virtual address pair | * with the given pmap and virtual address pair | ||||
* if that mapping permits the given protection. | * if that mapping permits the given protection. | ||||
*/ | */ | ||||
vm_page_t | vm_page_t | ||||
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) | pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) | ||||
{ | { | ||||
pt_entry_t *l3p, l3; | pt_entry_t *l3p, l3; | ||||
vm_paddr_t phys; | vm_paddr_t phys; | ||||
vm_paddr_t pa; | |||||
vm_page_t m; | vm_page_t m; | ||||
pa = 0; | |||||
m = NULL; | m = NULL; | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
l3p = pmap_l3(pmap, va); | l3p = pmap_l3(pmap, va); | ||||
if (l3p != NULL && (l3 = pmap_load(l3p)) != 0) { | if (l3p != NULL && (l3 = pmap_load(l3p)) != 0) { | ||||
if ((l3 & PTE_W) != 0 || (prot & VM_PROT_WRITE) == 0) { | if ((l3 & PTE_W) != 0 || (prot & VM_PROT_WRITE) == 0) { | ||||
phys = PTE_TO_PHYS(l3); | phys = PTE_TO_PHYS(l3); | ||||
if (vm_page_pa_tryrelock(pmap, phys, &pa)) | |||||
goto retry; | |||||
m = PHYS_TO_VM_PAGE(phys); | m = PHYS_TO_VM_PAGE(phys); | ||||
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); | ||||
} | } | ||||
vm_paddr_t | vm_paddr_t | ||||
pmap_kextract(vm_offset_t va) | pmap_kextract(vm_offset_t va) | ||||
{ | { | ||||
pd_entry_t *l2; | pd_entry_t *l2; | ||||
▲ Show 20 Lines • Show All 3,575 Lines • Show Last 20 Lines |