From a94cabeb8b373dc2581995c9261028afae1c120f Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 18 Nov 2017 10:13:01 -0800 Subject: [PATCH] vkernel - Sync to recent API changes * Add uservtophys() to the vkernel code. This is a bit of a quick hack but it should work. It won't be efficient, though. * vkernel compiles again and appears to run ok. --- sys/platform/vkernel64/platform/copyio.c | 5 ----- sys/platform/vkernel64/platform/pmap.c | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/sys/platform/vkernel64/platform/copyio.c b/sys/platform/vkernel64/platform/copyio.c index 6c3bf1ed84..413821dc45 100644 --- a/sys/platform/vkernel64/platform/copyio.c +++ b/sys/platform/vkernel64/platform/copyio.c @@ -63,7 +63,6 @@ casu64(volatile uint64_t *p, uint64_t oldval, uint64_t newval) &error, &busy); if (error) return -1; - KKASSERT(m->busy == 0); kva = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); dest = (uint64_t *)(kva + ((vm_offset_t)p & PAGE_MASK)); @@ -102,7 +101,6 @@ casu32(volatile u_int *p, u_int oldval, u_int newval) &error, &busy); if (error) return -1; - KKASSERT(m->busy == 0); kva = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); dest = (u_int *)(kva + ((vm_offset_t)p & PAGE_MASK)); @@ -140,7 +138,6 @@ swapu64(volatile uint64_t *p, uint64_t val) &error, &busy); if (error) return -1; - KKASSERT(m->busy == 0); kva = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); res = atomic_swap_long((uint64_t *)(kva + ((vm_offset_t)p & PAGE_MASK)), @@ -173,7 +170,6 @@ swapu32(volatile uint32_t *p, uint32_t val) &error, &busy); if (error) return -1; - KKASSERT(m->busy == 0); kva = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)); res = atomic_swap_int((u_int *)(kva + ((vm_offset_t)p & PAGE_MASK)), @@ -305,7 +301,6 @@ copyout(const void *kaddr, void *udaddr, size_t len) &error, &busy); if (error) break; - KKASSERT(m->busy == 0); n = PAGE_SIZE - ((vm_offset_t)udaddr & PAGE_MASK); if (n > len) n = len; diff --git a/sys/platform/vkernel64/platform/pmap.c b/sys/platform/vkernel64/platform/pmap.c index 3aa16a2ef7..b1b22110c6 100644 --- a/sys/platform/vkernel64/platform/pmap.c +++ b/sys/platform/vkernel64/platform/pmap.c @@ -340,6 +340,33 @@ vtopde(vm_offset_t va) return x; } +/* + * Returns the physical address translation from va for a user address. + * (vm_paddr_t)-1 is returned on failure. + */ +vm_paddr_t +uservtophys(vm_offset_t va) +{ + vm_paddr_t pa; + pt_entry_t pte; + pt_entry_t *ptep; + pmap_t pmap; + + pmap = vmspace_pmap(mycpu->gd_curthread->td_lwp->lwp_vmspace); + pa = (vm_paddr_t)-1; + if (va < VM_MAX_USER_ADDRESS) { + vm_object_hold_shared(pmap->pm_pteobj); + ptep = pmap_pte(pmap, va); + if (ptep) { + pte = *ptep; + if (pte & VPTE_V) + pa = (pte & PG_FRAME) | (va & PAGE_MASK); + } + vm_object_drop(pmap->pm_pteobj); + } + return pa; +} + static uint64_t allocpages(vm_paddr_t *firstaddr, int n) { -- 2.11.4.GIT