@@ -426,11 +426,13 @@ static const complex_condition_check ccc[] = {
426
426
* [13:10] enum fgt_group_id (4 bits)
427
427
* [19:14] bit number in the FGT register (6 bits)
428
428
* [20] trap polarity (1 bit)
429
- * [62:21] Unused (42 bits)
429
+ * [25:21] FG filter (5 bits)
430
+ * [62:26] Unused (37 bits)
430
431
* [63] RES0 - Must be zero, as lost on insertion in the xarray
431
432
*/
432
433
#define TC_CGT_BITS 10
433
434
#define TC_FGT_BITS 4
435
+ #define TC_FGF_BITS 5
434
436
435
437
union trap_config {
436
438
u64 val ;
@@ -439,7 +441,8 @@ union trap_config {
439
441
unsigned long fgt :TC_FGT_BITS ; /* Fine Grained Trap id */
440
442
unsigned long bit :6 ; /* Bit number */
441
443
unsigned long pol :1 ; /* Polarity */
442
- unsigned long unused :42 ; /* Unused, should be zero */
444
+ unsigned long fgf :TC_FGF_BITS ; /* Fine Grained Filter */
445
+ unsigned long unused :37 ; /* Unused, should be zero */
443
446
unsigned long mbz :1 ; /* Must Be Zero */
444
447
};
445
448
};
@@ -947,18 +950,29 @@ enum fgt_group_id {
947
950
__NR_FGT_GROUP_IDS__
948
951
};
949
952
950
- #define SR_FGT (sr , g , b , p ) \
953
+ enum fg_filter_id {
954
+ __NO_FGF__ ,
955
+ HCRX_FGTnXS ,
956
+
957
+ /* Must be last */
958
+ __NR_FG_FILTER_IDS__
959
+ };
960
+
961
+ #define SR_FGF (sr , g , b , p , f ) \
951
962
{ \
952
963
.encoding = sr, \
953
964
.end = sr, \
954
965
.tc = { \
955
966
.fgt = g ## _GROUP, \
956
967
.bit = g ## _EL2_ ## b ## _SHIFT, \
957
968
.pol = p, \
969
+ .fgf = f, \
958
970
}, \
959
971
.line = __LINE__, \
960
972
}
961
973
974
+ #define SR_FGT (sr , g , b , p ) SR_FGF(sr, g, b, p, __NO_FGF__)
975
+
962
976
static const struct encoding_to_trap_config encoding_to_fgt [] __initconst = {
963
977
/* HFGRTR_EL2, HFGWTR_EL2 */
964
978
SR_FGT (SYS_TPIDR2_EL0 , HFGxTR , nTPIDR2_EL0 , 0 ),
@@ -1062,37 +1076,37 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
1062
1076
SR_FGT (OP_TLBI_ASIDE1OS , HFGITR , TLBIASIDE1OS , 1 ),
1063
1077
SR_FGT (OP_TLBI_VAE1OS , HFGITR , TLBIVAE1OS , 1 ),
1064
1078
SR_FGT (OP_TLBI_VMALLE1OS , HFGITR , TLBIVMALLE1OS , 1 ),
1065
- /* FIXME: nXS variants must be checked against HCRX_EL2.FGTnXS */
1066
- SR_FGT (OP_TLBI_VAALE1NXS , HFGITR , TLBIVAALE1 , 1 ),
1067
- SR_FGT (OP_TLBI_VALE1NXS , HFGITR , TLBIVALE1 , 1 ),
1068
- SR_FGT (OP_TLBI_VAAE1NXS , HFGITR , TLBIVAAE1 , 1 ),
1069
- SR_FGT (OP_TLBI_ASIDE1NXS , HFGITR , TLBIASIDE1 , 1 ),
1070
- SR_FGT (OP_TLBI_VAE1NXS , HFGITR , TLBIVAE1 , 1 ),
1071
- SR_FGT (OP_TLBI_VMALLE1NXS , HFGITR , TLBIVMALLE1 , 1 ),
1072
- SR_FGT (OP_TLBI_RVAALE1NXS , HFGITR , TLBIRVAALE1 , 1 ),
1073
- SR_FGT (OP_TLBI_RVALE1NXS , HFGITR , TLBIRVALE1 , 1 ),
1074
- SR_FGT (OP_TLBI_RVAAE1NXS , HFGITR , TLBIRVAAE1 , 1 ),
1075
- SR_FGT (OP_TLBI_RVAE1NXS , HFGITR , TLBIRVAE1 , 1 ),
1076
- SR_FGT (OP_TLBI_RVAALE1ISNXS , HFGITR , TLBIRVAALE1IS , 1 ),
1077
- SR_FGT (OP_TLBI_RVALE1ISNXS , HFGITR , TLBIRVALE1IS , 1 ),
1078
- SR_FGT (OP_TLBI_RVAAE1ISNXS , HFGITR , TLBIRVAAE1IS , 1 ),
1079
- SR_FGT (OP_TLBI_RVAE1ISNXS , HFGITR , TLBIRVAE1IS , 1 ),
1080
- SR_FGT (OP_TLBI_VAALE1ISNXS , HFGITR , TLBIVAALE1IS , 1 ),
1081
- SR_FGT (OP_TLBI_VALE1ISNXS , HFGITR , TLBIVALE1IS , 1 ),
1082
- SR_FGT (OP_TLBI_VAAE1ISNXS , HFGITR , TLBIVAAE1IS , 1 ),
1083
- SR_FGT (OP_TLBI_ASIDE1ISNXS , HFGITR , TLBIASIDE1IS , 1 ),
1084
- SR_FGT (OP_TLBI_VAE1ISNXS , HFGITR , TLBIVAE1IS , 1 ),
1085
- SR_FGT (OP_TLBI_VMALLE1ISNXS , HFGITR , TLBIVMALLE1IS , 1 ),
1086
- SR_FGT (OP_TLBI_RVAALE1OSNXS , HFGITR , TLBIRVAALE1OS , 1 ),
1087
- SR_FGT (OP_TLBI_RVALE1OSNXS , HFGITR , TLBIRVALE1OS , 1 ),
1088
- SR_FGT (OP_TLBI_RVAAE1OSNXS , HFGITR , TLBIRVAAE1OS , 1 ),
1089
- SR_FGT (OP_TLBI_RVAE1OSNXS , HFGITR , TLBIRVAE1OS , 1 ),
1090
- SR_FGT (OP_TLBI_VAALE1OSNXS , HFGITR , TLBIVAALE1OS , 1 ),
1091
- SR_FGT (OP_TLBI_VALE1OSNXS , HFGITR , TLBIVALE1OS , 1 ),
1092
- SR_FGT (OP_TLBI_VAAE1OSNXS , HFGITR , TLBIVAAE1OS , 1 ),
1093
- SR_FGT (OP_TLBI_ASIDE1OSNXS , HFGITR , TLBIASIDE1OS , 1 ),
1094
- SR_FGT (OP_TLBI_VAE1OSNXS , HFGITR , TLBIVAE1OS , 1 ),
1095
- SR_FGT (OP_TLBI_VMALLE1OSNXS , HFGITR , TLBIVMALLE1OS , 1 ),
1079
+ /* nXS variants must be checked against HCRX_EL2.FGTnXS */
1080
+ SR_FGF (OP_TLBI_VAALE1NXS , HFGITR , TLBIVAALE1 , 1 , HCRX_FGTnXS ),
1081
+ SR_FGF (OP_TLBI_VALE1NXS , HFGITR , TLBIVALE1 , 1 , HCRX_FGTnXS ),
1082
+ SR_FGF (OP_TLBI_VAAE1NXS , HFGITR , TLBIVAAE1 , 1 , HCRX_FGTnXS ),
1083
+ SR_FGF (OP_TLBI_ASIDE1NXS , HFGITR , TLBIASIDE1 , 1 , HCRX_FGTnXS ),
1084
+ SR_FGF (OP_TLBI_VAE1NXS , HFGITR , TLBIVAE1 , 1 , HCRX_FGTnXS ),
1085
+ SR_FGF (OP_TLBI_VMALLE1NXS , HFGITR , TLBIVMALLE1 , 1 , HCRX_FGTnXS ),
1086
+ SR_FGF (OP_TLBI_RVAALE1NXS , HFGITR , TLBIRVAALE1 , 1 , HCRX_FGTnXS ),
1087
+ SR_FGF (OP_TLBI_RVALE1NXS , HFGITR , TLBIRVALE1 , 1 , HCRX_FGTnXS ),
1088
+ SR_FGF (OP_TLBI_RVAAE1NXS , HFGITR , TLBIRVAAE1 , 1 , HCRX_FGTnXS ),
1089
+ SR_FGF (OP_TLBI_RVAE1NXS , HFGITR , TLBIRVAE1 , 1 , HCRX_FGTnXS ),
1090
+ SR_FGF (OP_TLBI_RVAALE1ISNXS , HFGITR , TLBIRVAALE1IS , 1 , HCRX_FGTnXS ),
1091
+ SR_FGF (OP_TLBI_RVALE1ISNXS , HFGITR , TLBIRVALE1IS , 1 , HCRX_FGTnXS ),
1092
+ SR_FGF (OP_TLBI_RVAAE1ISNXS , HFGITR , TLBIRVAAE1IS , 1 , HCRX_FGTnXS ),
1093
+ SR_FGF (OP_TLBI_RVAE1ISNXS , HFGITR , TLBIRVAE1IS , 1 , HCRX_FGTnXS ),
1094
+ SR_FGF (OP_TLBI_VAALE1ISNXS , HFGITR , TLBIVAALE1IS , 1 , HCRX_FGTnXS ),
1095
+ SR_FGF (OP_TLBI_VALE1ISNXS , HFGITR , TLBIVALE1IS , 1 , HCRX_FGTnXS ),
1096
+ SR_FGF (OP_TLBI_VAAE1ISNXS , HFGITR , TLBIVAAE1IS , 1 , HCRX_FGTnXS ),
1097
+ SR_FGF (OP_TLBI_ASIDE1ISNXS , HFGITR , TLBIASIDE1IS , 1 , HCRX_FGTnXS ),
1098
+ SR_FGF (OP_TLBI_VAE1ISNXS , HFGITR , TLBIVAE1IS , 1 , HCRX_FGTnXS ),
1099
+ SR_FGF (OP_TLBI_VMALLE1ISNXS , HFGITR , TLBIVMALLE1IS , 1 , HCRX_FGTnXS ),
1100
+ SR_FGF (OP_TLBI_RVAALE1OSNXS , HFGITR , TLBIRVAALE1OS , 1 , HCRX_FGTnXS ),
1101
+ SR_FGF (OP_TLBI_RVALE1OSNXS , HFGITR , TLBIRVALE1OS , 1 , HCRX_FGTnXS ),
1102
+ SR_FGF (OP_TLBI_RVAAE1OSNXS , HFGITR , TLBIRVAAE1OS , 1 , HCRX_FGTnXS ),
1103
+ SR_FGF (OP_TLBI_RVAE1OSNXS , HFGITR , TLBIRVAE1OS , 1 , HCRX_FGTnXS ),
1104
+ SR_FGF (OP_TLBI_VAALE1OSNXS , HFGITR , TLBIVAALE1OS , 1 , HCRX_FGTnXS ),
1105
+ SR_FGF (OP_TLBI_VALE1OSNXS , HFGITR , TLBIVALE1OS , 1 , HCRX_FGTnXS ),
1106
+ SR_FGF (OP_TLBI_VAAE1OSNXS , HFGITR , TLBIVAAE1OS , 1 , HCRX_FGTnXS ),
1107
+ SR_FGF (OP_TLBI_ASIDE1OSNXS , HFGITR , TLBIASIDE1OS , 1 , HCRX_FGTnXS ),
1108
+ SR_FGF (OP_TLBI_VAE1OSNXS , HFGITR , TLBIVAE1OS , 1 , HCRX_FGTnXS ),
1109
+ SR_FGF (OP_TLBI_VMALLE1OSNXS , HFGITR , TLBIVMALLE1OS , 1 , HCRX_FGTnXS ),
1096
1110
SR_FGT (OP_AT_S1E1WP , HFGITR , ATS1E1WP , 1 ),
1097
1111
SR_FGT (OP_AT_S1E1RP , HFGITR , ATS1E1RP , 1 ),
1098
1112
SR_FGT (OP_AT_S1E0W , HFGITR , ATS1E0W , 1 ),
@@ -1622,6 +1636,7 @@ int __init populate_nv_trap_config(void)
1622
1636
BUILD_BUG_ON (sizeof (union trap_config ) != sizeof (void * ));
1623
1637
BUILD_BUG_ON (__NR_CGT_GROUP_IDS__ > BIT (TC_CGT_BITS ));
1624
1638
BUILD_BUG_ON (__NR_FGT_GROUP_IDS__ > BIT (TC_FGT_BITS ));
1639
+ BUILD_BUG_ON (__NR_FG_FILTER_IDS__ > BIT (TC_FGF_BITS ));
1625
1640
1626
1641
for (int i = 0 ; i < ARRAY_SIZE (encoding_to_cgt ); i ++ ) {
1627
1642
const struct encoding_to_trap_config * cgt = & encoding_to_cgt [i ];
@@ -1812,6 +1827,17 @@ bool __check_nv_sr_forward(struct kvm_vcpu *vcpu)
1812
1827
1813
1828
case HFGITR_GROUP :
1814
1829
val = sanitised_sys_reg (vcpu , HFGITR_EL2 );
1830
+ switch (tc .fgf ) {
1831
+ u64 tmp ;
1832
+
1833
+ case __NO_FGF__ :
1834
+ break ;
1835
+
1836
+ case HCRX_FGTnXS :
1837
+ tmp = sanitised_sys_reg (vcpu , HCRX_EL2 );
1838
+ if (tmp & HCRX_EL2_FGTnXS )
1839
+ tc .fgt = __NO_FGT_GROUP__ ;
1840
+ }
1815
1841
break ;
1816
1842
1817
1843
case __NR_FGT_GROUP_IDS__ :
0 commit comments