return true;
 }
 
+/**
+ * kvm_arm_pmu_get_max_counters - Return the max number of PMU counters.
+ * @kvm: The kvm pointer
+ */
+u8 kvm_arm_pmu_get_max_counters(struct kvm *kvm)
+{
+       struct arm_pmu *arm_pmu = kvm->arch.arm_pmu;
+
+       /*
+        * The arm_pmu->num_events considers the cycle counter as well.
+        * Ignore that and return only the general-purpose counters.
+        */
+       return arm_pmu->num_events - 1;
+}
+
 static void kvm_arm_set_pmu(struct kvm *kvm, struct arm_pmu *arm_pmu)
 {
        lockdep_assert_held(&kvm->arch.config_lock);
 
        kvm->arch.arm_pmu = arm_pmu;
+       kvm->arch.pmcr_n = kvm_arm_pmu_get_max_counters(kvm);
 }
 
 /**
  */
 u64 kvm_vcpu_read_pmcr(struct kvm_vcpu *vcpu)
 {
-       return __vcpu_sys_reg(vcpu, PMCR_EL0);
+       u64 pmcr = __vcpu_sys_reg(vcpu, PMCR_EL0) &
+                       ~(ARMV8_PMU_PMCR_N_MASK << ARMV8_PMU_PMCR_N_SHIFT);
+
+       return pmcr | ((u64)vcpu->kvm->arch.pmcr_n << ARMV8_PMU_PMCR_N_SHIFT);
 }
 
 {
        u64 n, mask = BIT(ARMV8_PMU_CYCLE_IDX);
 
-       /* No PMU available, any PMU reg may UNDEF... */
-       if (!kvm_arm_support_pmu_v3())
-               return 0;
-
-       n = read_sysreg(pmcr_el0) >> ARMV8_PMU_PMCR_N_SHIFT;
-       n &= ARMV8_PMU_PMCR_N_MASK;
+       n = vcpu->kvm->arch.pmcr_n;
        if (n)
                mask |= GENMASK(n - 1, 0);
 
 
 static u64 reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
 {
-       u64 pmcr;
+       u64 pmcr = 0;
 
-       /* No PMU available, PMCR_EL0 may UNDEF... */
-       if (!kvm_arm_support_pmu_v3())
-               return 0;
-
-       /* Only preserve PMCR_EL0.N, and reset the rest to 0 */
-       pmcr = read_sysreg(pmcr_el0) & (ARMV8_PMU_PMCR_N_MASK << ARMV8_PMU_PMCR_N_SHIFT);
        if (!kvm_supports_32bit_el0())
                pmcr |= ARMV8_PMU_PMCR_LC;
 
+       /*
+        * The value of PMCR.N field is included when the
+        * vCPU register is read via kvm_vcpu_read_pmcr().
+        */
        __vcpu_sys_reg(vcpu, r->reg) = pmcr;
 
        return __vcpu_sys_reg(vcpu, r->reg);
        return true;
 }
 
+static int get_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r,
+                   u64 *val)
+{
+       *val = kvm_vcpu_read_pmcr(vcpu);
+       return 0;
+}
+
 /* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */
 #define DBG_BCR_BVR_WCR_WVR_EL1(n)                                     \
        { SYS_DESC(SYS_DBGBVRn_EL1(n)),                                 \
        { SYS_DESC(SYS_SVCR), undef_access },
 
        { PMU_SYS_REG(PMCR_EL0), .access = access_pmcr,
-         .reset = reset_pmcr, .reg = PMCR_EL0 },
+         .reset = reset_pmcr, .reg = PMCR_EL0, .get_user = get_pmcr },
        { PMU_SYS_REG(PMCNTENSET_EL0),
          .access = access_pmcnten, .reg = PMCNTENSET_EL0 },
        { PMU_SYS_REG(PMCNTENCLR_EL0),