Index: sys/arm64/arm64/pmap.c =================================================================== --- sys/arm64/arm64/pmap.c +++ sys/arm64/arm64/pmap.c @@ -1370,16 +1370,12 @@ return (m); } -vm_paddr_t -pmap_kextract(vm_offset_t va) +bool +pmap_kva_to_pa(vm_offset_t va, vm_paddr_t *pa) { - pt_entry_t *pte, tpte; - - if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) - return (DMAP_TO_PHYS(va)); pte = pmap_l1(kernel_pmap, va); if (pte == NULL) - return (0); + return (false); /* * A concurrent pmap_update_entry() will clear the entry's valid bit @@ -1389,20 +1385,41 @@ */ tpte = pmap_load(pte); if (tpte == 0) - return (0); - if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) - return ((tpte & ~ATTR_MASK) | (va & L1_OFFSET)); + return (false); + if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) { + if (pa != NULL) + *pa = (tpte & ~ATTR_MASK) | (va & L1_OFFSET); + return (true); + } pte = pmap_l1_to_l2(&tpte, va); tpte = pmap_load(pte); if (tpte == 0) - return (0); - if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) - return ((tpte & ~ATTR_MASK) | (va & L2_OFFSET)); + return (false); + if ((tpte & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) { + if (pa != NULL) + *pa = (tpte & ~ATTR_MASK) | (va & L2_OFFSET); + return (true); + } pte = pmap_l2_to_l3(&tpte, va); tpte = pmap_load(pte); if (tpte == 0) + return (false); + if (pa != NULL) + *pa = (tpte & ~ATTR_MASK) | (va & L3_OFFSET); + return (true); +} + +vm_paddr_t +pmap_kextract(vm_offset_t va) +{ + pt_entry_t *pte, tpte; + + if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) + return (DMAP_TO_PHYS(va)); + + if (pmap_kva_to_pa(va, &pa) == false) return (0); - return ((tpte & ~ATTR_MASK) | (va & L3_OFFSET)); + return (pa); } /*************************************************** @@ -6841,7 +6858,7 @@ * critical section. Therefore, we must check the * address without acquiring the kernel pmap's lock. */ - if (pmap_kextract(far) != 0) + if (pmap_kva_to_va(far, NULL)) rv = KERN_SUCCESS; } else { PMAP_LOCK(pmap); Index: sys/arm64/include/pmap.h =================================================================== --- sys/arm64/include/pmap.h +++ sys/arm64/include/pmap.h @@ -167,6 +167,7 @@ int pmap_change_attr(vm_offset_t va, vm_size_t size, int mode); void pmap_kenter(vm_offset_t sva, vm_size_t size, vm_paddr_t pa, int mode); void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t); +bool pmap_kva_to_pa(vm_offset_t va, vm_paddr_t *pa) vm_paddr_t pmap_kextract(vm_offset_t va); void pmap_kremove(vm_offset_t); void pmap_kremove_device(vm_offset_t, vm_size_t);