svn commit: r254557 - projects/bhyve_npt_pmap/sys/amd64/vmm
Neel Natu
neel at FreeBSD.org
Tue Aug 20 07:48:21 UTC 2013
Author: neel
Date: Tue Aug 20 07:48:20 2013
New Revision: 254557
URL: http://svnweb.freebsd.org/changeset/base/254557
Log:
APIs to manipulate guest physical address space mappings to host MMIO regions.
These APIs will be used for mapping BARs of the pci passthru devices assigned
to the guest.
Modified:
projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c
projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h
Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c Tue Aug 20 07:40:40 2013 (r254556)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c Tue Aug 20 07:48:20 2013 (r254557)
@@ -31,12 +31,18 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/sglist.h>
+#include <sys/lock.h>
+#include <sys/rwlock.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
+#include <vm/vm_page.h>
+#include <vm/vm_pager.h>
#include <machine/md_var.h>
@@ -50,6 +56,65 @@ vmm_mem_init(void)
}
vm_object_t
+vmm_mmio_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len,
+ vm_paddr_t hpa)
+{
+ int error;
+ vm_object_t obj;
+ struct sglist *sg;
+
+ sg = sglist_alloc(1, M_WAITOK);
+ error = sglist_append_phys(sg, hpa, len);
+ KASSERT(error == 0, ("error %d appending physaddr to sglist", error));
+
+ obj = vm_pager_allocate(OBJT_SG, sg, len, VM_PROT_RW, 0, NULL);
+ if (obj != NULL) {
+ /*
+ * VT-x ignores the MTRR settings when figuring out the
+ * memory type for translations obtained through EPT.
+ *
+ * Therefore we explicitly force the pages provided by
+ * this object to be mapped as uncacheable.
+ */
+ VM_OBJECT_WLOCK(obj);
+ error = vm_object_set_memattr(obj, VM_MEMATTR_UNCACHEABLE);
+ VM_OBJECT_WUNLOCK(obj);
+ if (error != KERN_SUCCESS) {
+ panic("vmm_mmio_alloc: vm_object_set_memattr error %d",
+ error);
+ }
+ error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len,
+ VMFS_NO_SPACE, VM_PROT_RW, VM_PROT_RW, 0);
+ if (error != KERN_SUCCESS) {
+ vm_object_deallocate(obj);
+ obj = NULL;
+ }
+ }
+
+ /*
+ * Drop the reference on the sglist.
+ *
+ * If the scatter/gather object was successfully allocated then it
+ * has incremented the reference count on the sglist. Dropping the
+ * initial reference count ensures that the sglist will be freed
+ * when the object is deallocated.
+ *
+ * If the object could not be allocated then we end up freeing the
+ * sglist.
+ */
+ sglist_free(sg);
+
+ return (obj);
+}
+
+void
+vmm_mmio_free(struct vmspace *vmspace, vm_paddr_t gpa, size_t len)
+{
+
+ vm_map_remove(&vmspace->vm_map, gpa, gpa + len);
+}
+
+vm_object_t
vmm_mem_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len)
{
int error;
Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h Tue Aug 20 07:40:40 2013 (r254556)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h Tue Aug 20 07:48:20 2013 (r254557)
@@ -34,7 +34,10 @@ struct vm_object;
int vmm_mem_init(void);
struct vm_object *vmm_mem_alloc(struct vmspace *, vm_paddr_t gpa, size_t size);
+struct vm_object *vmm_mmio_alloc(struct vmspace *, vm_paddr_t gpa, size_t len,
+ vm_paddr_t hpa);
void vmm_mem_free(struct vmspace *, vm_paddr_t gpa, size_t size);
+void vmm_mmio_free(struct vmspace *, vm_paddr_t gpa, size_t size);
vm_paddr_t vmm_mem_maxaddr(void);
#endif
More information about the svn-src-projects
mailing list