From owner-svn-soc-all@freebsd.org Tue Jul 14 10:22:04 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DF20399C092 for ; Tue, 14 Jul 2015 10:22:03 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C4B5E925 for ; Tue, 14 Jul 2015 10:22:03 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6EAM3j4041057 for ; Tue, 14 Jul 2015 10:22:03 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6EAM1Lr041041 for svn-soc-all@FreeBSD.org; Tue, 14 Jul 2015 10:22:01 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 14 Jul 2015 10:22:01 GMT Message-Id: <201507141022.t6EAM1Lr041041@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288368 - in soc2015/stefano/ptnetmap/stable/10/sys/amd64: include vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jul 2015 10:22:04 -0000 Author: stefano Date: Tue Jul 14 10:22:01 2015 New Revision: 288368 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288368 Log: use vm_map_lookup() to find vm_object to map in the VM Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/include/vmm.h soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm.c soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_dev.c soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/include/vmm.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/include/vmm.h Tue Jul 14 09:25:10 2015 (r288367) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/include/vmm.h Tue Jul 14 10:22:01 2015 (r288368) @@ -172,7 +172,7 @@ const char *vm_name(struct vm *vm); int vm_malloc(struct vm *vm, vm_paddr_t gpa, size_t len); int vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa); -int vm_map_mmio_user(struct vm *vm, vm_paddr_t gpa, size_t len, void *buf, struct thread *td); +int vm_map_usermem(struct vm *vm, vm_paddr_t gpa, size_t len, void *buf, struct thread *td); int vm_unmap_mmio(struct vm *vm, vm_paddr_t gpa, size_t len); void *vm_gpa_hold(struct vm *, vm_paddr_t gpa, size_t len, int prot, void **cookie); Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm.c Tue Jul 14 09:25:10 2015 (r288367) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm.c Tue Jul 14 10:22:01 2015 (r288368) @@ -444,6 +444,7 @@ vhpet_cleanup(vm->vhpet); vatpic_cleanup(vm->vatpic); vioapic_cleanup(vm->vioapic); + vmm_usermem_cleanup(vm->vmspace); for (i = 0; i < VM_MAXCPU; i++) vcpu_cleanup(vm, i, destroy); @@ -506,28 +507,26 @@ static int vm_gpa_wire(struct vm *vm); int -vm_map_mmio_user(struct vm *vm, vm_paddr_t gpa, size_t len, void *buf, struct thread *td) +vm_map_usermem(struct vm *vm, vm_paddr_t gpa, size_t len, void *buf, struct thread *td) { vm_object_t obj; int error; - if ((obj = vmm_mmio_alloc_user(vm->vmspace, gpa, len, buf, td)) == NULL) + + if ((obj = vmm_usermem_alloc(vm->vmspace, gpa, len, buf, td)) == NULL) return (ENOMEM); +#if 0 error = vm_gpa_wire(vm); /* XXX-ste: is needed? */ if (error) goto err; - - - error = vmm_usermem_add(vm, gpa, len); - if (error) - goto err; +#endif return (0); -err: - vmm_mmio_free(vm->vmspace, gpa, len); +//err: + vmm_usermem_free(vm->vmspace, gpa, len); return (error); } @@ -555,7 +554,7 @@ if (ppt_is_mmio(vm, gpa)) return (TRUE); /* 'gpa' is pci passthru mmio */ - if (usermem_is_mmio(vm, gpa)) + if (usermem_mapped(vm->vmspace, gpa)) return (TRUE); /* 'gpa' is user-space buffer mapped */ return (FALSE); Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_dev.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_dev.c Tue Jul 14 09:25:10 2015 (r288367) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_dev.c Tue Jul 14 10:22:01 2015 (r288368) @@ -164,7 +164,7 @@ struct vm_pptdev_mmio *pptmmio; struct vm_pptdev_msi *pptmsi; struct vm_pptdev_msix *pptmsix; - struct vm_user_buf *usermmio; + struct vm_user_buf *usermem; struct vm_nmi *vmnmi; struct vm_stats *vmstats; struct vm_stat_desc *statdesc; @@ -298,9 +298,9 @@ pptmmio->hpa); break; case VM_MAP_USER_BUF: - usermmio = (struct vm_user_buf *)data; - error = vm_map_mmio_user(sc->vm, usermmio->gpa, usermmio->len, - usermmio->addr, td); + usermem = (struct vm_user_buf *)data; + error = vm_map_usermem(sc->vm, usermem->gpa, usermem->len, + usermem->addr, td); break; case VM_BIND_PPTDEV: pptdev = (struct vm_pptdev *)data; Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c Tue Jul 14 09:25:10 2015 (r288367) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c Tue Jul 14 10:22:01 2015 (r288368) @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -46,24 +47,25 @@ #include +#include "vmm_mem.h" #include "vmm_usermem.h" #define MAX_USERMEMS 64 static struct usermem { - struct vm *vm; /* owner of this device */ + struct vmspace *vmspace; /* guest address space */ vm_paddr_t gpa; size_t len; } usermems[MAX_USERMEMS]; -int -vmm_usermem_add(struct vm *vm, vm_paddr_t gpa, size_t len) +static int +vmm_usermem_add(struct vmspace *vmspace, vm_paddr_t gpa, size_t len) { int i; for (i = 0; i < MAX_USERMEMS; i++) { if (usermems[i].len == 0) { - usermems[i].vm = vm; + usermems[i].vmspace = vmspace; usermems[i].gpa = gpa; usermems[i].len = len; break; @@ -78,26 +80,29 @@ return 0; } -void -vmm_usermem_del(struct vm *vm, vm_paddr_t gpa, size_t len) +static int +vmm_usermem_del(struct vmspace *vmspace, vm_paddr_t gpa, size_t len) { int i; for (i = 0; i < MAX_USERMEMS; i++) { - if (usermems[i].vm == vm && usermems[i].gpa == gpa + if (usermems[i].vmspace == vmspace && usermems[i].gpa == gpa && usermems[i].len == len) { bzero(&usermems[i], sizeof(struct usermem)); + return 1; } } + + return 0; } boolean_t -usermem_is_mmio(struct vm *vm, vm_paddr_t gpa) +usermem_mapped(struct vmspace *vmspace, vm_paddr_t gpa) { int i; for (i = 0; i < MAX_USERMEMS; i++) { - if (usermems[i].vm != vm || usermems[i].len == 0) + if (usermems[i].vmspace != vmspace || usermems[i].len == 0) continue; if (gpa >= usermems[i].gpa && gpa < usermems[i].gpa + usermems[i].len) @@ -105,3 +110,65 @@ } return (FALSE); } + +vm_object_t +vmm_usermem_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len, + void *buf, struct thread *td) +{ + int error; + vm_object_t obj; + vm_map_t map; + vm_map_entry_t entry; + vm_pindex_t index; + vm_prot_t prot; + boolean_t wired; + + map = &td->td_proc->p_vmspace->vm_map; + /* lookup the vm_object that describe user addr */ + error = vm_map_lookup(&map, (unsigned long)buf, VM_PROT_RW, &entry, + &obj, &index, &prot, &wired); + + printf("---- guest MAP vm_object_t: %p vm_pindex: %ld ----\n", obj, index); + /* map th vm_object in the vmspace */ + if (obj != NULL) { + error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len, 0, + VMFS_NO_SPACE, VM_PROT_RW, VM_PROT_RW, 0); + if (error != KERN_SUCCESS) { + vm_object_deallocate(obj); + obj = NULL; + } + } + vm_map_lookup_done(map, entry); + + /* acquire the reference to the vm_object */ + if (obj != NULL) { + vm_object_reference(obj); + vmm_usermem_add(vmspace, gpa, len); + } + + return (obj); +} + +void +vmm_usermem_free(struct vmspace *vmspace, vm_paddr_t gpa, size_t len) +{ + int ret; + + ret = vmm_usermem_del(vmspace, gpa, len); + if (ret) { + vmm_mem_free(vmspace, gpa, len); + } +} + +void +vmm_usermem_cleanup(struct vmspace *vmspace) +{ + int i; + + for (i = 0; i < MAX_USERMEMS; i++) { + if (usermems[i].vmspace == vmspace) { + vmm_mem_free(vmspace, usermems[i].gpa, usermems[i].len); + bzero(&usermems[i], sizeof(struct usermem)); + } + } +} Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.h Tue Jul 14 09:25:10 2015 (r288367) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.h Tue Jul 14 10:22:01 2015 (r288368) @@ -31,10 +31,10 @@ struct vm; -int vmm_usermem_add(struct vm *, vm_paddr_t gpa, - size_t len); -void vmm_usermem_del(struct vm *, vm_paddr_t gpa, - size_t len); -boolean_t usermem_is_mmio(struct vm *, vm_paddr_t gpa); +struct vm_object *vmm_usermem_alloc(struct vmspace *, vm_paddr_t gpa, + size_t len, void *buf, struct thread *td); +void vmm_usermem_free(struct vmspace *, vm_paddr_t gpa, size_t len); +void vmm_usermem_cleanup(struct vmspace *); +boolean_t usermem_mapped(struct vmspace *, vm_paddr_t gpa); #endif