Skip to content

Commit 6fb7573

Browse files
author
Marc Zyngier
committed
KVM: arm64: nv: Add userspace and guest handling of VNCR_EL2
Plug VNCR_EL2 in the vcpu_sysreg enum, define its RES0/RES1 bits, and make it accessible to userspace when the VM is configured to support FEAT_NV2. Reviewed-by: Oliver Upton <oliver.upton@linux.dev> Link: https://lore.kernel.org/r/20250514103501.2225951-9-maz@kernel.org Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent ea8d3cf commit 6fb7573

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ enum vcpu_sysreg {
562562
VNCR(HDFGWTR_EL2),
563563
VNCR(HAFGRTR_EL2),
564564

565+
VNCR(VNCR_EL2),
566+
565567
VNCR(CNTVOFF_EL2),
566568
VNCR(CNTV_CVAL_EL0),
567569
VNCR(CNTV_CTL_EL0),

arch/arm64/kvm/nested.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,9 @@ int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu)
14001400
res0 |= ICH_HCR_EL2_DVIM | ICH_HCR_EL2_vSGIEOICount;
14011401
set_sysreg_masks(kvm, ICH_HCR_EL2, res0, res1);
14021402

1403+
/* VNCR_EL2 */
1404+
set_sysreg_masks(kvm, VNCR_EL2, VNCR_EL2_RES0, VNCR_EL2_RES1);
1405+
14031406
out:
14041407
for (enum vcpu_sysreg sr = __SANITISED_REG_START__; sr < NR_SYS_REGS; sr++)
14051408
(void)__vcpu_sys_reg(vcpu, sr);

arch/arm64/kvm/sys_regs.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,15 +2281,6 @@ static bool bad_redir_trap(struct kvm_vcpu *vcpu,
22812281
"trap of EL2 register redirected to EL1");
22822282
}
22832283

2284-
#define EL2_REG(name, acc, rst, v) { \
2285-
SYS_DESC(SYS_##name), \
2286-
.access = acc, \
2287-
.reset = rst, \
2288-
.reg = name, \
2289-
.visibility = el2_visibility, \
2290-
.val = v, \
2291-
}
2292-
22932284
#define EL2_REG_FILTERED(name, acc, rst, v, filter) { \
22942285
SYS_DESC(SYS_##name), \
22952286
.access = acc, \
@@ -2299,6 +2290,9 @@ static bool bad_redir_trap(struct kvm_vcpu *vcpu,
22992290
.val = v, \
23002291
}
23012292

2293+
#define EL2_REG(name, acc, rst, v) \
2294+
EL2_REG_FILTERED(name, acc, rst, v, el2_visibility)
2295+
23022296
#define EL2_REG_VNCR(name, rst, v) EL2_REG(name, bad_vncr_trap, rst, v)
23032297
#define EL2_REG_REDIR(name, rst, v) EL2_REG(name, bad_redir_trap, rst, v)
23042298

@@ -2446,6 +2440,16 @@ static unsigned int sve_el2_visibility(const struct kvm_vcpu *vcpu,
24462440
return __el2_visibility(vcpu, rd, sve_visibility);
24472441
}
24482442

2443+
static unsigned int vncr_el2_visibility(const struct kvm_vcpu *vcpu,
2444+
const struct sys_reg_desc *rd)
2445+
{
2446+
if (el2_visibility(vcpu, rd) == 0 &&
2447+
kvm_has_feat(vcpu->kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY))
2448+
return 0;
2449+
2450+
return REG_HIDDEN;
2451+
}
2452+
24492453
static bool access_zcr_el2(struct kvm_vcpu *vcpu,
24502454
struct sys_reg_params *p,
24512455
const struct sys_reg_desc *r)
@@ -3263,6 +3267,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
32633267
tcr2_el2_visibility),
32643268
EL2_REG_VNCR(VTTBR_EL2, reset_val, 0),
32653269
EL2_REG_VNCR(VTCR_EL2, reset_val, 0),
3270+
EL2_REG_FILTERED(VNCR_EL2, bad_vncr_trap, reset_val, 0,
3271+
vncr_el2_visibility),
32663272

32673273
{ SYS_DESC(SYS_DACR32_EL2), undef_access, reset_unknown, DACR32_EL2 },
32683274
EL2_REG_VNCR(HDFGRTR_EL2, reset_val, 0),

0 commit comments

Comments
 (0)