@@ -85,12 +85,17 @@ enum cgt_group_id {
85
85
86
86
CGT_HCRX_TCR2En ,
87
87
88
+ CGT_ICH_HCR_TC ,
89
+ CGT_ICH_HCR_TALL0 ,
90
+ CGT_ICH_HCR_TALL1 ,
91
+ CGT_ICH_HCR_TDIR ,
92
+
88
93
/*
89
94
* Anything after this point is a combination of coarse trap
90
95
* controls, which must all be evaluated to decide what to do.
91
96
*/
92
97
__MULTIPLE_CONTROL_BITS__ ,
93
- CGT_HCR_IMO_FMO = __MULTIPLE_CONTROL_BITS__ ,
98
+ CGT_HCR_IMO_FMO_ICH_HCR_TC = __MULTIPLE_CONTROL_BITS__ ,
94
99
CGT_HCR_TID2_TID4 ,
95
100
CGT_HCR_TTLB_TTLBIS ,
96
101
CGT_HCR_TTLB_TTLBOS ,
@@ -105,6 +110,8 @@ enum cgt_group_id {
105
110
CGT_MDCR_TDE_TDRA ,
106
111
CGT_MDCR_TDCC_TDE_TDA ,
107
112
113
+ CGT_ICH_HCR_TC_TDIR ,
114
+
108
115
/*
109
116
* Anything after this point requires a callback evaluating a
110
117
* complex trap condition. Ugly stuff.
@@ -378,6 +385,30 @@ static const struct trap_bits coarse_trap_bits[] = {
378
385
.mask = HCRX_EL2_TCR2En ,
379
386
.behaviour = BEHAVE_FORWARD_ANY ,
380
387
},
388
+ [CGT_ICH_HCR_TC ] = {
389
+ .index = ICH_HCR_EL2 ,
390
+ .value = ICH_HCR_TC ,
391
+ .mask = ICH_HCR_TC ,
392
+ .behaviour = BEHAVE_FORWARD_ANY ,
393
+ },
394
+ [CGT_ICH_HCR_TALL0 ] = {
395
+ .index = ICH_HCR_EL2 ,
396
+ .value = ICH_HCR_TALL0 ,
397
+ .mask = ICH_HCR_TALL0 ,
398
+ .behaviour = BEHAVE_FORWARD_ANY ,
399
+ },
400
+ [CGT_ICH_HCR_TALL1 ] = {
401
+ .index = ICH_HCR_EL2 ,
402
+ .value = ICH_HCR_TALL1 ,
403
+ .mask = ICH_HCR_TALL1 ,
404
+ .behaviour = BEHAVE_FORWARD_ANY ,
405
+ },
406
+ [CGT_ICH_HCR_TDIR ] = {
407
+ .index = ICH_HCR_EL2 ,
408
+ .value = ICH_HCR_TDIR ,
409
+ .mask = ICH_HCR_TDIR ,
410
+ .behaviour = BEHAVE_FORWARD_ANY ,
411
+ },
381
412
};
382
413
383
414
#define MCB (id , ...) \
@@ -387,7 +418,6 @@ static const struct trap_bits coarse_trap_bits[] = {
387
418
}
388
419
389
420
static const enum cgt_group_id * coarse_control_combo [] = {
390
- MCB (CGT_HCR_IMO_FMO , CGT_HCR_IMO , CGT_HCR_FMO ),
391
421
MCB (CGT_HCR_TID2_TID4 , CGT_HCR_TID2 , CGT_HCR_TID4 ),
392
422
MCB (CGT_HCR_TTLB_TTLBIS , CGT_HCR_TTLB , CGT_HCR_TTLBIS ),
393
423
MCB (CGT_HCR_TTLB_TTLBOS , CGT_HCR_TTLB , CGT_HCR_TTLBOS ),
@@ -402,6 +432,9 @@ static const enum cgt_group_id *coarse_control_combo[] = {
402
432
MCB (CGT_MDCR_TDE_TDOSA , CGT_MDCR_TDE , CGT_MDCR_TDOSA ),
403
433
MCB (CGT_MDCR_TDE_TDRA , CGT_MDCR_TDE , CGT_MDCR_TDRA ),
404
434
MCB (CGT_MDCR_TDCC_TDE_TDA , CGT_MDCR_TDCC , CGT_MDCR_TDE , CGT_MDCR_TDA ),
435
+
436
+ MCB (CGT_HCR_IMO_FMO_ICH_HCR_TC , CGT_HCR_IMO , CGT_HCR_FMO , CGT_ICH_HCR_TC ),
437
+ MCB (CGT_ICH_HCR_TC_TDIR , CGT_ICH_HCR_TC , CGT_ICH_HCR_TDIR ),
405
438
};
406
439
407
440
typedef enum trap_behaviour (* complex_condition_check )(struct kvm_vcpu * );
@@ -536,9 +569,9 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
536
569
SR_TRAP (SYS_CSSELR_EL1 , CGT_HCR_TID2_TID4 ),
537
570
SR_RANGE_TRAP (SYS_ID_PFR0_EL1 ,
538
571
sys_reg (3 , 0 , 0 , 7 , 7 ), CGT_HCR_TID3 ),
539
- SR_TRAP (SYS_ICC_SGI0R_EL1 , CGT_HCR_IMO_FMO ),
540
- SR_TRAP (SYS_ICC_ASGI1R_EL1 , CGT_HCR_IMO_FMO ),
541
- SR_TRAP (SYS_ICC_SGI1R_EL1 , CGT_HCR_IMO_FMO ),
572
+ SR_TRAP (SYS_ICC_SGI0R_EL1 , CGT_HCR_IMO_FMO_ICH_HCR_TC ),
573
+ SR_TRAP (SYS_ICC_ASGI1R_EL1 , CGT_HCR_IMO_FMO_ICH_HCR_TC ),
574
+ SR_TRAP (SYS_ICC_SGI1R_EL1 , CGT_HCR_IMO_FMO_ICH_HCR_TC ),
542
575
SR_RANGE_TRAP (sys_reg (3 , 0 , 11 , 0 , 0 ),
543
576
sys_reg (3 , 0 , 11 , 15 , 7 ), CGT_HCR_TIDCP ),
544
577
SR_RANGE_TRAP (sys_reg (3 , 1 , 11 , 0 , 0 ),
@@ -1108,6 +1141,34 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
1108
1141
SR_TRAP (SYS_CNTP_CTL_EL0 , CGT_CNTHCTL_EL1PTEN ),
1109
1142
SR_TRAP (SYS_CNTPCT_EL0 , CGT_CNTHCTL_EL1PCTEN ),
1110
1143
SR_TRAP (SYS_CNTPCTSS_EL0 , CGT_CNTHCTL_EL1PCTEN ),
1144
+ /*
1145
+ * IMPDEF choice:
1146
+ * We treat ICC_SRE_EL2.{SRE,Enable) and ICV_SRE_EL1.SRE as
1147
+ * RAO/WI. We therefore never consider ICC_SRE_EL2.Enable for
1148
+ * ICC_SRE_EL1 access, and always handle it locally.
1149
+ */
1150
+ SR_TRAP (SYS_ICC_AP0R0_EL1 , CGT_ICH_HCR_TALL0 ),
1151
+ SR_TRAP (SYS_ICC_AP0R1_EL1 , CGT_ICH_HCR_TALL0 ),
1152
+ SR_TRAP (SYS_ICC_AP0R2_EL1 , CGT_ICH_HCR_TALL0 ),
1153
+ SR_TRAP (SYS_ICC_AP0R3_EL1 , CGT_ICH_HCR_TALL0 ),
1154
+ SR_TRAP (SYS_ICC_AP1R0_EL1 , CGT_ICH_HCR_TALL1 ),
1155
+ SR_TRAP (SYS_ICC_AP1R1_EL1 , CGT_ICH_HCR_TALL1 ),
1156
+ SR_TRAP (SYS_ICC_AP1R2_EL1 , CGT_ICH_HCR_TALL1 ),
1157
+ SR_TRAP (SYS_ICC_AP1R3_EL1 , CGT_ICH_HCR_TALL1 ),
1158
+ SR_TRAP (SYS_ICC_BPR0_EL1 , CGT_ICH_HCR_TALL0 ),
1159
+ SR_TRAP (SYS_ICC_BPR1_EL1 , CGT_ICH_HCR_TALL1 ),
1160
+ SR_TRAP (SYS_ICC_CTLR_EL1 , CGT_ICH_HCR_TC ),
1161
+ SR_TRAP (SYS_ICC_DIR_EL1 , CGT_ICH_HCR_TC_TDIR ),
1162
+ SR_TRAP (SYS_ICC_EOIR0_EL1 , CGT_ICH_HCR_TALL0 ),
1163
+ SR_TRAP (SYS_ICC_EOIR1_EL1 , CGT_ICH_HCR_TALL1 ),
1164
+ SR_TRAP (SYS_ICC_HPPIR0_EL1 , CGT_ICH_HCR_TALL0 ),
1165
+ SR_TRAP (SYS_ICC_HPPIR1_EL1 , CGT_ICH_HCR_TALL1 ),
1166
+ SR_TRAP (SYS_ICC_IAR0_EL1 , CGT_ICH_HCR_TALL0 ),
1167
+ SR_TRAP (SYS_ICC_IAR1_EL1 , CGT_ICH_HCR_TALL1 ),
1168
+ SR_TRAP (SYS_ICC_IGRPEN0_EL1 , CGT_ICH_HCR_TALL0 ),
1169
+ SR_TRAP (SYS_ICC_IGRPEN1_EL1 , CGT_ICH_HCR_TALL1 ),
1170
+ SR_TRAP (SYS_ICC_PMR_EL1 , CGT_ICH_HCR_TC ),
1171
+ SR_TRAP (SYS_ICC_RPR_EL1 , CGT_ICH_HCR_TC ),
1111
1172
};
1112
1173
1113
1174
static DEFINE_XARRAY (sr_forward_xa );
0 commit comments