aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r--arch/x86/kvm/vmx.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 3606154bbc8b..45ffa32352f1 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2220,15 +2220,17 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
2220 * Returns 0 on success, non-0 otherwise. 2220 * Returns 0 on success, non-0 otherwise.
2221 * Assumes vcpu_load() was already called. 2221 * Assumes vcpu_load() was already called.
2222 */ 2222 */
2223static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) 2223static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2224{ 2224{
2225 struct vcpu_vmx *vmx = to_vmx(vcpu); 2225 struct vcpu_vmx *vmx = to_vmx(vcpu);
2226 struct shared_msr_entry *msr; 2226 struct shared_msr_entry *msr;
2227 int ret = 0; 2227 int ret = 0;
2228 u32 msr_index = msr_info->index;
2229 u64 data = msr_info->data;
2228 2230
2229 switch (msr_index) { 2231 switch (msr_index) {
2230 case MSR_EFER: 2232 case MSR_EFER:
2231 ret = kvm_set_msr_common(vcpu, msr_index, data); 2233 ret = kvm_set_msr_common(vcpu, msr_info);
2232 break; 2234 break;
2233#ifdef CONFIG_X86_64 2235#ifdef CONFIG_X86_64
2234 case MSR_FS_BASE: 2236 case MSR_FS_BASE:
@@ -2254,7 +2256,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
2254 vmcs_writel(GUEST_SYSENTER_ESP, data); 2256 vmcs_writel(GUEST_SYSENTER_ESP, data);
2255 break; 2257 break;
2256 case MSR_IA32_TSC: 2258 case MSR_IA32_TSC:
2257 kvm_write_tsc(vcpu, data); 2259 kvm_write_tsc(vcpu, msr_info);
2258 break; 2260 break;
2259 case MSR_IA32_CR_PAT: 2261 case MSR_IA32_CR_PAT:
2260 if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { 2262 if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
@@ -2262,7 +2264,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
2262 vcpu->arch.pat = data; 2264 vcpu->arch.pat = data;
2263 break; 2265 break;
2264 } 2266 }
2265 ret = kvm_set_msr_common(vcpu, msr_index, data); 2267 ret = kvm_set_msr_common(vcpu, msr_info);
2266 break; 2268 break;
2267 case MSR_TSC_AUX: 2269 case MSR_TSC_AUX:
2268 if (!vmx->rdtscp_enabled) 2270 if (!vmx->rdtscp_enabled)
@@ -2285,7 +2287,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
2285 } 2287 }
2286 break; 2288 break;
2287 } 2289 }
2288 ret = kvm_set_msr_common(vcpu, msr_index, data); 2290 ret = kvm_set_msr_common(vcpu, msr_info);
2289 } 2291 }
2290 2292
2291 return ret; 2293 return ret;
@@ -4648,11 +4650,15 @@ static int handle_rdmsr(struct kvm_vcpu *vcpu)
4648 4650
4649static int handle_wrmsr(struct kvm_vcpu *vcpu) 4651static int handle_wrmsr(struct kvm_vcpu *vcpu)
4650{ 4652{
4653 struct msr_data msr;
4651 u32 ecx = vcpu->arch.regs[VCPU_REGS_RCX]; 4654 u32 ecx = vcpu->arch.regs[VCPU_REGS_RCX];
4652 u64 data = (vcpu->arch.regs[VCPU_REGS_RAX] & -1u) 4655 u64 data = (vcpu->arch.regs[VCPU_REGS_RAX] & -1u)
4653 | ((u64)(vcpu->arch.regs[VCPU_REGS_RDX] & -1u) << 32); 4656 | ((u64)(vcpu->arch.regs[VCPU_REGS_RDX] & -1u) << 32);
4654 4657
4655 if (vmx_set_msr(vcpu, ecx, data) != 0) { 4658 msr.data = data;
4659 msr.index = ecx;
4660 msr.host_initiated = false;
4661 if (vmx_set_msr(vcpu, &msr) != 0) {
4656 trace_kvm_msr_write_ex(ecx, data); 4662 trace_kvm_msr_write_ex(ecx, data);
4657 kvm_inject_gp(vcpu, 0); 4663 kvm_inject_gp(vcpu, 0);
4658 return 1; 4664 return 1;