Index: vmd.h =================================================================== RCS file: /cvs/src/usr.sbin/vmd/vmd.h,v retrieving revision 1.60 diff -u -p -r1.60 vmd.h --- vmd.h 20 Aug 2017 21:15:32 -0000 1.60 +++ vmd.h 8 Sep 2017 07:18:26 -0000 @@ -320,10 +324,14 @@ int vm_priv_brconfig(struct privsep *, uint32_t vm_priv_addr(struct address *, uint32_t, int, int); /* vmm.c */ +struct iovec; + void vmm(struct privsep *, struct privsep_proc *); void vmm_shutdown(void); +void *vaddr_mem(paddr_t, size_t); int write_mem(paddr_t, const void *buf, size_t); int read_mem(paddr_t, void *buf, size_t); +int iovec_mem(paddr_t, size_t, struct iovec *, int); int opentap(char *); int fd_hasdata(int); void mutex_lock(pthread_mutex_t *); Index: vm.c =================================================================== RCS file: /cvs/src/usr.sbin/vmd/vm.c,v retrieving revision 1.24 diff -u -p -r1.24 vm.c --- vm.c 20 Aug 2017 21:15:32 -0000 1.24 +++ vm.c 8 Sep 2017 07:18:26 -0000 @@ -1561,6 +1561,29 @@ find_gpa_range(struct vm_create_params * return (vmr); } +void * +vaddr_mem(paddr_t gpa, size_t len) +{ + struct vm_create_params *vcp = ¤t_vm->vm_params.vmc_params; + size_t i; + struct vm_mem_range *vmr; + paddr_t gpend = gpa + len; + + /* Find the first vm_mem_range that contains gpa */ + for (i = 0; i < vcp->vcp_nmemranges; i++) { + vmr = &vcp->vcp_memranges[i]; + if (gpa < vmr->vmr_gpa) + continue; + + if (gpend >= vmr->vmr_gpa + vmr->vmr_size) + continue; + + return ((char *)vmr->vmr_va + (gpa - vmr->vmr_gpa)); + } + + return (NULL); +} + /* * write_mem * @@ -1658,6 +1681,43 @@ read_mem(paddr_t src, void *buf, size_t return (0); } +int +iovec_mem(paddr_t src, size_t len, struct iovec *iov, int iovcnt) +{ + size_t n, off; + struct vm_mem_range *vmr; + int niov = 0; + + vmr = find_gpa_range(¤t_vm->vm_params.vmc_params, src, len); + if (vmr == NULL) { + errno = EINVAL; + return (-1); + } + + off = src - vmr->vmr_gpa; + while (len > 0) { + if (niov == iovcnt) { + errno = ENOMEM; + return (-1); + } + + n = vmr->vmr_size - off; + if (len < n) + n = len; + + iov[niov].iov_base = (char *)vmr->vmr_va + off; + iov[niov].iov_len = n; + + niov++; + + len -= n; + off = 0; + vmr++; + } + + return (niov); +} + /* * vcpu_assert_pic_irq *