diff options
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r-- | arch/x86/kvm/vmx.c | 18 |
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 | */ |
2223 | static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | 2223 | static 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 | ||
4649 | static int handle_wrmsr(struct kvm_vcpu *vcpu) | 4651 | static 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; |