Skip to content

Commit c271269

Browse files
author
Marc Zyngier
committed
KVM: arm64: nv: Add trap routing for CNTHCTL_EL2.EL1{NVPCT,NVVCT,TVT,TVCT}
For completeness, fun, and cerebral meltdown, add the virtualisation related traps to the counter and timers. Acked-by: Oliver Upton <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Zyngier <[email protected]>
1 parent b86fc21 commit c271269

File tree

1 file changed

+56
-2
lines changed

1 file changed

+56
-2
lines changed

arch/arm64/kvm/emulate-nested.c

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
490533
static 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)
534577
static 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

Comments
 (0)