aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/vmx/pmu_intel.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
index b6f5157445fe..a99613a060dd 100644
--- a/arch/x86/kvm/vmx/pmu_intel.c
+++ b/arch/x86/kvm/vmx/pmu_intel.c
@@ -240,11 +240,14 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
240 } 240 }
241 break; 241 break;
242 default: 242 default:
243 if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || 243 if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) {
244 (pmc = get_fixed_pmc(pmu, msr))) { 244 if (msr_info->host_initiated)
245 if (!msr_info->host_initiated) 245 pmc->counter = data;
246 data = (s64)(s32)data; 246 else
247 pmc->counter += data - pmc_read_counter(pmc); 247 pmc->counter = (s32)data;
248 return 0;
249 } else if ((pmc = get_fixed_pmc(pmu, msr))) {
250 pmc->counter = data;
248 return 0; 251 return 0;
249 } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { 252 } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {
250 if (data == pmc->eventsel) 253 if (data == pmc->eventsel)