Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Jul 2013 02:49:48 +0000 (UTC)
From:      Neel Natu <neel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r252910 - in projects/bhyve_npt_pmap/sys/amd64: include vmm vmm/amd vmm/intel
Message-ID:  <201307070249.r672nmYc008991@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: neel
Date: Sun Jul  7 02:49:48 2013
New Revision: 252910
URL: http://svnweb.freebsd.org/changeset/base/252910

Log:
  The nested page tables are now maintained by the VM subsystem.
  
  Remove the redundant 'pml4ept[]' and point the EPT to the physical address
  of 'pm_pml4' instead.
  
  Also get rid of the 'ept_vmcleanup()' function since this is now done by
  'pmap_release()'.

Modified:
  projects/bhyve_npt_pmap/sys/amd64/include/vmm.h
  projects/bhyve_npt_pmap/sys/amd64/vmm/amd/amdv.c
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.h
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.h
  projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c

Modified: projects/bhyve_npt_pmap/sys/amd64/include/vmm.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/include/vmm.h	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/include/vmm.h	Sun Jul  7 02:49:48 2013	(r252910)
@@ -41,12 +41,13 @@ struct vm_run;
 struct vlapic;
 struct vmspace;
 struct vm_object;
+struct pmap;
 
 enum x2apic_state;
 
 typedef int	(*vmm_init_func_t)(void);
 typedef int	(*vmm_cleanup_func_t)(void);
-typedef void *	(*vmi_init_func_t)(struct vm *vm); /* instance specific apis */
+typedef void *	(*vmi_init_func_t)(struct vm *vm, struct pmap *pmap);
 typedef int	(*vmi_run_func_t)(void *vmi, int vcpu, register_t rip);
 typedef void	(*vmi_cleanup_func_t)(void *vmi);
 typedef int	(*vmi_get_register_t)(void *vmi, int vcpu, int num,

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/amd/amdv.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/amd/amdv.c	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/amd/amdv.c	Sun Jul  7 02:49:48 2013	(r252910)
@@ -54,7 +54,7 @@ amdv_cleanup(void)
 }
 
 static void *
-amdv_vminit(struct vm *vm)
+amdv_vminit(struct vm *vm, struct pmap *pmap)
 {
 
 	printf("amdv_vminit: not implemented\n");

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.c	Sun Jul  7 02:49:48 2013	(r252910)
@@ -152,79 +152,6 @@ ept_dump(uint64_t *ptp, int nlevels)
 #endif
 
 static void
-ept_free_pt_entry(pt_entry_t pte)
-{
-	if (pte == 0)
-		return;
-
-	/* sanity check */
-	if ((pte & EPT_PG_SUPERPAGE) != 0)
-		panic("ept_free_pt_entry: pte cannot have superpage bit");
-
-	return;
-}
-
-static void
-ept_free_pd_entry(pd_entry_t pde)
-{
-	pt_entry_t	*pt;
-	int		i;
-
-	if (pde == 0)
-		return;
-
-	if ((pde & EPT_PG_SUPERPAGE) == 0) {
-		pt = (pt_entry_t *)PHYS_TO_DMAP(pde & EPT_ADDR_MASK);
-		for (i = 0; i < NPTEPG; i++)
-			ept_free_pt_entry(pt[i]);
-		free(pt, M_VMX);	/* free the page table page */
-	}
-}
-
-static void
-ept_free_pdp_entry(pdp_entry_t pdpe)
-{
-	pd_entry_t 	*pd;
-	int		 i;
-
-	if (pdpe == 0)
-		return;
-
-	if ((pdpe & EPT_PG_SUPERPAGE) == 0) {
-		pd = (pd_entry_t *)PHYS_TO_DMAP(pdpe & EPT_ADDR_MASK);
-		for (i = 0; i < NPDEPG; i++)
-			ept_free_pd_entry(pd[i]);
-		free(pd, M_VMX);	/* free the page directory page */
-	}
-}
-
-static void
-ept_free_pml4_entry(pml4_entry_t pml4e)
-{
-	pdp_entry_t	*pdp;
-	int		i;
-
-	if (pml4e == 0)
-		return;
-
-	if ((pml4e & EPT_PG_SUPERPAGE) == 0) {
-		pdp = (pdp_entry_t *)PHYS_TO_DMAP(pml4e & EPT_ADDR_MASK);
-		for (i = 0; i < NPDPEPG; i++)
-			ept_free_pdp_entry(pdp[i]);
-		free(pdp, M_VMX);	/* free the page directory ptr page */
-	}
-}
-
-void
-ept_vmcleanup(struct vmx *vmx)
-{
-	int 		 i;
-
-	for (i = 0; i < NPML4EPG; i++)
-		ept_free_pml4_entry(vmx->pml4ept[i]);
-}
-
-static void
 invept_single_context(void *arg)
 {
 	struct invept_desc desc = *(struct invept_desc *)arg;

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.h	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/ept.h	Sun Jul  7 02:49:48 2013	(r252910)
@@ -36,7 +36,6 @@ struct vmx;
 
 int	ept_init(void);
 void	ept_invalidate_mappings(u_long ept_pml4);
-void	ept_vmcleanup(struct vmx *vmx);
 struct vmspace *ept_vmspace_alloc(vm_offset_t min, vm_offset_t max);
 void	ept_vmspace_free(struct vmspace *vmspace);
 #endif

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c	Sun Jul  7 02:49:48 2013	(r252910)
@@ -681,7 +681,7 @@ vmx_setup_cr_shadow(int which, struct vm
 #define	vmx_setup_cr4_shadow(vmcs)	vmx_setup_cr_shadow(4, (vmcs))
 
 static void *
-vmx_vminit(struct vm *vm)
+vmx_vminit(struct vm *vm, pmap_t pmap)
 {
 	uint16_t vpid;
 	int i, error, guest_msr_count;
@@ -694,6 +694,8 @@ vmx_vminit(struct vm *vm)
 	}
 	vmx->vm = vm;
 
+	vmx->eptphys = vtophys((vm_offset_t)pmap->pm_pml4);
+
 	/*
 	 * Clean up EPTP-tagged guest physical and combined mappings
 	 *
@@ -703,7 +705,7 @@ vmx_vminit(struct vm *vm)
 	 *
 	 * Combined mappings for this EP4TA are also invalidated for all VPIDs.
 	 */
-	ept_invalidate_mappings(vtophys(vmx->pml4ept));
+	ept_invalidate_mappings(vmx->eptphys);
 
 	msr_bitmap_initialize(vmx->msr_bitmap);
 
@@ -759,7 +761,7 @@ vmx_vminit(struct vm *vm)
 		error = vmcs_set_defaults(&vmx->vmcs[i],
 					  (u_long)vmx_longjmp,
 					  (u_long)&vmx->ctx[i],
-					  vtophys(vmx->pml4ept),
+					  vmx->eptphys,
 					  pinbased_ctls,
 					  procbased_ctls,
 					  procbased_ctls2,
@@ -1543,7 +1545,6 @@ vmx_vmcleanup(void *arg)
 	if (error != 0)
 		panic("vmx_vmcleanup: vmclear error %d on vcpu 0", error);
 
-	ept_vmcleanup(vmx);
 	free(vmx, M_VMX);
 
 	return;

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.h	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.h	Sun Jul  7 02:49:48 2013	(r252910)
@@ -82,16 +82,15 @@ struct vmxstate {
 
 /* virtual machine softc */
 struct vmx {
-	pml4_entry_t	pml4ept[NPML4EPG];
 	struct vmcs	vmcs[VM_MAXCPU];	/* one vmcs per virtual cpu */
 	char		msr_bitmap[PAGE_SIZE];
 	struct msr_entry guest_msrs[VM_MAXCPU][GUEST_MSR_MAX_ENTRIES];
 	struct vmxctx	ctx[VM_MAXCPU];
 	struct vmxcap	cap[VM_MAXCPU];
 	struct vmxstate	state[VM_MAXCPU];
+	vm_paddr_t	eptphys;
 	struct vm	*vm;
 };
-CTASSERT((offsetof(struct vmx, pml4ept) & PAGE_MASK) == 0);
 CTASSERT((offsetof(struct vmx, vmcs) & PAGE_MASK) == 0);
 CTASSERT((offsetof(struct vmx, msr_bitmap) & PAGE_MASK) == 0);
 CTASSERT((offsetof(struct vmx, guest_msrs) & 15) == 0);

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c	Sun Jul  7 02:17:49 2013	(r252909)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/vmm.c	Sun Jul  7 02:49:48 2013	(r252910)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
 #include <vm/pmap.h>
+#include <vm/vm_map.h>
 
 #include <machine/vm.h>
 #include <machine/pcb.h>
@@ -121,7 +122,7 @@ static struct vmm_ops *ops;
 #define	VMM_INIT()	(ops != NULL ? (*ops->init)() : 0)
 #define	VMM_CLEANUP()	(ops != NULL ? (*ops->cleanup)() : 0)
 
-#define	VMINIT(vm)	(ops != NULL ? (*ops->vminit)(vm): NULL)
+#define	VMINIT(vm, pmap) (ops != NULL ? (*ops->vminit)(vm, pmap): NULL)
 #define	VMRUN(vmi, vcpu, rip) \
 	(ops != NULL ? (*ops->vmrun)(vmi, vcpu, rip) : ENXIO)
 #define	VMCLEANUP(vmi)	(ops != NULL ? (*ops->vmcleanup)(vmi) : NULL)
@@ -290,7 +291,7 @@ vm_create(const char *name, struct vm **
 
 	vm = malloc(sizeof(struct vm), M_VM, M_WAITOK | M_ZERO);
 	strcpy(vm->name, name);
-	vm->cookie = VMINIT(vm);
+	vm->cookie = VMINIT(vm, vmspace_pmap(vmspace));
 
 	for (i = 0; i < VM_MAXCPU; i++) {
 		vcpu_init(vm, i);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307070249.r672nmYc008991>