Date: Sat, 6 Jul 2013 08:16:18 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r252868 - in projects/bhyve_npt_pmap/sys: amd64/vmm/intel vm Message-ID: <201307060816.r668GIvL079695@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: neel Date: Sat Jul 6 08:16:17 2013 New Revision: 252868 URL: http://svnweb.freebsd.org/changeset/base/252868 Log: Add a function pointer argument to 'vmspace_alloc()' that will be used to initialize the embedded pmap. This will be used by callers that want to create a pmap that is different than the one initialized by 'pmap_pinit()'. For e.g. bhyve will use this function pointer to create a nested pmap of type PT_EPT. Discussed with: kib Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c projects/bhyve_npt_pmap/sys/vm/vm_extern.h projects/bhyve_npt_pmap/sys/vm/vm_map.c Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c ============================================================================== --- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c Sat Jul 6 07:49:41 2013 (r252867) +++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c Sat Jul 6 08:16:17 2013 (r252868) @@ -393,25 +393,18 @@ ept_invalidate_mappings(u_long pml4ept) smp_rendezvous(NULL, invept_single_context, NULL, &invept_desc); } +static int +ept_pinit(pmap_t pmap) +{ + + return (pmap_pinit_type(pmap, PT_EPT)); +} + struct vmspace * ept_vmspace_alloc(vm_offset_t min, vm_offset_t max) { - pmap_t pmap; - int success; - struct vmspace *vmspace; - - vmspace = vmspace_alloc(min, max); - if (vmspace != NULL) { - /* - * Change the type of the pmap to PT_EPT. - */ - pmap = vmspace_pmap(vmspace); - pmap_release(pmap); - success = pmap_pinit_type(pmap, PT_EPT); - if (!success) - panic("ept_vmspace_alloc: pmap_pinit_type() failed!"); - } - return (vmspace); + + return (vmspace_alloc(min, max, ept_pinit)); } void Modified: projects/bhyve_npt_pmap/sys/vm/vm_extern.h ============================================================================== --- projects/bhyve_npt_pmap/sys/vm/vm_extern.h Sat Jul 6 07:49:41 2013 (r252867) +++ projects/bhyve_npt_pmap/sys/vm/vm_extern.h Sat Jul 6 08:16:17 2013 (r252868) @@ -33,6 +33,7 @@ #ifndef _VM_EXTERN_H_ #define _VM_EXTERN_H_ +struct pmap; struct proc; struct vmspace; struct vnode; @@ -75,7 +76,8 @@ int vm_mmap(vm_map_t, vm_offset_t *, vm_ int vm_mmap_to_errno(int rv); void vm_set_page_size(void); void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t); -struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t); +typedef int (*pmap_pinit_t)(struct pmap *pmap); +struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t, pmap_pinit_t); struct vmspace *vmspace_fork(struct vmspace *, vm_ooffset_t *); int vmspace_exec(struct proc *, vm_offset_t, vm_offset_t); int vmspace_unshare(struct proc *); Modified: projects/bhyve_npt_pmap/sys/vm/vm_map.c ============================================================================== --- projects/bhyve_npt_pmap/sys/vm/vm_map.c Sat Jul 6 07:49:41 2013 (r252867) +++ projects/bhyve_npt_pmap/sys/vm/vm_map.c Sat Jul 6 08:16:17 2013 (r252868) @@ -274,15 +274,22 @@ vm_map_zdtor(void *mem, int size, void * /* * Allocate a vmspace structure, including a vm_map and pmap, * and initialize those structures. The refcnt is set to 1. + * + * If 'pinit' is NULL then the embedded pmap is initialized via pmap_pinit(). */ struct vmspace * -vmspace_alloc(min, max) - vm_offset_t min, max; +vmspace_alloc(vm_offset_t min, vm_offset_t max, pmap_pinit_t pinit) { struct vmspace *vm; vm = uma_zalloc(vmspace_zone, M_WAITOK); - if (vm->vm_map.pmap == NULL && !pmap_pinit(vmspace_pmap(vm))) { + + KASSERT(vm->vm_map.pmap == NULL, ("vm_map.pmap must be NULL")); + + if (pinit == NULL) + pinit = &pmap_pinit; + + if (!pinit(vmspace_pmap(vm))) { uma_zfree(vmspace_zone, vm); return (NULL); } @@ -3097,7 +3104,7 @@ vmspace_fork(struct vmspace *vm1, vm_oof old_map = &vm1->vm_map; /* Copy immutable fields of vm1 to vm2. */ - vm2 = vmspace_alloc(old_map->min_offset, old_map->max_offset); + vm2 = vmspace_alloc(old_map->min_offset, old_map->max_offset, NULL); if (vm2 == NULL) return (NULL); vm2->vm_taddr = vm1->vm_taddr; @@ -3677,7 +3684,7 @@ vmspace_exec(struct proc *p, vm_offset_t struct vmspace *oldvmspace = p->p_vmspace; struct vmspace *newvmspace; - newvmspace = vmspace_alloc(minuser, maxuser); + newvmspace = vmspace_alloc(minuser, maxuser, NULL); if (newvmspace == NULL) return (ENOMEM); newvmspace->vm_swrss = oldvmspace->vm_swrss;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307060816.r668GIvL079695>