return __kvm_pmu_event_mask(pmuver);
 }
 
+u64 kvm_pmu_evtyper_mask(struct kvm *kvm)
+{
+       u64 mask = ARMV8_PMU_EXCLUDE_EL1 | ARMV8_PMU_EXCLUDE_EL0 |
+                  kvm_pmu_event_mask(kvm);
+       u64 pfr0 = IDREG(kvm, SYS_ID_AA64PFR0_EL1);
+
+       if (SYS_FIELD_GET(ID_AA64PFR0_EL1, EL2, pfr0))
+               mask |= ARMV8_PMU_INCLUDE_EL2;
+
+       return mask;
+}
+
 /**
  * kvm_pmc_is_64bit - determine if counter is 64bit
  * @pmc: counter context
                                    u64 select_idx)
 {
        struct kvm_pmc *pmc = kvm_vcpu_idx_to_pmc(vcpu, select_idx);
-       u64 reg, mask;
+       u64 reg;
 
        if (!kvm_vcpu_has_pmu(vcpu))
                return;
 
-       mask  =  ARMV8_PMU_EVTYPE_MASK;
-       mask &= ~ARMV8_PMU_EVTYPE_EVENT;
-       mask |= kvm_pmu_event_mask(vcpu->kvm);
-
        reg = counter_index_to_evtreg(pmc->idx);
-
-       __vcpu_sys_reg(vcpu, reg) = data & mask;
+       __vcpu_sys_reg(vcpu, reg) = data & kvm_pmu_evtyper_mask(vcpu->kvm);
 
        kvm_pmu_create_perf_event(pmc);
 }
 
 
 static u64 reset_pmevtyper(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
 {
+       /* This thing will UNDEF, who cares about the reset value? */
+       if (!kvm_vcpu_has_pmu(vcpu))
+               return 0;
+
        reset_unknown(vcpu, r);
-       __vcpu_sys_reg(vcpu, r->reg) &= ARMV8_PMU_EVTYPE_MASK;
+       __vcpu_sys_reg(vcpu, r->reg) &= kvm_pmu_evtyper_mask(vcpu->kvm);
 
        return __vcpu_sys_reg(vcpu, r->reg);
 }
                kvm_pmu_set_counter_event_type(vcpu, p->regval, idx);
                kvm_vcpu_pmu_restore_guest(vcpu);
        } else {
-               p->regval = __vcpu_sys_reg(vcpu, reg) & ARMV8_PMU_EVTYPE_MASK;
+               p->regval = __vcpu_sys_reg(vcpu, reg);
        }
 
        return true;
 
 })
 
 u8 kvm_arm_pmu_get_pmuver_limit(void);
+u64 kvm_pmu_evtyper_mask(struct kvm *kvm);
 
 #else
 struct kvm_pmu {
 {
        return 0;
 }
+static inline u64 kvm_pmu_evtyper_mask(struct kvm *kvm)
+{
+       return 0;
+}
 static inline void kvm_vcpu_pmu_resync_el0(void) {}
 
 #endif