Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

KVM: arm64: pkvm: Report optional ID register traps with a 0x18 syndrome

With FEAT_IDST, unimplemented system registers in the feature ID space
must be reported using EC=0x18 at the closest handling EL, rather than
with an UNDEF.

Most of these system registers are always implemented thanks to their
dependency on FEAT_AA64, except for a set of (currently) three registers:
GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
and SMIDR_EL1 (depending on SME).

For these three registers, report their trap as EC=0x18 if they
end-up trapping into KVM and that FEAT_IDST is implemented in the guest.
Otherwise, just make them UNDEF.

Link: https://patch.msgid.link/20260108173233.2911955-9-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>

+15
+15
arch/arm64/kvm/hyp/nvhe/sys_regs.c
··· 347 347 return true; 348 348 } 349 349 350 + static bool pvm_idst_access(struct kvm_vcpu *vcpu, 351 + struct sys_reg_params *p, 352 + const struct sys_reg_desc *r) 353 + { 354 + if (kvm_has_feat(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, IMP)) 355 + inject_sync64(vcpu, kvm_vcpu_get_esr(vcpu)); 356 + else 357 + inject_undef64(vcpu); 358 + 359 + return false; 360 + } 361 + 350 362 /* Mark the specified system register as an AArch32 feature id register. */ 351 363 #define AARCH32(REG) { SYS_DESC(REG), .access = pvm_access_id_aarch32 } 352 364 ··· 489 477 490 478 HOST_HANDLED(SYS_CCSIDR_EL1), 491 479 HOST_HANDLED(SYS_CLIDR_EL1), 480 + { SYS_DESC(SYS_CCSIDR2_EL1), .access = pvm_idst_access }, 481 + { SYS_DESC(SYS_GMID_EL1), .access = pvm_idst_access }, 482 + { SYS_DESC(SYS_SMIDR_EL1), .access = pvm_idst_access }, 492 483 HOST_HANDLED(SYS_AIDR_EL1), 493 484 HOST_HANDLED(SYS_CSSELR_EL1), 494 485 HOST_HANDLED(SYS_CTR_EL0),