aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/x86.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3b51c8659741..34c85aa2e2d1 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2006,10 +2006,12 @@ static void kvmclock_sync_fn(struct work_struct *work)
2006 KVMCLOCK_SYNC_PERIOD); 2006 KVMCLOCK_SYNC_PERIOD);
2007} 2007}
2008 2008
2009static int set_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 data) 2009static int set_msr_mce(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2010{ 2010{
2011 u64 mcg_cap = vcpu->arch.mcg_cap; 2011 u64 mcg_cap = vcpu->arch.mcg_cap;
2012 unsigned bank_num = mcg_cap & 0xff; 2012 unsigned bank_num = mcg_cap & 0xff;
2013 u32 msr = msr_info->index;
2014 u64 data = msr_info->data;
2013 2015
2014 switch (msr) { 2016 switch (msr) {
2015 case MSR_IA32_MCG_STATUS: 2017 case MSR_IA32_MCG_STATUS:
@@ -2034,6 +2036,9 @@ static int set_msr_mce(struct kvm_vcpu *vcpu, u32 msr, u64 data)
2034 if ((offset & 0x3) == 0 && 2036 if ((offset & 0x3) == 0 &&
2035 data != 0 && (data | (1 << 10)) != ~(u64)0) 2037 data != 0 && (data | (1 << 10)) != ~(u64)0)
2036 return -1; 2038 return -1;
2039 if (!msr_info->host_initiated &&
2040 (offset & 0x3) == 1 && data != 0)
2041 return -1;
2037 vcpu->arch.mce_banks[offset] = data; 2042 vcpu->arch.mce_banks[offset] = data;
2038 break; 2043 break;
2039 } 2044 }
@@ -2283,7 +2288,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2283 case MSR_IA32_MCG_CTL: 2288 case MSR_IA32_MCG_CTL:
2284 case MSR_IA32_MCG_STATUS: 2289 case MSR_IA32_MCG_STATUS:
2285 case MSR_IA32_MC0_CTL ... MSR_IA32_MCx_CTL(KVM_MAX_MCE_BANKS) - 1: 2290 case MSR_IA32_MC0_CTL ... MSR_IA32_MCx_CTL(KVM_MAX_MCE_BANKS) - 1:
2286 return set_msr_mce(vcpu, msr, data); 2291 return set_msr_mce(vcpu, msr_info);
2287 2292
2288 case MSR_K7_PERFCTR0 ... MSR_K7_PERFCTR3: 2293 case MSR_K7_PERFCTR0 ... MSR_K7_PERFCTR3:
2289 case MSR_P6_PERFCTR0 ... MSR_P6_PERFCTR1: 2294 case MSR_P6_PERFCTR0 ... MSR_P6_PERFCTR1: