@@ -89,6 +89,9 @@ enum cgt_group_id {
8989 CGT_HCRX_EnFPM ,
9090 CGT_HCRX_TCR2En ,
9191
92+ CGT_CNTHCTL_EL1TVT ,
93+ CGT_CNTHCTL_EL1TVCT ,
94+
9295 CGT_ICH_HCR_TC ,
9396 CGT_ICH_HCR_TALL0 ,
9497 CGT_ICH_HCR_TALL1 ,
@@ -124,6 +127,8 @@ enum cgt_group_id {
124127 __COMPLEX_CONDITIONS__ ,
125128 CGT_CNTHCTL_EL1PCTEN = __COMPLEX_CONDITIONS__ ,
126129 CGT_CNTHCTL_EL1PTEN ,
130+ CGT_CNTHCTL_EL1NVPCT ,
131+ CGT_CNTHCTL_EL1NVVCT ,
127132
128133 CGT_CPTR_TTA ,
129134 CGT_MDCR_HPMN ,
@@ -393,6 +398,18 @@ static const struct trap_bits coarse_trap_bits[] = {
393398 .mask = HCRX_EL2_TCR2En ,
394399 .behaviour = BEHAVE_FORWARD_RW ,
395400 },
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+ },
396413 [CGT_ICH_HCR_TC ] = {
397414 .index = ICH_HCR_EL2 ,
398415 .value = ICH_HCR_TC ,
@@ -487,6 +504,32 @@ static enum trap_behaviour check_cnthctl_el1pten(struct kvm_vcpu *vcpu)
487504 return BEHAVE_FORWARD_RW ;
488505}
489506
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+
490533static enum trap_behaviour check_cptr_tta (struct kvm_vcpu * vcpu )
491534{
492535 u64 val = __vcpu_sys_reg (vcpu , CPTR_EL2 );
@@ -534,6 +577,8 @@ static enum trap_behaviour check_mdcr_hpmn(struct kvm_vcpu *vcpu)
534577static const complex_condition_check ccc [] = {
535578 CCC (CGT_CNTHCTL_EL1PCTEN , check_cnthctl_el1pcten ),
536579 CCC (CGT_CNTHCTL_EL1PTEN , check_cnthctl_el1pten ),
580+ CCC (CGT_CNTHCTL_EL1NVPCT , check_cnthctl_el1nvpct ),
581+ CCC (CGT_CNTHCTL_EL1NVVCT , check_cnthctl_el1nvvct ),
537582 CCC (CGT_CPTR_TTA , check_cptr_tta ),
538583 CCC (CGT_MDCR_HPMN , check_mdcr_hpmn ),
539584};
@@ -850,11 +895,15 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
850895 SYS_CNTHP_CVAL_EL2 , CGT_HCR_NV ),
851896 SR_RANGE_TRAP (SYS_CNTHV_TVAL_EL2 ,
852897 SYS_CNTHV_CVAL_EL2 , CGT_HCR_NV ),
853- /* All _EL02, _EL12 registers */
898+ /* All _EL02, _EL12 registers up to CNTKCTL_EL12 */
854899 SR_RANGE_TRAP (sys_reg (3 , 5 , 0 , 0 , 0 ),
855900 sys_reg (3 , 5 , 10 , 15 , 7 ), CGT_HCR_NV ),
856901 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 ),
858907 SR_TRAP (OP_AT_S1E2R , CGT_HCR_NV ),
859908 SR_TRAP (OP_AT_S1E2W , CGT_HCR_NV ),
860909 SR_TRAP (OP_AT_S12E1R , CGT_HCR_NV ),
@@ -1184,6 +1233,11 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
11841233 SR_TRAP (SYS_CNTP_CTL_EL0 , CGT_CNTHCTL_EL1PTEN ),
11851234 SR_TRAP (SYS_CNTPCT_EL0 , CGT_CNTHCTL_EL1PCTEN ),
11861235 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 ),
11871241 SR_TRAP (SYS_FPMR , CGT_HCRX_EnFPM ),
11881242 /*
11891243 * IMPDEF choice:
0 commit comments