* 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. */
| 6221 | * find other mappings. |
| 6222 | */ |
| 6223 | int |
| 6224 | pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap) |
| 6225 | { |
| 6226 | pt1_entry_t *pte1p, pte1; |
| 6227 | pt2_entry_t *pte2p, pte2; |
| 6228 | vm_paddr_t pa; |
| 6229 | bool managed; |
| 6230 | int val; |
| 6231 | |
| 6232 | PMAP_LOCK(pmap); |
| 6233 | pte1p = pmap_pte1(pmap, addr); |
| 6234 | pte1 = pte1_load(pte1p); |
| 6235 | if (pte1_is_section(pte1)) { |
| 6236 | pa = trunc_page(pte1_pa(pte1) | (addr & PTE1_OFFSET)); |
| 6237 | managed = pte1_is_managed(pte1); |
| 6238 | val = MINCORE_PSIND(1) | MINCORE_INCORE; |
| 6239 | if (pte1_is_dirty(pte1)) |
| 6240 | val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; |
| 6241 | if (pte1 & PTE1_A) |
| 6242 | val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; |
| 6243 | } else if (pte1_is_link(pte1)) { |
| 6244 | pte2p = pmap_pte2(pmap, addr); |
| 6245 | pte2 = pte2_load(pte2p); |
| 6246 | pmap_pte2_release(pte2p); |
| 6247 | pa = pte2_pa(pte2); |
| 6248 | managed = pte2_is_managed(pte2); |
| 6249 | val = MINCORE_INCORE; |
| 6250 | if (pte2_is_dirty(pte2)) |
| 6251 | val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER; |
| 6252 | if (pte2 & PTE2_A) |
| 6253 | val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER; |
| 6254 | } else { |
| 6255 | managed = false; |
| 6256 | val = 0; |
| 6257 | } |
| 6258 | if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) != |
| 6259 | (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) { |
| 6260 | *pap = pa; |
| 6261 | } |
| 6262 | PMAP_UNLOCK(pmap); |
| 6263 | return (val); |
| 6264 | } |
| 6265 | |
| 6266 | void |
| 6267 | pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa) |
nothing calls this directly
no test coverage detected