From owner-svn-src-all@FreeBSD.ORG Tue Jan 7 18:53:15 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 0B9257F3; Tue, 7 Jan 2014 18:53:15 +0000 (UTC) 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 D02241365; Tue, 7 Jan 2014 18:53:14 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id s07IrEsE043535; Tue, 7 Jan 2014 18:53:14 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id s07IrEBR043534; Tue, 7 Jan 2014 18:53:14 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201401071853.s07IrEBR043534@svn.freebsd.org> From: Neel Natu Date: Tue, 7 Jan 2014 18:53:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r260397 - head/sys/amd64/vmm/intel X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Jan 2014 18:53:15 -0000 Author: neel Date: Tue Jan 7 18:53:14 2014 New Revision: 260397 URL: http://svnweb.freebsd.org/changeset/base/260397 Log: Fix a bug introduced in r260167 related to VM-exit tracing. Keep a copy of the 'rip' and the 'exit_reason' and use that when calling vmx_exit_trace(). This is because both the 'rip' and 'exit_reason' can be changed by 'vmx_exit_process()' and can lead to very misleading traces. Modified: head/sys/amd64/vmm/intel/vmx.c Modified: head/sys/amd64/vmm/intel/vmx.c ============================================================================== --- head/sys/amd64/vmm/intel/vmx.c Tue Jan 7 18:34:02 2014 (r260396) +++ head/sys/amd64/vmm/intel/vmx.c Tue Jan 7 18:53:14 2014 (r260397) @@ -1192,12 +1192,6 @@ vmx_exit_process(struct vmx *vmx, int vc handled = 0; vmxctx = &vmx->ctx[vcpu]; - /* Collect some information for VM exit processing */ - vmexit->rip = vmcs_guest_rip(); - vmexit->inst_length = vmexit_instruction_length(); - vmexit->u.vmx.exit_reason = vmcs_exit_reason(); - vmexit->u.vmx.exit_qualification = vmcs_exit_qualification(); - qual = vmexit->u.vmx.exit_qualification; reason = vmexit->u.vmx.exit_reason; vmexit->exitcode = VM_EXITCODE_BOGUS; @@ -1406,9 +1400,7 @@ vmx_exit_inst_error(struct vmxctx *vmxct ("vmx_exit_inst_error: invalid inst_fail_status %d", vmxctx->inst_fail_status)); - vmexit->rip = vmcs_guest_rip(); vmexit->inst_length = 0; - vmexit->exitcode = VM_EXITCODE_VMX; vmexit->u.vmx.status = vmxctx->inst_fail_status; vmexit->u.vmx.inst_error = vmcs_instruction_error(); @@ -1437,6 +1429,8 @@ vmx_run(void *arg, int vcpu, register_t struct vmcs *vmcs; struct vm_exit *vmexit; struct vlapic *vlapic; + uint64_t rip; + uint32_t exit_reason; vmx = arg; vmcs = &vmx->vmcs[vcpu]; @@ -1493,7 +1487,15 @@ vmx_run(void *arg, int vcpu, register_t vmx_inject_interrupts(vmx, vcpu, vlapic); vmx_run_trace(vmx, vcpu); rc = vmx_enter_guest(vmxctx, launched); + enable_intr(); + + /* Collect some information for VM exit processing */ + vmexit->rip = rip = vmcs_guest_rip(); + vmexit->inst_length = vmexit_instruction_length(); + vmexit->u.vmx.exit_reason = exit_reason = vmcs_exit_reason(); + vmexit->u.vmx.exit_qualification = vmcs_exit_qualification(); + if (rc == VMX_GUEST_VMEXIT) { launched = 1; handled = vmx_exit_process(vmx, vcpu, vmexit); @@ -1501,8 +1503,7 @@ vmx_run(void *arg, int vcpu, register_t handled = vmx_exit_inst_error(vmxctx, rc, vmexit); } - vmx_exit_trace(vmx, vcpu, vmexit->rip, - vmexit->u.vmx.exit_reason, handled); + vmx_exit_trace(vmx, vcpu, rip, exit_reason, handled); } while (handled); /*