svn commit: r253561 - in projects/bhyve_npt_pmap/sys/amd64: include vmm/intel

Neel Natu neel at FreeBSD.org
Tue Jul 23 05:04:30 UTC 2013


Author: neel
Date: Tue Jul 23 05:04:28 2013
New Revision: 253561
URL: http://svnweb.freebsd.org/changeset/base/253561

Log:
  Populate the guest physical address's protection bits in the vmexit collateral.

Modified:
  projects/bhyve_npt_pmap/sys/amd64/include/vmm.h
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmcs.h
  projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c

Modified: projects/bhyve_npt_pmap/sys/amd64/include/vmm.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/include/vmm.h	Tue Jul 23 03:03:17 2013	(r253560)
+++ projects/bhyve_npt_pmap/sys/amd64/include/vmm.h	Tue Jul 23 05:04:28 2013	(r253561)
@@ -275,6 +275,7 @@ struct vm_exit {
 		struct {
 			uint64_t	gpa;
 			int		fault_type;
+			int		protection;
 		} paging;
 		struct {
 			uint64_t	gpa;

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmcs.h
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmcs.h	Tue Jul 23 03:03:17 2013	(r253560)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmcs.h	Tue Jul 23 05:04:28 2013	(r253561)
@@ -332,6 +332,9 @@ uint64_t vmcs_read(uint32_t encoding);
 #define	EPT_VIOLATION_DATA_READ		(1UL << 0)
 #define	EPT_VIOLATION_DATA_WRITE	(1UL << 1)
 #define	EPT_VIOLATION_INST_FETCH	(1UL << 2)
+#define	EPT_VIOLATION_GPA_READABLE	(1UL << 3)
+#define	EPT_VIOLATION_GPA_WRITEABLE	(1UL << 4)
+#define	EPT_VIOLATION_GPA_EXECUTABLE	(1UL << 5)
 #define	EPT_VIOLATION_GLA_VALID		(1UL << 7)
 #define	EPT_VIOLATION_XLAT_VALID	(1UL << 8)
 

Modified: projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c
==============================================================================
--- projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c	Tue Jul 23 03:03:17 2013	(r253560)
+++ projects/bhyve_npt_pmap/sys/amd64/vmm/intel/vmx.c	Tue Jul 23 05:04:28 2013	(r253561)
@@ -1178,18 +1178,33 @@ vmx_emulate_cr_access(struct vmx *vmx, i
 static int
 ept_fault_type(uint64_t ept_qual)
 {
-	int fault_type = 0;
+	int fault_type;
 
-	if (ept_qual & EPT_VIOLATION_INST_FETCH)
-		fault_type |= VM_PROT_EXECUTE;
-	if (ept_qual & EPT_VIOLATION_DATA_READ)
-		fault_type |= VM_PROT_READ;
 	if (ept_qual & EPT_VIOLATION_DATA_WRITE)
-		fault_type |= VM_PROT_WRITE;
+		fault_type = VM_PROT_WRITE;
+	else if (ept_qual & EPT_VIOLATION_INST_FETCH)
+		fault_type = VM_PROT_EXECUTE;
+	else
+		fault_type= VM_PROT_READ;
 
 	return (fault_type);
 }
 
+static int
+ept_protection(uint64_t ept_qual)
+{
+	int prot = 0;
+
+	if (ept_qual & EPT_VIOLATION_GPA_READABLE)
+		prot |= VM_PROT_READ;
+	if (ept_qual & EPT_VIOLATION_GPA_WRITEABLE)
+		prot |= VM_PROT_WRITE;
+	if (ept_qual & EPT_VIOLATION_GPA_EXECUTABLE)
+		prot |= VM_PROT_EXECUTE;
+
+	return (prot);
+}
+
 static boolean_t
 ept_emulation_fault(uint64_t ept_qual)
 {
@@ -1342,6 +1357,7 @@ vmx_exit_process(struct vmx *vmx, int vc
 			vmexit->exitcode = VM_EXITCODE_PAGING;
 			vmexit->u.paging.gpa = gpa;
 			vmexit->u.paging.fault_type = ept_fault_type(qual);
+			vmexit->u.paging.protection = ept_protection(qual);
 		} else if (ept_emulation_fault(qual)) {
 			vmexit->exitcode = VM_EXITCODE_INST_EMUL;
 			vmexit->u.inst_emul.gpa = gpa;


More information about the svn-src-projects mailing list