From owner-svn-src-projects@FreeBSD.ORG Wed Nov 28 13:10:18 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D381DB95; Wed, 28 Nov 2012 13:10:18 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id BB6FC8FC0C; Wed, 28 Nov 2012 13:10:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qASDAIiQ033908; Wed, 28 Nov 2012 13:10:18 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qASDAIjd033905; Wed, 28 Nov 2012 13:10:18 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201211281310.qASDAIjd033905@svn.freebsd.org> From: Neel Natu Date: Wed, 28 Nov 2012 13:10:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r243650 - in projects/bhyve/sys/amd64/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: Wed, 28 Nov 2012 13:10:18 -0000 Author: neel Date: Wed Nov 28 13:10:18 2012 New Revision: 243650 URL: http://svnweb.freebsd.org/changeset/base/243650 Log: Change emulate_rdmsr() and emulate_wrmsr() to return 0 on sucess and errno on failure. The conversion from the return value to HANDLED or UNHANDLED can be done locally in vmx_exit_process(). Obtained from: NetApp Modified: projects/bhyve/sys/amd64/vmm/intel/vmx.c projects/bhyve/sys/amd64/vmm/vmm_lapic.c projects/bhyve/sys/amd64/vmm/vmm_msr.c Modified: projects/bhyve/sys/amd64/vmm/intel/vmx.c ============================================================================== --- projects/bhyve/sys/amd64/vmm/intel/vmx.c Wed Nov 28 11:47:47 2012 (r243649) +++ projects/bhyve/sys/amd64/vmm/intel/vmx.c Wed Nov 28 13:10:18 2012 (r243650) @@ -1214,23 +1214,25 @@ vmx_exit_process(struct vmx *vmx, int vc break; case EXIT_REASON_RDMSR: ecx = vmxctx->guest_rcx; - handled = emulate_rdmsr(vmx->vm, vcpu, ecx); - if (!handled) { + error = emulate_rdmsr(vmx->vm, vcpu, ecx); + if (error) { vmexit->exitcode = VM_EXITCODE_RDMSR; vmexit->u.msr.code = ecx; - } + } else + handled = 1; break; case EXIT_REASON_WRMSR: eax = vmxctx->guest_rax; ecx = vmxctx->guest_rcx; edx = vmxctx->guest_rdx; - handled = emulate_wrmsr(vmx->vm, vcpu, ecx, + error = emulate_wrmsr(vmx->vm, vcpu, ecx, (uint64_t)edx << 32 | eax); - if (!handled) { + if (error) { vmexit->exitcode = VM_EXITCODE_WRMSR; vmexit->u.msr.code = ecx; vmexit->u.msr.wval = (uint64_t)edx << 32 | eax; - } + } else + handled = 1; break; case EXIT_REASON_HLT: vmm_stat_incr(vmx->vm, vcpu, VMEXIT_HLT, 1); Modified: projects/bhyve/sys/amd64/vmm/vmm_lapic.c ============================================================================== --- projects/bhyve/sys/amd64/vmm/vmm_lapic.c Wed Nov 28 11:47:47 2012 (r243649) +++ projects/bhyve/sys/amd64/vmm/vmm_lapic.c Wed Nov 28 13:10:18 2012 (r243650) @@ -41,32 +41,6 @@ __FBSDID("$FreeBSD$"); #include "vmm_lapic.h" #include "vlapic.h" -static int -lapic_write(struct vlapic *vlapic, u_int offset, uint64_t val) -{ - int handled; - - if (vlapic_op_mem_write(vlapic, offset, DWORD, val) == 0) - handled = 1; - else - handled = 0; - - return (handled); -} - -static int -lapic_read(struct vlapic *vlapic, u_int offset, uint64_t *rv) -{ - int handled; - - if (vlapic_op_mem_read(vlapic, offset, DWORD, rv) == 0) - handled = 1; - else - handled = 0; - - return (handled); -} - int lapic_pending_intr(struct vm *vm, int cpu) { @@ -145,35 +119,41 @@ lapic_msr(u_int msr) int lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval) { - int handled; + int error; + u_int offset; struct vlapic *vlapic; vlapic = vm_lapic(vm, cpu); if (msr == MSR_APICBASE) { *rval = vlapic_get_apicbase(vlapic); - handled = 1; - } else - handled = lapic_read(vlapic, x2apic_msr_to_regoff(msr), rval); + error = 0; + } else { + offset = x2apic_msr_to_regoff(msr); + error = vlapic_op_mem_read(vlapic, offset, DWORD, rval); + } - return (handled); + return (error); } int lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t val) { - int handled; + int error; + u_int offset; struct vlapic *vlapic; vlapic = vm_lapic(vm, cpu); if (msr == MSR_APICBASE) { vlapic_set_apicbase(vlapic, val); - handled = 1; - } else - handled = lapic_write(vlapic, x2apic_msr_to_regoff(msr), val); + error = 0; + } else { + offset = x2apic_msr_to_regoff(msr); + error = vlapic_op_mem_write(vlapic, offset, DWORD, val); + } - return (handled); + return (error); } int Modified: projects/bhyve/sys/amd64/vmm/vmm_msr.c ============================================================================== --- projects/bhyve/sys/amd64/vmm/vmm_msr.c Wed Nov 28 11:47:47 2012 (r243649) +++ projects/bhyve/sys/amd64/vmm/vmm_msr.c Wed Nov 28 13:10:18 2012 (r243650) @@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$"); #define VMM_MSR_F_EMULATE 0x01 #define VMM_MSR_F_READONLY 0x02 -#define VMM_MSR_F_INVALID 0x04 +#define VMM_MSR_F_INVALID 0x04 /* guest_msr_valid() can override this */ struct vmm_msr { int num; @@ -137,20 +137,15 @@ msr_num_to_idx(u_int num) int emulate_wrmsr(struct vm *vm, int cpu, u_int num, uint64_t val) { - int handled, idx; + int idx; uint64_t *guest_msrs; - handled = 0; - if (lapic_msr(num)) return (lapic_wrmsr(vm, cpu, num, val)); idx = msr_num_to_idx(num); - if (idx < 0) - goto done; - - if (invalid_msr(idx)) - goto done; + if (idx < 0 || invalid_msr(idx)) + return (EINVAL); if (!readonly_msr(idx)) { guest_msrs = vm_guest_msrs(vm, cpu); @@ -163,31 +158,26 @@ emulate_wrmsr(struct vm *vm, int cpu, u_ wrmsr(vmm_msr[idx].num, val); } - handled = 1; -done: - return (handled); + return (0); } int emulate_rdmsr(struct vm *vm, int cpu, u_int num) { - int error, handled, idx; + int error, idx; uint32_t eax, edx; uint64_t result, *guest_msrs; - handled = 0; - if (lapic_msr(num)) { - handled = lapic_rdmsr(vm, cpu, num, &result); + error = lapic_rdmsr(vm, cpu, num, &result); goto done; } idx = msr_num_to_idx(num); - if (idx < 0) - goto done; - - if (invalid_msr(idx)) + if (idx < 0 || invalid_msr(idx)) { + error = EINVAL; goto done; + } guest_msrs = vm_guest_msrs(vm, cpu); result = guest_msrs[idx]; @@ -202,10 +192,10 @@ emulate_rdmsr(struct vm *vm, int cpu, u_ result, rdmsr(num)); } - handled = 1; + error = 0; done: - if (handled) { + if (error == 0) { eax = result; edx = result >> 32; error = vm_set_register(vm, cpu, VM_REG_GUEST_RAX, eax); @@ -215,7 +205,7 @@ done: if (error) panic("vm_set_register(rdx) error %d", error); } - return (handled); + return (error); } void