socsvn commit: r288368 - in soc2015/stefano/ptnetmap/stable/10/sys/amd64: include vmm
stefano at FreeBSD.org
stefano at FreeBSD.org
Tue Jul 14 10:22:04 UTC 2015
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
More information about the svn-soc-all
mailing list