@@ -89,6 +89,9 @@ enum cgt_group_id {
89
89
CGT_HCRX_EnFPM ,
90
90
CGT_HCRX_TCR2En ,
91
91
92
+ CGT_CNTHCTL_EL1TVT ,
93
+ CGT_CNTHCTL_EL1TVCT ,
94
+
92
95
CGT_ICH_HCR_TC ,
93
96
CGT_ICH_HCR_TALL0 ,
94
97
CGT_ICH_HCR_TALL1 ,
@@ -124,6 +127,8 @@ enum cgt_group_id {
124
127
__COMPLEX_CONDITIONS__ ,
125
128
CGT_CNTHCTL_EL1PCTEN = __COMPLEX_CONDITIONS__ ,
126
129
CGT_CNTHCTL_EL1PTEN ,
130
+ CGT_CNTHCTL_EL1NVPCT ,
131
+ CGT_CNTHCTL_EL1NVVCT ,
127
132
128
133
CGT_CPTR_TTA ,
129
134
CGT_MDCR_HPMN ,
@@ -393,6 +398,18 @@ static const struct trap_bits coarse_trap_bits[] = {
393
398
.mask = HCRX_EL2_TCR2En ,
394
399
.behaviour = BEHAVE_FORWARD_RW ,
395
400
},
401
+ [CGT_CNTHCTL_EL1TVT ] = {
402
+ .index = CNTHCTL_EL2 ,
403
+ .value = CNTHCTL_EL1TVT ,
404
+ .mask = CNTHCTL_EL1TVT ,
405
+ .behaviour = BEHAVE_FORWARD_RW ,
406
+ },
407
+ [CGT_CNTHCTL_EL1TVCT ] = {
408
+ .index = CNTHCTL_EL2 ,
409
+ .value = CNTHCTL_EL1TVCT ,
410
+ .mask = CNTHCTL_EL1TVCT ,
411
+ .behaviour = BEHAVE_FORWARD_READ ,
412
+ },
396
413
[CGT_ICH_HCR_TC ] = {
397
414
.index = ICH_HCR_EL2 ,
398
415
.value = ICH_HCR_TC ,
@@ -487,6 +504,32 @@ static enum trap_behaviour check_cnthctl_el1pten(struct kvm_vcpu *vcpu)
487
504
return BEHAVE_FORWARD_RW ;
488
505
}
489
506
507
+ static bool is_nested_nv2_guest (struct kvm_vcpu * vcpu )
508
+ {
509
+ u64 val ;
510
+
511
+ val = __vcpu_sys_reg (vcpu , HCR_EL2 );
512
+ return ((val & (HCR_E2H | HCR_TGE | HCR_NV2 | HCR_NV1 | HCR_NV )) == (HCR_E2H | HCR_NV2 | HCR_NV ));
513
+ }
514
+
515
+ static enum trap_behaviour check_cnthctl_el1nvpct (struct kvm_vcpu * vcpu )
516
+ {
517
+ if (!is_nested_nv2_guest (vcpu ) ||
518
+ !(__vcpu_sys_reg (vcpu , CNTHCTL_EL2 ) & CNTHCTL_EL1NVPCT ))
519
+ return BEHAVE_HANDLE_LOCALLY ;
520
+
521
+ return BEHAVE_FORWARD_RW ;
522
+ }
523
+
524
+ static enum trap_behaviour check_cnthctl_el1nvvct (struct kvm_vcpu * vcpu )
525
+ {
526
+ if (!is_nested_nv2_guest (vcpu ) ||
527
+ !(__vcpu_sys_reg (vcpu , CNTHCTL_EL2 ) & CNTHCTL_EL1NVVCT ))
528
+ return BEHAVE_HANDLE_LOCALLY ;
529
+
530
+ return BEHAVE_FORWARD_RW ;
531
+ }
532
+
490
533
static enum trap_behaviour check_cptr_tta (struct kvm_vcpu * vcpu )
491
534
{
492
535
u64 val = __vcpu_sys_reg (vcpu , CPTR_EL2 );
@@ -534,6 +577,8 @@ static enum trap_behaviour check_mdcr_hpmn(struct kvm_vcpu *vcpu)
534
577
static const complex_condition_check ccc [] = {
535
578
CCC (CGT_CNTHCTL_EL1PCTEN , check_cnthctl_el1pcten ),
536
579
CCC (CGT_CNTHCTL_EL1PTEN , check_cnthctl_el1pten ),
580
+ CCC (CGT_CNTHCTL_EL1NVPCT , check_cnthctl_el1nvpct ),
581
+ CCC (CGT_CNTHCTL_EL1NVVCT , check_cnthctl_el1nvvct ),
537
582
CCC (CGT_CPTR_TTA , check_cptr_tta ),
538
583
CCC (CGT_MDCR_HPMN , check_mdcr_hpmn ),
539
584
};
@@ -850,11 +895,15 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
850
895
SYS_CNTHP_CVAL_EL2 , CGT_HCR_NV ),
851
896
SR_RANGE_TRAP (SYS_CNTHV_TVAL_EL2 ,
852
897
SYS_CNTHV_CVAL_EL2 , CGT_HCR_NV ),
853
- /* All _EL02, _EL12 registers */
898
+ /* All _EL02, _EL12 registers up to CNTKCTL_EL12 */
854
899
SR_RANGE_TRAP (sys_reg (3 , 5 , 0 , 0 , 0 ),
855
900
sys_reg (3 , 5 , 10 , 15 , 7 ), CGT_HCR_NV ),
856
901
SR_RANGE_TRAP (sys_reg (3 , 5 , 12 , 0 , 0 ),
857
- sys_reg (3 , 5 , 14 , 15 , 7 ), CGT_HCR_NV ),
902
+ sys_reg (3 , 5 , 14 , 1 , 0 ), CGT_HCR_NV ),
903
+ SR_TRAP (SYS_CNTP_CTL_EL02 , CGT_CNTHCTL_EL1NVPCT ),
904
+ SR_TRAP (SYS_CNTP_CVAL_EL02 , CGT_CNTHCTL_EL1NVPCT ),
905
+ SR_TRAP (SYS_CNTV_CTL_EL02 , CGT_CNTHCTL_EL1NVVCT ),
906
+ SR_TRAP (SYS_CNTV_CVAL_EL02 , CGT_CNTHCTL_EL1NVVCT ),
858
907
SR_TRAP (OP_AT_S1E2R , CGT_HCR_NV ),
859
908
SR_TRAP (OP_AT_S1E2W , CGT_HCR_NV ),
860
909
SR_TRAP (OP_AT_S12E1R , CGT_HCR_NV ),
@@ -1184,6 +1233,11 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
1184
1233
SR_TRAP (SYS_CNTP_CTL_EL0 , CGT_CNTHCTL_EL1PTEN ),
1185
1234
SR_TRAP (SYS_CNTPCT_EL0 , CGT_CNTHCTL_EL1PCTEN ),
1186
1235
SR_TRAP (SYS_CNTPCTSS_EL0 , CGT_CNTHCTL_EL1PCTEN ),
1236
+ SR_TRAP (SYS_CNTV_TVAL_EL0 , CGT_CNTHCTL_EL1TVT ),
1237
+ SR_TRAP (SYS_CNTV_CVAL_EL0 , CGT_CNTHCTL_EL1TVT ),
1238
+ SR_TRAP (SYS_CNTV_CTL_EL0 , CGT_CNTHCTL_EL1TVT ),
1239
+ SR_TRAP (SYS_CNTVCT_EL0 , CGT_CNTHCTL_EL1TVCT ),
1240
+ SR_TRAP (SYS_CNTVCTSS_EL0 , CGT_CNTHCTL_EL1TVCT ),
1187
1241
SR_TRAP (SYS_FPMR , CGT_HCRX_EnFPM ),
1188
1242
/*
1189
1243
* IMPDEF choice:
0 commit comments