From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Hornyack Subject: [RFC PATCH 1/5] KVM: x86: refactor vmx rdmsr/wrmsr completion into new functions Date: Tue, 18 Aug 2015 11:46:51 -0700 Message-ID: <1439923615-10600-2-git-send-email-peterhornyack@google.com> References: <1439923615-10600-1-git-send-email-peterhornyack@google.com> Cc: Joerg Roedel , Peter Hornyack To: kvm list , Gleb Natapov , Paolo Bonzini Return-path: Received: from mail-pa0-f47.google.com ([209.85.220.47]:35044 "EHLO mail-pa0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752630AbbHRSrc (ORCPT ); Tue, 18 Aug 2015 14:47:32 -0400 Received: by pacgr6 with SMTP id gr6so138389012pac.2 for ; Tue, 18 Aug 2015 11:47:32 -0700 (PDT) In-Reply-To: <1439923615-10600-1-git-send-email-peterhornyack@google.com> Sender: kvm-owner@vger.kernel.org List-ID: After handling a rdmsr or wrmsr, refactor the success and failure code paths into separate functions. This will allow us to also complete or fail MSR accesses on the entry path from userspace into kvm. Signed-off-by: Peter Hornyack --- arch/x86/kvm/vmx.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 37eae551857c..acc38e27d221 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -5463,6 +5463,34 @@ static int handle_cpuid(struct kvm_vcpu *vcpu) return 1; } +static void complete_rdmsr(struct kvm_vcpu *vcpu, const struct msr_data *msr) +{ + trace_kvm_msr_read(msr->index, msr->data); + + /* FIXME: handling of bits 32:63 of rax, rdx */ + vcpu->arch.regs[VCPU_REGS_RAX] = msr->data & -1u; + vcpu->arch.regs[VCPU_REGS_RDX] = (msr->data >> 32) & -1u; + skip_emulated_instruction(vcpu); +} + +static void fail_rdmsr(struct kvm_vcpu *vcpu, const struct msr_data *msr) +{ + trace_kvm_msr_read_ex(msr->index); + kvm_inject_gp(vcpu, 0); +} + +static void complete_wrmsr(struct kvm_vcpu *vcpu, const struct msr_data *msr) +{ + trace_kvm_msr_write(msr->index, msr->data); + skip_emulated_instruction(vcpu); +} + +static void fail_wrmsr(struct kvm_vcpu *vcpu, const struct msr_data *msr) +{ + trace_kvm_msr_write_ex(msr->index, msr->data); + kvm_inject_gp(vcpu, 0); +} + static int handle_rdmsr(struct kvm_vcpu *vcpu) { u32 ecx = vcpu->arch.regs[VCPU_REGS_RCX]; @@ -5471,17 +5499,12 @@ static int handle_rdmsr(struct kvm_vcpu *vcpu) msr_info.index = ecx; msr_info.host_initiated = false; if (vmx_get_msr(vcpu, &msr_info)) { - trace_kvm_msr_read_ex(ecx); - kvm_inject_gp(vcpu, 0); + fail_rdmsr(vcpu, &msr_info); return 1; } - trace_kvm_msr_read(ecx, msr_info.data); + complete_rdmsr(vcpu, &msr_info); - /* FIXME: handling of bits 32:63 of rax, rdx */ - vcpu->arch.regs[VCPU_REGS_RAX] = msr_info.data & -1u; - vcpu->arch.regs[VCPU_REGS_RDX] = (msr_info.data >> 32) & -1u; - skip_emulated_instruction(vcpu); return 1; } @@ -5496,13 +5519,12 @@ static int handle_wrmsr(struct kvm_vcpu *vcpu) msr.index = ecx; msr.host_initiated = false; if (kvm_set_msr(vcpu, &msr) != 0) { - trace_kvm_msr_write_ex(ecx, data); - kvm_inject_gp(vcpu, 0); + fail_wrmsr(vcpu, &msr); return 1; } - trace_kvm_msr_write(ecx, data); - skip_emulated_instruction(vcpu); + complete_wrmsr(vcpu, &msr); + return 1; } -- 2.5.0.276.gf5e568e