Skip to content

Commit d3c35b7

Browse files
ouptonMarc Zyngier
authored andcommitted
KVM: arm64: nv: Convert masks to denylists in limit_nv_id_reg()
Consistently use denylisting of features such that the limitations of KVM's nested implementation are explicitly documented (rather than implied). Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent be8c919 commit d3c35b7

1 file changed

Lines changed: 33 additions & 14 deletions

File tree

arch/arm64/kvm/nested.c

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,9 +1462,18 @@ u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
14621462

14631463
case SYS_ID_AA64PFR1_EL1:
14641464
/* Only support BTI, SSBS, CSV2_frac */
1465-
val &= (ID_AA64PFR1_EL1_BT |
1466-
ID_AA64PFR1_EL1_SSBS |
1467-
ID_AA64PFR1_EL1_CSV2_frac);
1465+
val &= ~(ID_AA64PFR1_EL1_PFAR |
1466+
ID_AA64PFR1_EL1_DF2 |
1467+
ID_AA64PFR1_EL1_MTEX |
1468+
ID_AA64PFR1_EL1_THE |
1469+
ID_AA64PFR1_EL1_GCS |
1470+
ID_AA64PFR1_EL1_MTE_frac |
1471+
ID_AA64PFR1_EL1_NMI |
1472+
ID_AA64PFR1_EL1_SME |
1473+
ID_AA64PFR1_EL1_RES0 |
1474+
ID_AA64PFR1_EL1_MPAM_frac |
1475+
ID_AA64PFR1_EL1_RAS_frac |
1476+
ID_AA64PFR1_EL1_MTE);
14681477
break;
14691478

14701479
case SYS_ID_AA64MMFR0_EL1:
@@ -1517,12 +1526,16 @@ u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
15171526
break;
15181527

15191528
case SYS_ID_AA64MMFR1_EL1:
1520-
val &= (ID_AA64MMFR1_EL1_HCX |
1521-
ID_AA64MMFR1_EL1_PAN |
1522-
ID_AA64MMFR1_EL1_LO |
1523-
ID_AA64MMFR1_EL1_HPDS |
1524-
ID_AA64MMFR1_EL1_VH |
1525-
ID_AA64MMFR1_EL1_VMIDBits);
1529+
val &= ~(ID_AA64MMFR1_EL1_ECBHB |
1530+
ID_AA64MMFR1_EL1_CMOW |
1531+
ID_AA64MMFR1_EL1_TIDCP1 |
1532+
ID_AA64MMFR1_EL1_nTLBPA |
1533+
ID_AA64MMFR1_EL1_AFP |
1534+
ID_AA64MMFR1_EL1_ETS |
1535+
ID_AA64MMFR1_EL1_TWED |
1536+
ID_AA64MMFR1_EL1_XNX |
1537+
ID_AA64MMFR1_EL1_SpecSEI |
1538+
ID_AA64MMFR1_EL1_HAFDBS);
15261539
/* FEAT_E2H0 implies no VHE */
15271540
if (test_bit(KVM_ARM_VCPU_HAS_EL2_E2H0, kvm->arch.vcpu_features))
15281541
val &= ~ID_AA64MMFR1_EL1_VH;
@@ -1564,11 +1577,17 @@ u64 limit_nv_id_reg(struct kvm *kvm, u32 reg, u64 val)
15641577

15651578
case SYS_ID_AA64DFR0_EL1:
15661579
/* Only limited support for PMU, Debug, BPs, WPs, and HPMN0 */
1567-
val &= (ID_AA64DFR0_EL1_PMUVer |
1568-
ID_AA64DFR0_EL1_WRPs |
1569-
ID_AA64DFR0_EL1_BRPs |
1570-
ID_AA64DFR0_EL1_DebugVer|
1571-
ID_AA64DFR0_EL1_HPMN0);
1580+
val &= ~(ID_AA64DFR0_EL1_ExtTrcBuff |
1581+
ID_AA64DFR0_EL1_BRBE |
1582+
ID_AA64DFR0_EL1_MTPMU |
1583+
ID_AA64DFR0_EL1_TraceBuffer |
1584+
ID_AA64DFR0_EL1_TraceFilt |
1585+
ID_AA64DFR0_EL1_DoubleLock |
1586+
ID_AA64DFR0_EL1_PMSVer |
1587+
ID_AA64DFR0_EL1_CTX_CMPs |
1588+
ID_AA64DFR0_EL1_SEBEP |
1589+
ID_AA64DFR0_EL1_PMSS |
1590+
ID_AA64DFR0_EL1_TraceVer);
15721591

15731592
/* Cap Debug to ARMv8.1 */
15741593
val = ID_REG_LIMIT_FIELD_ENUM(val, ID_AA64DFR0_EL1, DebugVer, VHE);

0 commit comments

Comments
 (0)