KVM_GET_ONE_REG and KVM_SET_ONE_REG transfer raw vCPU state for
migration. Masking PMU bitmap registers with counters accessible at the
current EL drops EL2-reserved bits when the vCPU is stopped in EL1 or
EL0.

Use the implemented counter mask for these userspace accesses so the
complete bitmap state survives migration. Guest register accesses
continue to use the accessible counter mask.

Assisted-by: Codex:gpt-5.6-sol
Fixes: 9a1c58cfefb0 ("KVM: arm64: nv: Adjust range of accessible PMCs according 
to HPMN")
Closes: 
https://sashiko.dev/#/patchset/[email protected]?part=5
Signed-off-by: Akihiko Odaki <[email protected]>
---
 arch/arm64/kvm/sys_regs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 44aae52c473d..42b6705bc21d 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -1326,7 +1326,7 @@ static bool access_pmu_evtyper(struct kvm_vcpu *vcpu, 
struct sys_reg_params *p,
 
 static int set_pmreg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 
val)
 {
-       u64 mask = kvm_pmu_accessible_counter_mask(vcpu);
+       u64 mask = kvm_pmu_implemented_counter_mask(vcpu);
 
        __vcpu_assign_sys_reg(vcpu, r->reg, val & mask);
        kvm_make_request(KVM_REQ_RELOAD_PMU, vcpu);
@@ -1336,7 +1336,7 @@ static int set_pmreg(struct kvm_vcpu *vcpu, const struct 
sys_reg_desc *r, u64 va
 
 static int get_pmreg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r, u64 
*val)
 {
-       u64 mask = kvm_pmu_accessible_counter_mask(vcpu);
+       u64 mask = kvm_pmu_implemented_counter_mask(vcpu);
 
        *val = __vcpu_sys_reg(vcpu, r->reg) & mask;
        return 0;

-- 
2.55.0


Reply via email to