Date: Sun, 7 Jul 2013 04:16:32 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r252911 - projects/bhyve_npt_pmap/sys/amd64/vmm Message-ID: <201307070416.r674GW46036179@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: neel Date: Sun Jul 7 04:16:31 2013 New Revision: 252911 URL: http://svnweb.freebsd.org/changeset/base/252911 Log: Add mappings to guest's vm_map at the same time as creating the vm_object that backs those mappings. Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c 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.c ============================================================================== --- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c Sun Jul 7 02:49:48 2013 (r252910) +++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c Sun Jul 7 04:16:31 2013 (r252911) @@ -315,7 +315,7 @@ vm_free_mem_seg(struct vm *vm, struct me { if (seg->object != NULL) - vmm_mem_free(seg->object); + vmm_mem_free(vm->vmspace, seg->gpa, seg->len); bzero(seg, sizeof(*seg)); } @@ -430,7 +430,7 @@ vm_malloc(struct vm *vm, vm_paddr_t gpa, seg = &vm->mem_segs[vm->num_mem_segs]; - if ((object = vmm_mem_alloc(len)) == NULL) + if ((object = vmm_mem_alloc(vm->vmspace, gpa, len)) == NULL) return (ENOMEM); seg->gpa = gpa; Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c ============================================================================== --- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c Sun Jul 7 02:49:48 2013 (r252910) +++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.c Sun Jul 7 04:16:31 2013 (r252911) @@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.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 <machine/md_var.h> @@ -47,22 +50,35 @@ vmm_mem_init(void) } vm_object_t -vmm_mem_alloc(size_t size) +vmm_mem_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len) { + int error; vm_object_t obj; - if (size & PAGE_MASK) - panic("vmm_mem_alloc: invalid allocation size %lu", size); + if (gpa & PAGE_MASK) + panic("vmm_mem_alloc: invalid gpa %#lx", gpa); + + if (len == 0 || (len & PAGE_MASK) != 0) + panic("vmm_mem_alloc: invalid allocation size %lu", len); + + obj = vm_object_allocate(OBJT_DEFAULT, len >> PAGE_SHIFT); + if (obj != NULL) { + error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len, + VMFS_NO_SPACE, VM_PROT_ALL, VM_PROT_ALL, 0); + if (error != KERN_SUCCESS) { + vm_object_deallocate(obj); + obj = NULL; + } + } - obj = vm_object_allocate(OBJT_DEFAULT, size >> PAGE_SHIFT); return (obj); } void -vmm_mem_free(vm_object_t obj) +vmm_mem_free(struct vmspace *vmspace, vm_paddr_t gpa, size_t len) { - vm_object_deallocate(obj); + vm_map_remove(&vmspace->vm_map, gpa, gpa + len); } vm_paddr_t Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h ============================================================================== --- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h Sun Jul 7 02:49:48 2013 (r252910) +++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm_mem.h Sun Jul 7 04:16:31 2013 (r252911) @@ -29,11 +29,12 @@ #ifndef _VMM_MEM_H_ #define _VMM_MEM_H_ +struct vmspace; struct vm_object; int vmm_mem_init(void); -struct vm_object *vmm_mem_alloc(size_t size); -void vmm_mem_free(struct vm_object *obj); +struct vm_object *vmm_mem_alloc(struct vmspace *, vm_paddr_t gpa, size_t size); +void vmm_mem_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?201307070416.r674GW46036179>