Date: Tue, 20 Aug 2013 07:48:21 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254557 - projects/bhyve_npt_pmap/sys/amd64/vmm Message-ID: <201308200748.r7K7mLNx091296@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308200748.r7K7mLNx091296>