Skip to content

Commit d1e37a5

Browse files
author
Marc Zyngier
committed
KVM: arm64: nv: Sanitise CNTHCTL_EL2
Inject some sanity in CNTHCTL_EL2, ensuring that we don't handle more than we advertise to the guest. Acked-by: Oliver Upton <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Zyngier <[email protected]>
1 parent 479428c commit d1e37a5

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,6 @@ enum vcpu_sysreg {
490490
VBAR_EL2, /* Vector Base Address Register (EL2) */
491491
RVBAR_EL2, /* Reset Vector Base Address Register */
492492
CONTEXTIDR_EL2, /* Context ID Register (EL2) */
493-
CNTHCTL_EL2, /* Counter-timer Hypervisor Control register */
494493
SP_EL2, /* EL2 Stack Pointer */
495494
CNTHP_CTL_EL2,
496495
CNTHP_CVAL_EL2,
@@ -501,6 +500,7 @@ enum vcpu_sysreg {
501500
MARKER(__SANITISED_REG_START__),
502501
TCR2_EL2, /* Extended Translation Control Register (EL2) */
503502
MDCR_EL2, /* Monitor Debug Configuration Register (EL2) */
503+
CNTHCTL_EL2, /* Counter-timer Hypervisor Control register */
504504

505505
/* Any VNCR-capable reg goes after this point */
506506
MARKER(__VNCR_START__),

arch/arm64/kvm/nested.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,21 @@ int kvm_init_nv_sysregs(struct kvm *kvm)
12711271
res0 |= MDCR_EL2_EnSTEPOP;
12721272
set_sysreg_masks(kvm, MDCR_EL2, res0, res1);
12731273

1274+
/* CNTHCTL_EL2 */
1275+
res0 = GENMASK(63, 20);
1276+
res1 = 0;
1277+
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RME, IMP))
1278+
res0 |= CNTHCTL_CNTPMASK | CNTHCTL_CNTVMASK;
1279+
if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, CNTPOFF)) {
1280+
res0 |= CNTHCTL_ECV;
1281+
if (!kvm_has_feat(kvm, ID_AA64MMFR0_EL1, ECV, IMP))
1282+
res0 |= (CNTHCTL_EL1TVT | CNTHCTL_EL1TVCT |
1283+
CNTHCTL_EL1NVPCT | CNTHCTL_EL1NVVCT);
1284+
}
1285+
if (!kvm_has_feat(kvm, ID_AA64MMFR1_EL1, VH, IMP))
1286+
res0 |= GENMASK(11, 8);
1287+
set_sysreg_masks(kvm, CNTHCTL_EL2, res0, res1);
1288+
12741289
return 0;
12751290
}
12761291

include/clocksource/arm_arch_timer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#define CNTHCTL_EL1TVCT (1 << 14)
2727
#define CNTHCTL_EL1NVPCT (1 << 15)
2828
#define CNTHCTL_EL1NVVCT (1 << 16)
29+
#define CNTHCTL_CNTVMASK (1 << 18)
30+
#define CNTHCTL_CNTPMASK (1 << 19)
2931

3032
enum arch_timer_reg {
3133
ARCH_TIMER_REG_CTRL,

0 commit comments

Comments
 (0)