]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: nv: Don't treat ZCR_EL2 as a 'mapped' register
authorOliver Upton <oliver.upton@linux.dev>
Fri, 26 Sep 2025 19:41:07 +0000 (12:41 -0700)
committerMarc Zyngier <maz@kernel.org>
Mon, 13 Oct 2025 13:17:02 +0000 (14:17 +0100)
Unlike the other mapped EL2 sysregs ZCR_EL2 isn't guaranteed to be
resident when a vCPU is loaded as it actually follows the SVE
context. As such, the contents of ZCR_EL1 may belong to another guest if
the vCPU has been preempted before reaching sysreg emulation.

Unconditionally use the in-memory value of ZCR_EL2 and switch to the
memory-only accessors. The in-memory value is guaranteed to be valid as
fpsimd_lazy_switch_to_{guest,host}() will restore/save the register
appropriately.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/sys_regs.c

index 91053aa832d081bb6df63036ad01465dccef49bf..4a75e5f0c259df04cee5e958d88921af8d90861b 100644 (file)
@@ -203,7 +203,6 @@ static void locate_register(const struct kvm_vcpu *vcpu, enum vcpu_sysreg reg,
                MAPPED_EL2_SYSREG(AMAIR_EL2,   AMAIR_EL1,   NULL             );
                MAPPED_EL2_SYSREG(ELR_EL2,     ELR_EL1,     NULL             );
                MAPPED_EL2_SYSREG(SPSR_EL2,    SPSR_EL1,    NULL             );
-               MAPPED_EL2_SYSREG(ZCR_EL2,     ZCR_EL1,     NULL             );
                MAPPED_EL2_SYSREG(CONTEXTIDR_EL2, CONTEXTIDR_EL1, NULL       );
                MAPPED_EL2_SYSREG(SCTLR2_EL2,  SCTLR2_EL1,  NULL             );
        case CNTHCTL_EL2:
@@ -2709,14 +2708,13 @@ static bool access_zcr_el2(struct kvm_vcpu *vcpu,
        }
 
        if (!p->is_write) {
-               p->regval = vcpu_read_sys_reg(vcpu, ZCR_EL2);
+               p->regval = __vcpu_sys_reg(vcpu, ZCR_EL2);
                return true;
        }
 
        vq = SYS_FIELD_GET(ZCR_ELx, LEN, p->regval) + 1;
        vq = min(vq, vcpu_sve_max_vq(vcpu));
-       vcpu_write_sys_reg(vcpu, vq - 1, ZCR_EL2);
-
+       __vcpu_assign_sys_reg(vcpu, ZCR_EL2, vq - 1);
        return true;
 }