From owner-svn-src-projects@FreeBSD.ORG Tue Aug 20 07:48:21 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 93196812; Tue, 20 Aug 2013 07:48:21 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 8196529C8; Tue, 20 Aug 2013 07:48:21 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7K7mLID091298; Tue, 20 Aug 2013 07:48:21 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7K7mLNx091296; Tue, 20 Aug 2013 07:48:21 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201308200748.r7K7mLNx091296@svn.freebsd.org> From: Neel Natu Date: Tue, 20 Aug 2013 07:48:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254557 - projects/bhyve_npt_pmap/sys/amd64/vmm X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Aug 2013 07:48:21 -0000 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 #include +#include +#include +#include +#include #include #include #include #include #include +#include +#include #include @@ -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