* Routine: pmap_extract * Function: * Extract the physical page address associated * with the given map/virtual_address pair. */
| 1262 | * with the given map/virtual_address pair. |
| 1263 | */ |
| 1264 | vm_paddr_t |
| 1265 | pmap_extract(pmap_t pmap, vm_offset_t va) |
| 1266 | { |
| 1267 | pt_entry_t *pte, tpte; |
| 1268 | vm_paddr_t pa; |
| 1269 | int lvl; |
| 1270 | |
| 1271 | pa = 0; |
| 1272 | PMAP_LOCK(pmap); |
| 1273 | /* |
| 1274 | * Find the block or page map for this virtual address. pmap_pte |
| 1275 | * will return either a valid block/page entry, or NULL. |
| 1276 | */ |
| 1277 | pte = pmap_pte(pmap, va, &lvl); |
| 1278 | if (pte != NULL) { |
| 1279 | tpte = pmap_load(pte); |
| 1280 | pa = tpte & ~ATTR_MASK; |
| 1281 | switch(lvl) { |
| 1282 | case 1: |
| 1283 | KASSERT((tpte & ATTR_DESCR_MASK) == L1_BLOCK, |
| 1284 | ("pmap_extract: Invalid L1 pte found: %lx", |
| 1285 | tpte & ATTR_DESCR_MASK)); |
| 1286 | pa |= (va & L1_OFFSET); |
| 1287 | break; |
| 1288 | case 2: |
| 1289 | KASSERT((tpte & ATTR_DESCR_MASK) == L2_BLOCK, |
| 1290 | ("pmap_extract: Invalid L2 pte found: %lx", |
| 1291 | tpte & ATTR_DESCR_MASK)); |
| 1292 | pa |= (va & L2_OFFSET); |
| 1293 | break; |
| 1294 | case 3: |
| 1295 | KASSERT((tpte & ATTR_DESCR_MASK) == L3_PAGE, |
| 1296 | ("pmap_extract: Invalid L3 pte found: %lx", |
| 1297 | tpte & ATTR_DESCR_MASK)); |
| 1298 | pa |= (va & L3_OFFSET); |
| 1299 | break; |
| 1300 | } |
| 1301 | } |
| 1302 | PMAP_UNLOCK(pmap); |
| 1303 | return (pa); |
| 1304 | } |
| 1305 | |
| 1306 | /* |
| 1307 | * Routine: pmap_extract_and_hold |
no test coverage detected