Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Jul 2015 10:22:01 GMT
From:      stefano@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r288368 - in soc2015/stefano/ptnetmap/stable/10/sys/amd64: include vmm
Message-ID:  <201507141022.t6EAM1Lr041041@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/sglist.h>
 #include <sys/lock.h>
 #include <sys/rwlock.h>
+#include <sys/proc.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -46,24 +47,25 @@
 
 #include <machine/md_var.h>
 
+#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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507141022.t6EAM1Lr041041>