case MSR_CORE_PERF_FIXED_CTR_CTRL:
                if (pmu->fixed_ctr_ctrl == data)
                        return 0;
-               if (!(data & 0xfffffffffffff444ull)) {
+               if (!(data & pmu->fixed_ctr_ctrl_mask)) {
                        reprogram_fixed_counters(pmu, data);
                        return 0;
                }
        struct kvm_cpuid_entry2 *entry;
        union cpuid10_eax eax;
        union cpuid10_edx edx;
+       int i;
 
        pmu->nr_arch_gp_counters = 0;
        pmu->nr_arch_fixed_counters = 0;
        pmu->version = 0;
        pmu->reserved_bits = 0xffffffff00200000ull;
        pmu->raw_event_mask = X86_RAW_EVENT_MASK;
+       pmu->fixed_ctr_ctrl_mask = ~0ull;
 
        entry = kvm_find_cpuid_entry(vcpu, 0xa, 0);
        if (!entry || !vcpu->kvm->arch.enable_pmu)
                setup_fixed_pmc_eventsel(pmu);
        }
 
+       for (i = 0; i < pmu->nr_arch_fixed_counters; i++)
+               pmu->fixed_ctr_ctrl_mask &= ~(0xbull << (i * 4));
        pmu->global_ctrl = ((1ull << pmu->nr_arch_gp_counters) - 1) |
                (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED);
        pmu->global_ctrl_mask = ~pmu->global_ctrl;