Skip to content

Commit d9c5c23

Browse files
Marc Zyngieroupton
authored andcommitted
KVM: arm64: Make RAS registers UNDEF when RAS isn't advertised
We currently always expose FEAT_RAS when available on the host. As we are about to make this feature selectable from userspace, check for it being present before emulating register accesses as RAZ/WI, and inject an UNDEF otherwise. Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 303084a commit d9c5c23

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

arch/arm64/kvm/sys_regs.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2656,6 +2656,23 @@ static bool access_mdcr(struct kvm_vcpu *vcpu,
26562656
return true;
26572657
}
26582658

2659+
static bool access_ras(struct kvm_vcpu *vcpu,
2660+
struct sys_reg_params *p,
2661+
const struct sys_reg_desc *r)
2662+
{
2663+
struct kvm *kvm = vcpu->kvm;
2664+
2665+
switch(reg_to_encoding(r)) {
2666+
default:
2667+
if (!kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, IMP)) {
2668+
kvm_inject_undefined(vcpu);
2669+
return false;
2670+
}
2671+
}
2672+
2673+
return trap_raz_wi(vcpu, p, r);
2674+
}
2675+
26592676
/*
26602677
* For historical (ahem ABI) reasons, KVM treated MIDR_EL1, REVIDR_EL1, and
26612678
* AIDR_EL1 as "invariant" registers, meaning userspace cannot change them.
@@ -3003,14 +3020,14 @@ static const struct sys_reg_desc sys_reg_descs[] = {
30033020
{ SYS_DESC(SYS_AFSR1_EL1), access_vm_reg, reset_unknown, AFSR1_EL1 },
30043021
{ SYS_DESC(SYS_ESR_EL1), access_vm_reg, reset_unknown, ESR_EL1 },
30053022

3006-
{ SYS_DESC(SYS_ERRIDR_EL1), trap_raz_wi },
3007-
{ SYS_DESC(SYS_ERRSELR_EL1), trap_raz_wi },
3008-
{ SYS_DESC(SYS_ERXFR_EL1), trap_raz_wi },
3009-
{ SYS_DESC(SYS_ERXCTLR_EL1), trap_raz_wi },
3010-
{ SYS_DESC(SYS_ERXSTATUS_EL1), trap_raz_wi },
3011-
{ SYS_DESC(SYS_ERXADDR_EL1), trap_raz_wi },
3012-
{ SYS_DESC(SYS_ERXMISC0_EL1), trap_raz_wi },
3013-
{ SYS_DESC(SYS_ERXMISC1_EL1), trap_raz_wi },
3023+
{ SYS_DESC(SYS_ERRIDR_EL1), access_ras },
3024+
{ SYS_DESC(SYS_ERRSELR_EL1), access_ras },
3025+
{ SYS_DESC(SYS_ERXFR_EL1), access_ras },
3026+
{ SYS_DESC(SYS_ERXCTLR_EL1), access_ras },
3027+
{ SYS_DESC(SYS_ERXSTATUS_EL1), access_ras },
3028+
{ SYS_DESC(SYS_ERXADDR_EL1), access_ras },
3029+
{ SYS_DESC(SYS_ERXMISC0_EL1), access_ras },
3030+
{ SYS_DESC(SYS_ERXMISC1_EL1), access_ras },
30143031

30153032
MTE_REG(TFSR_EL1),
30163033
MTE_REG(TFSRE0_EL1),

0 commit comments

Comments
 (0)