Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/arm/pmap-v6.c
Show First 20 Lines • Show All 6,227 Lines • ▼ Show 20 Lines | #endif | ||||
*/ | */ | ||||
td->td_pcb->pcb_pagedir = ttb; | td->td_pcb->pcb_pagedir = ttb; | ||||
cp15_ttbr_set(ttb); | cp15_ttbr_set(ttb); | ||||
PCPU_SET(curpmap, pmap); | PCPU_SET(curpmap, pmap); | ||||
critical_exit(); | critical_exit(); | ||||
} | } | ||||
/* | /* | ||||
* 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) | ||||
{ | { | ||||
pt1_entry_t *pte1p, pte1; | pt1_entry_t *pte1p, pte1; | ||||
pt2_entry_t *pte2p, pte2; | pt2_entry_t *pte2p, pte2; | ||||
vm_paddr_t pa; | vm_paddr_t pa; | ||||
bool managed; | bool managed; | ||||
int val; | int val; | ||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
retry: | |||||
pte1p = pmap_pte1(pmap, addr); | pte1p = pmap_pte1(pmap, addr); | ||||
pte1 = pte1_load(pte1p); | pte1 = pte1_load(pte1p); | ||||
if (pte1_is_section(pte1)) { | if (pte1_is_section(pte1)) { | ||||
pa = trunc_page(pte1_pa(pte1) | (addr & PTE1_OFFSET)); | pa = trunc_page(pte1_pa(pte1) | (addr & PTE1_OFFSET)); | ||||
managed = pte1_is_managed(pte1); | managed = pte1_is_managed(pte1); | ||||
val = MINCORE_SUPER | MINCORE_INCORE; | val = MINCORE_SUPER | MINCORE_INCORE; | ||||
if (pte1_is_dirty(pte1)) | if (pte1_is_dirty(pte1)) | ||||
val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; | val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; | ||||
Show All 11 Lines | if (pte1_is_section(pte1)) { | ||||
if (pte2 & PTE2_A) | if (pte2 & PTE2_A) | ||||
val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; | val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; | ||||
} else { | } else { | ||||
managed = false; | managed = false; | ||||
val = 0; | 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_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa) | pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa) | ||||
{ | { | ||||
vm_offset_t sva; | vm_offset_t sva; | ||||
▲ Show 20 Lines • Show All 688 Lines • Show Last 20 Lines |