This series fixes issues with PMUVer handling for a guest with PMU configured on heterogeneous PMU systems. Specifically, it addresses the following two issues. [A] The default value of ID_AA64DFR0_EL1.PMUVer of the vCPU is set to its sanitized value. This could be inappropriate on heterogeneous PMU systems, as arm64_ftr_bits for PMUVer is defined as FTR_EXACT with safe_val == 0 (when ID_AA64DFR0_EL1.PMUVer of all PEs on the host is not uniform, the sanitized value will be 0). [B] KVM uses PMUVer of the PMU hardware that is associated to the guest (kvm->arch.arm_pmu->pmuver) for the guest in some cases, even though userspace might have changed the guest's ID_AA64DFR0_EL1.PMUVer (kvm->arch.dfr0_pmuver.imp). To fix [A], KVM will set the default value of the guest's ID_AA64DFR0_EL1.PMUVer to the PMUVer of the guest's PMU (kvm->arch.arm_pmu->pmuver). To fix [B], KVM will stop using kvm->arch.arm_pmu->pmuver (except for some special cases) and use ID_AA64DFR0_EL1.PMUVer for the guest instead. Patch 1 adds a helper to set a PMU for the guest. This helper will make it easier for the following patches to modify the relevant code. Patch 2 make the default PMU for the guest set on the first vCPU reset. As userspace can get the value of ID_AA64DFR0_EL1 after the initial vCPU reset, this change is to make the default PMUVer value based on the guest's PMU available on the initial vCPU reset. Patch 3 and 4 fix the issue [A] and [B] respectively. The series is based on v6.4-rc3. The patches in this series were originally included as part of [1]. [1] https://lore.kernel.org/all/20230211031506.4159098-1-reijiw@xxxxxxxxxx/ Reiji Watanabe (4): KVM: arm64: PMU: Introduce a helper to set the guest's PMU KVM: arm64: PMU: Set the default PMU for the guest on vCPU reset KVM: arm64: PMU: Use PMUVer of the guest's PMU for ID_AA64DFR0.PMUVer KVM: arm64: PMU: Don't use the PMUVer of the PMU set for guest arch/arm64/include/asm/kvm_host.h | 2 + arch/arm64/kvm/arm.c | 6 --- arch/arm64/kvm/pmu-emul.c | 73 +++++++++++++++++++++---------- arch/arm64/kvm/reset.c | 20 ++++++--- arch/arm64/kvm/sys_regs.c | 48 +++++++++++++------- include/kvm/arm_pmu.h | 10 ++++- 6 files changed, 106 insertions(+), 53 deletions(-) base-commit: 44c026a73be8038f03dbdeef028b642880cf1511 -- 2.41.0.rc0.172.g3f132b7071-goog