MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_extract

Function pmap_extract

freebsd/arm64/arm64/pmap.c:1264–1304  ·  view source on GitHub ↗

* Routine: pmap_extract * Function: * Extract the physical page address associated * with the given map/virtual_address pair. */

Source from the content-addressed store, hash-verified

1262 * with the given map/virtual_address pair.
1263 */
1264vm_paddr_t
1265pmap_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

Callers 5

pmap_sync_icacheFunction · 0.70
memrwFunction · 0.70
start_cpuFunction · 0.70
_bus_dmamap_count_pagesFunction · 0.70

Calls 1

pmap_pteFunction · 0.70

Tested by

no test coverage detected