@@ -141,6 +141,7 @@ struct reg_feat_map_desc {
141141#define FEAT_AA64EL1 ID_AA64PFR0_EL1, EL1, IMP
142142#define FEAT_AA64EL2 ID_AA64PFR0_EL1, EL2, IMP
143143#define FEAT_AA64EL3 ID_AA64PFR0_EL1, EL3, IMP
144+ #define FEAT_SEL2 ID_AA64PFR0_EL1, SEL2, IMP
144145#define FEAT_AIE ID_AA64MMFR3_EL1, AIE, IMP
145146#define FEAT_S2POE ID_AA64MMFR3_EL1, S2POE, IMP
146147#define FEAT_S1POE ID_AA64MMFR3_EL1, S1POE, IMP
@@ -202,6 +203,8 @@ struct reg_feat_map_desc {
202203#define FEAT_ASID2 ID_AA64MMFR4_EL1, ASID2, IMP
203204#define FEAT_MEC ID_AA64MMFR3_EL1, MEC, IMP
204205#define FEAT_HAFT ID_AA64MMFR1_EL1, HAFDBS, HAFT
206+ #define FEAT_HDBSS ID_AA64MMFR1_EL1, HAFDBS, HDBSS
207+ #define FEAT_HPDS2 ID_AA64MMFR1_EL1, HPDS, HPDS2
205208#define FEAT_BTI ID_AA64PFR1_EL1, BT, IMP
206209#define FEAT_ExS ID_AA64MMFR0_EL1, EXS, IMP
207210#define FEAT_IESB ID_AA64MMFR2_EL1, IESB, IMP
@@ -219,6 +222,7 @@ struct reg_feat_map_desc {
219222#define FEAT_FGT2 ID_AA64MMFR0_EL1, FGT, FGT2
220223#define FEAT_MTPMU ID_AA64DFR0_EL1, MTPMU, IMP
221224#define FEAT_HCX ID_AA64MMFR1_EL1, HCX, IMP
225+ #define FEAT_S2PIE ID_AA64MMFR3_EL1, S2PIE, IMP
222226
223227static bool not_feat_aa64el3 (struct kvm * kvm )
224228{
@@ -362,6 +366,28 @@ static bool feat_pmuv3p9(struct kvm *kvm)
362366 return check_pmu_revision (kvm , V3P9 );
363367}
364368
369+ #define has_feat_s2tgran (k , s ) \
370+ ((kvm_has_feat_enum(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, TGRAN##s) && \
371+ kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s, IMP)) || \
372+ kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, IMP))
373+
374+ static bool feat_lpa2 (struct kvm * kvm )
375+ {
376+ return ((kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN4 , 52 _BIT ) ||
377+ !kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN4 , IMP )) &&
378+ (kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN16 , 52 _BIT ) ||
379+ !kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN16 , IMP )) &&
380+ (kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN4_2 , 52 _BIT ) ||
381+ !has_feat_s2tgran (kvm , 4 )) &&
382+ (kvm_has_feat (kvm , ID_AA64MMFR0_EL1 , TGRAN16_2 , 52 _BIT ) ||
383+ !has_feat_s2tgran (kvm , 16 )));
384+ }
385+
386+ static bool feat_vmid16 (struct kvm * kvm )
387+ {
388+ return kvm_has_feat_enum (kvm , ID_AA64MMFR1_EL1 , VMIDBits , 16 );
389+ }
390+
365391static bool compute_hcr_rw (struct kvm * kvm , u64 * bits )
366392{
367393 /* This is purely academic: AArch32 and NV are mutually exclusive */
@@ -1168,6 +1194,44 @@ static const struct reg_bits_to_feat_map mdcr_el2_feat_map[] = {
11681194static const DECLARE_FEAT_MAP (mdcr_el2_desc , MDCR_EL2 ,
11691195 mdcr_el2_feat_map , FEAT_AA64EL2 ) ;
11701196
1197+ static const struct reg_bits_to_feat_map vtcr_el2_feat_map [] = {
1198+ NEEDS_FEAT (VTCR_EL2_HDBSS , FEAT_HDBSS ),
1199+ NEEDS_FEAT (VTCR_EL2_HAFT , FEAT_HAFT ),
1200+ NEEDS_FEAT (VTCR_EL2_TL0 |
1201+ VTCR_EL2_TL1 |
1202+ VTCR_EL2_AssuredOnly |
1203+ VTCR_EL2_GCSH ,
1204+ FEAT_THE ),
1205+ NEEDS_FEAT (VTCR_EL2_D128 , FEAT_D128 ),
1206+ NEEDS_FEAT (VTCR_EL2_S2POE , FEAT_S2POE ),
1207+ NEEDS_FEAT (VTCR_EL2_S2PIE , FEAT_S2PIE ),
1208+ NEEDS_FEAT (VTCR_EL2_SL2 |
1209+ VTCR_EL2_DS ,
1210+ feat_lpa2 ),
1211+ NEEDS_FEAT (VTCR_EL2_NSA |
1212+ VTCR_EL2_NSW ,
1213+ FEAT_SEL2 ),
1214+ NEEDS_FEAT (VTCR_EL2_HWU62 |
1215+ VTCR_EL2_HWU61 |
1216+ VTCR_EL2_HWU60 |
1217+ VTCR_EL2_HWU59 ,
1218+ FEAT_HPDS2 ),
1219+ NEEDS_FEAT (VTCR_EL2_HD , ID_AA64MMFR1_EL1 , HAFDBS , DBM ),
1220+ NEEDS_FEAT (VTCR_EL2_HA , ID_AA64MMFR1_EL1 , HAFDBS , AF ),
1221+ NEEDS_FEAT (VTCR_EL2_VS , feat_vmid16 ),
1222+ NEEDS_FEAT (VTCR_EL2_PS |
1223+ VTCR_EL2_TG0 |
1224+ VTCR_EL2_SH0 |
1225+ VTCR_EL2_ORGN0 |
1226+ VTCR_EL2_IRGN0 |
1227+ VTCR_EL2_SL0 |
1228+ VTCR_EL2_T0SZ ,
1229+ FEAT_AA64EL1 ),
1230+ };
1231+
1232+ static const DECLARE_FEAT_MAP (vtcr_el2_desc , VTCR_EL2 ,
1233+ vtcr_el2_feat_map , FEAT_AA64EL2 ) ;
1234+
11711235static void __init check_feat_map (const struct reg_bits_to_feat_map * map ,
11721236 int map_size , u64 resx , const char * str )
11731237{
@@ -1211,6 +1275,7 @@ void __init check_feature_map(void)
12111275 check_reg_desc (& tcr2_el2_desc );
12121276 check_reg_desc (& sctlr_el1_desc );
12131277 check_reg_desc (& mdcr_el2_desc );
1278+ check_reg_desc (& vtcr_el2_desc );
12141279}
12151280
12161281static bool idreg_feat_match (struct kvm * kvm , const struct reg_bits_to_feat_map * map )
@@ -1425,6 +1490,10 @@ void get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg, u64 *res0, u64 *r
14251490 * res0 = compute_reg_res0_bits (kvm , & mdcr_el2_desc , 0 , 0 );
14261491 * res1 = MDCR_EL2_RES1 ;
14271492 break ;
1493+ case VTCR_EL2 :
1494+ * res0 = compute_reg_res0_bits (kvm , & vtcr_el2_desc , 0 , 0 );
1495+ * res1 = VTCR_EL2_RES1 ;
1496+ break ;
14281497 default :
14291498 WARN_ON_ONCE (1 );
14301499 * res0 = * res1 = 0 ;
0 commit comments