From owner-svn-src-projects@FreeBSD.ORG Tue Jul 23 05:04:30 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 45AE53D4; Tue, 23 Jul 2013 05:04:30 +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 25E062646; Tue, 23 Jul 2013 05:04:30 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r6N54TGc067222; Tue, 23 Jul 2013 05:04:29 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r6N54THe067219; Tue, 23 Jul 2013 05:04:29 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201307230504.r6N54THe067219@svn.freebsd.org> From: Neel Natu Date: Tue, 23 Jul 2013 05:04:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r253561 - in projects/bhyve_npt_pmap/sys/amd64: include vmm/intel 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, 23 Jul 2013 05:04:30 -0000 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;