]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Add TCR2_EL2 to the sysreg arrays
authorMarc Zyngier <maz@kernel.org>
Wed, 23 Oct 2024 14:53:19 +0000 (15:53 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 31 Oct 2024 02:42:30 +0000 (02:42 +0000)
Add the TCR2_EL2 register to the per-vcpu sysreg register array,
the sysreg descriptor array, and advertise it as mapped to TCR2_EL1
for NV purposes.

Access to this register is conditional based on ID_AA64MMFR3_EL1.TCRX
being advertised.

Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241023145345.1613824-12-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/sys_regs.c

index c753ab31dceaf200a47a2d879036e815f9912bc1..b41de132fa4e7166a08645aa7d882868c9af2797 100644 (file)
@@ -499,6 +499,7 @@ enum vcpu_sysreg {
 
        /* Anything from this can be RES0/RES1 sanitised */
        MARKER(__SANITISED_REG_START__),
+       TCR2_EL2,       /* Extended Translation Control Register (EL2) */
 
        /* Any VNCR-capable reg goes after this point */
        MARKER(__VNCR_START__),
index 9115a75b2c617db865b57f1125f9693ad8a98cac..a435b78606c017cd718105da4dcff434017f55dd 100644 (file)
@@ -134,6 +134,7 @@ static bool get_el2_to_el1_mapping(unsigned int reg,
                MAPPED_EL2_SYSREG(ESR_EL2,     ESR_EL1,     NULL             );
                MAPPED_EL2_SYSREG(FAR_EL2,     FAR_EL1,     NULL             );
                MAPPED_EL2_SYSREG(MAIR_EL2,    MAIR_EL1,    NULL             );
+               MAPPED_EL2_SYSREG(TCR2_EL2,    TCR2_EL1,    NULL             );
                MAPPED_EL2_SYSREG(AMAIR_EL2,   AMAIR_EL1,   NULL             );
                MAPPED_EL2_SYSREG(ELR_EL2,     ELR_EL1,     NULL             );
                MAPPED_EL2_SYSREG(SPSR_EL2,    SPSR_EL1,    NULL             );
@@ -452,6 +453,18 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu,
        return true;
 }
 
+static bool access_tcr2_el2(struct kvm_vcpu *vcpu,
+                           struct sys_reg_params *p,
+                           const struct sys_reg_desc *r)
+{
+       if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, TCRX, IMP)) {
+               kvm_inject_undefined(vcpu);
+               return false;
+       }
+
+       return access_rw(vcpu, p, r);
+}
+
 static bool access_actlr(struct kvm_vcpu *vcpu,
                         struct sys_reg_params *p,
                         const struct sys_reg_desc *r)
@@ -2866,6 +2879,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        EL2_REG(TTBR0_EL2, access_rw, reset_val, 0),
        EL2_REG(TTBR1_EL2, access_rw, reset_val, 0),
        EL2_REG(TCR_EL2, access_rw, reset_val, TCR_EL2_RES1),
+       EL2_REG(TCR2_EL2, access_tcr2_el2, reset_val, TCR2_EL2_RES1),
        EL2_REG_VNCR(VTTBR_EL2, reset_val, 0),
        EL2_REG_VNCR(VTCR_EL2, reset_val, 0),