Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/arm64/pmap.c
Show First 20 Lines • Show All 5,618 Lines • ▼ Show 20 Lines | pmap_demote_l2(pmap_t pmap, pt_entry_t *l2, vm_offset_t va) | ||||
lock = NULL; | lock = NULL; | ||||
l3 = pmap_demote_l2_locked(pmap, l2, va, &lock); | l3 = pmap_demote_l2_locked(pmap, l2, va, &lock); | ||||
if (lock != NULL) | if (lock != NULL) | ||||
rw_wunlock(lock); | rw_wunlock(lock); | ||||
return (l3); | return (l3); | ||||
} | } | ||||
/* | /* | ||||
* perform the pmap work for mincore | * Perform the pmap work for mincore(2). If the page is not both referenced and | ||||
* modified by this pmap, returns its physical address so that the caller can | |||||
* find other mappings. | |||||
*/ | */ | ||||
int | int | ||||
pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) | pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap) | ||||
{ | { | ||||
pt_entry_t *pte, tpte; | pt_entry_t *pte, tpte; | ||||
vm_paddr_t mask, pa; | vm_paddr_t mask, pa; | ||||
int lvl, val; | int lvl, val; | ||||
bool managed; | bool managed; | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
val = 0; | |||||
pte = pmap_pte(pmap, addr, &lvl); | pte = pmap_pte(pmap, addr, &lvl); | ||||
if (pte != NULL) { | if (pte != NULL) { | ||||
tpte = pmap_load(pte); | tpte = pmap_load(pte); | ||||
switch (lvl) { | switch (lvl) { | ||||
case 3: | case 3: | ||||
mask = L3_OFFSET; | mask = L3_OFFSET; | ||||
break; | break; | ||||
Show All 13 Lines | if (lvl != 3) | ||||
val |= MINCORE_SUPER; | val |= MINCORE_SUPER; | ||||
if ((managed && pmap_pte_dirty(tpte)) || (!managed && | if ((managed && pmap_pte_dirty(tpte)) || (!managed && | ||||
(tpte & ATTR_AP_RW_BIT) == ATTR_AP(ATTR_AP_RW))) | (tpte & ATTR_AP_RW_BIT) == ATTR_AP(ATTR_AP_RW))) | ||||
val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; | val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; | ||||
if ((tpte & ATTR_AF) == ATTR_AF) | if ((tpte & ATTR_AF) == ATTR_AF) | ||||
val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; | val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; | ||||
pa = (tpte & ~ATTR_MASK) | (addr & mask); | pa = (tpte & ~ATTR_MASK) | (addr & mask); | ||||
} else | } else { | ||||
managed = false; | managed = false; | ||||
val = 0; | |||||
} | |||||
if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != | if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != | ||||
(MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) { | (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) { | ||||
/* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */ | *pap = pa; | ||||
if (vm_page_pa_tryrelock(pmap, pa, locked_pa)) | } | ||||
goto retry; | |||||
} else | |||||
PA_UNLOCK_COND(*locked_pa); | |||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
return (val); | return (val); | ||||
} | } | ||||
void | void | ||||
pmap_activate(struct thread *td) | pmap_activate(struct thread *td) | ||||
{ | { | ||||
pmap_t pmap; | pmap_t pmap; | ||||
▲ Show 20 Lines • Show All 284 Lines • Show Last 20 Lines |