kvm_has_feat
if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP))
if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64))
if (kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_V))
pa = kvm_has_feat((k), ID_AA64ISAR1_EL1, APA, l); \
pa &= kvm_has_feat((k), ID_AA64ISAR1_EL1, GPA, IMP); \
pi = kvm_has_feat((k), ID_AA64ISAR1_EL1, API, l); \
pi &= kvm_has_feat((k), ID_AA64ISAR1_EL1, GPI, IMP); \
pa3 = kvm_has_feat((k), ID_AA64ISAR2_EL1, APA3, l); \
pa3 &= kvm_has_feat((k), ID_AA64ISAR2_EL1, GPA3, IMP); \
kvm_has_feat((k), ID_AA64PFR2_EL1, FPMR, IMP))
(kvm_has_feat((k), ID_AA64MMFR3_EL1, TCRX, IMP))
(kvm_has_feat((k), ID_AA64MMFR3_EL1, S1PIE, IMP))
kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP))
(kvm_has_feat((k), ID_AA64PFR0_EL1, RAS, IMP))
(kvm_has_feat((k), ID_AA64MMFR3_EL1, SCTLRX, IMP))
kvm_has_feat(kvm, ID_AA64MMFR1_EL1, XNX, IMP);
kvm_has_feat(kvm, ID_AA64ISAR1_EL1, XS, IMP))))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, RANGE))
kvm_has_feat(kvm, ID_AA64ISAR1_EL1, XS, IMP))))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, RANGE))
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, PAN, PAN3))
wi->hpd = kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, HPDS, IMP);
lva = kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, VARange, 52);
if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, E0PD, IMP) &&
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT))
wi->ha = kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, HAFDBS, AF);
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT))
if (!kvm_has_feat(vcpu->kvm, ID_AA64PFR2_EL1, MTEPERM, IMP))
bool e2h0 = kvm_has_feat(kvm, FEAT_E2H0);
return !kvm_has_feat(kvm, FEAT_AA64EL3);
return ((kvm_has_feat(kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY) &&
kvm_has_feat(kvm, ID_AA64MMFR2_EL1, NV, NV2));
return feat_nv2(kvm) && !kvm_has_feat(kvm, FEAT_E2H0);
return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, V1P1) ||
kvm_has_feat(kvm, ID_AA64PFR1_EL1, RAS_frac, RASv1p1)));
return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, CSV2, CSV2_2) ||
(kvm_has_feat(kvm, ID_AA64PFR1_EL1, CSV2_frac, CSV2_1p2) &&
return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ADERR, FEAT_ADERR) &&
kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SDERR, FEAT_ADERR));
return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ANERR, FEAT_ANERR) &&
kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SNERR, FEAT_ANERR));
return (kvm_has_feat(kvm, FEAT_SME) &&
return (kvm_has_feat(kvm, FEAT_SPEv1p4) &&
return (kvm_has_feat(kvm, FEAT_SPEv1p2) &&
return (kvm_has_feat(kvm, FEAT_TRBE) &&
kvm_has_feat(kvm, FEAT_MPAM) &&
return kvm_has_feat(kvm, FEAT_EBEP) || kvm_has_feat(kvm, FEAT_PMUv3_SS);
return kvm_has_feat(kvm, FEAT_MixedEnd) || kvm_has_feat(kvm, FEAT_MixedEndEL0);
return kvm_has_feat(kvm, FEAT_MTE2) && kvm_has_feat_enum(kvm, FEAT_MTE_ASYNC);
(kvm_has_feat((k), ID_AA64DFR0_EL1, PMUVer, r) && \
!kvm_has_feat((k), ID_AA64DFR0_EL1, PMUVer, IMP_DEF)); \
kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s, IMP)) || \
kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, IMP))
return ((kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT) ||
!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, IMP)) &&
(kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT) ||
!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, IMP)) &&
(kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4_2, 52_BIT) ||
(kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16_2, 52_BIT) ||
if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, PAN, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, NMI, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64DFR1_EL1, EBEP, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, GCS, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, GCS, IMP))
allowed = kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_V);
allowed = kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64_ACCDATA);
allowed = kvm_has_feat(kvm, ID_AA64ISAR1_EL1, LS64, LS64);
allowed = kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceBuffer, TRBE_V1P1);
allowed = kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, V1P5);
if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR3_EL1, S1POE, IMP))
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMUVer, IMP)) {
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, DebugVer, IMP))
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, DoubleLock, IMP))
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, PMSVer, IMP)) {
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceFilt, IMP))
if (!kvm_has_feat(kvm, ID_AA64DFR0_EL1, TraceBuffer, IMP))
if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, FGT, IMP))
if (kvm_has_feat(kvm, ID_AA64PFR0_EL1, EL0, AARCH32) ||
kvm_has_feat(kvm, ID_AA64PFR0_EL1, EL1, AARCH32))
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, FP, IMP) ||
!kvm_has_feat(kvm, ID_AA64PFR0_EL1, AdvSIMD, IMP))
if (kvm_has_feat(kvm, ID_AA64PFR1_EL1, SME, IMP))
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, IMP)) {
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, AMU, IMP))
if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, LO, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, SSBS, IMP))
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, SSBS, IMP))
if (!kvm_has_feat(kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY))
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY))
if (!kvm_has_feat(kvm, ID_AA64MMFR2_EL1, CnP, IMP))
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RME, IMP))
if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, CNTPOFF)) {
if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, IMP))
if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, VH, IMP))
if (!ttl || !kvm_has_feat(kvm, ID_AA64MMFR2_EL1, TTL, IMP)) {
if (!kvm_has_feat(vcpu->kvm, ID_AA64DFR0_EL1, PMUVer, V3P5))
if (kvm_has_feat(kvm, ID_AA64PFR0_EL1, EL2, IMP))
if (kvm_has_feat(kvm, ID_AA64PFR0_EL1, EL3, IMP))
kvm_has_feat(vcpu->kvm, ID_AA64DFR0_EL1, PMUVer, V3P5));
if (kvm_has_feat(vcpu->kvm, ID_AA64PFR1_EL1, SME, IMP))
kvm_has_feat(vcpu->kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY))
kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, FGT, FGT2))
kvm_has_feat(vcpu->kvm, ID_AA64MMFR0_EL1, FGT, IMP))
if (!(kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, V1P1) ||
kvm_has_feat(kvm, ID_AA64PFR1_EL1, RAS_frac, RASv1p1)))) {
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, IMP)) {
!kvm_has_feat(vcpu->kvm, ID_AA64ISAR2_EL1, ATS1A, IMP)) {
!kvm_has_feat(kvm, ID_AA64ISAR1_EL1, XS, IMP))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
!kvm_has_feat(kvm, ID_AA64ISAR1_EL1, XS, IMP))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, RANGE))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, RANGE))
u32 el3 = kvm_has_feat(vcpu->kvm, ID_AA64PFR0_EL1, EL3, IMP);
if (!kvm_has_feat(kvm, ID_AA64ISAR0_EL1, TLB, OS))
if (!kvm_has_feat(vcpu->kvm, ID_AA64MMFR1_EL1, LO, IMP))
return kvm_has_feat(kvm, ID_AA64PFR0_EL1, GIC, IMP);
return kvm_has_feat(kvm, ID_AA64PFR2_EL1, GCIE, IMP);