Changeset View
Changeset View
Standalone View
Standalone View
head/sys/amd64/amd64/pmap.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 3,065 Lines • ▼ Show 20 Lines | pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) | ||||
pt_entry_t pte, PG_RW, PG_V; | pt_entry_t pte, PG_RW, PG_V; | ||||
vm_paddr_t pa; | vm_paddr_t pa; | ||||
vm_page_t m; | vm_page_t m; | ||||
pa = 0; | pa = 0; | ||||
m = NULL; | m = NULL; | ||||
PG_RW = pmap_rw_bit(pmap); | PG_RW = pmap_rw_bit(pmap); | ||||
PG_V = pmap_valid_bit(pmap); | PG_V = pmap_valid_bit(pmap); | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
pdep = pmap_pde(pmap, va); | pdep = pmap_pde(pmap, va); | ||||
if (pdep != NULL && (pde = *pdep)) { | if (pdep != NULL && (pde = *pdep)) { | ||||
if (pde & PG_PS) { | if (pde & PG_PS) { | ||||
if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) { | if ((pde & PG_RW) != 0 || (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_pde_to_pte(pdep, va); | pte = *pmap_pde_to_pte(pdep, va); | ||||
if ((pte & PG_V) && | if ((pte & PG_V) != 0 && | ||||
((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) { | ((pte & PG_RW) != 0 || (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); | ||||
} | } | ||||
vm_paddr_t | vm_paddr_t | ||||
pmap_kextract(vm_offset_t va) | pmap_kextract(vm_offset_t va) | ||||
{ | { | ||||
pd_entry_t pde; | pd_entry_t pde; | ||||
▲ Show 20 Lines • Show All 7,210 Lines • Show Last 20 Lines |