Page MenuHomeFreeBSD

D27621.1778000972.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D27621.1778000972.diff

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);

File Metadata

Mime Type
text/plain
Expires
Tue, May 5, 5:09 PM (16 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28566039
Default Alt Text
D27621.1778000972.diff (2 KB)

Event Timeline