Skip to content

Commit 04cf546

Browse files
Miguel Luisoupton
authored andcommitted
KVM: arm64: Refine _EL2 system register list that require trap reinjection
Implement a fine grained approach in the _EL2 sysreg range instead of the current wide cast trap. This ensures that we don't mistakenly inject the wrong exception into the guest. [maz: commit message massaging, dropped secure and AArch32 registers from the list] Fixes: d0fc0a2 ("KVM: arm64: nv: Add trap forwarding for HCR_EL2") Reviewed-by: Eric Auger <[email protected]> Signed-off-by: Miguel Luis <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 41f6c93 commit 04cf546

File tree

1 file changed

+71
-6
lines changed

1 file changed

+71
-6
lines changed

arch/arm64/kvm/emulate-nested.c

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -648,15 +648,80 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
648648
SR_TRAP(SYS_APGAKEYLO_EL1, CGT_HCR_APK),
649649
SR_TRAP(SYS_APGAKEYHI_EL1, CGT_HCR_APK),
650650
/* All _EL2 registers */
651-
SR_RANGE_TRAP(sys_reg(3, 4, 0, 0, 0),
652-
sys_reg(3, 4, 3, 15, 7), CGT_HCR_NV),
651+
SR_TRAP(SYS_BRBCR_EL2, CGT_HCR_NV),
652+
SR_TRAP(SYS_VPIDR_EL2, CGT_HCR_NV),
653+
SR_TRAP(SYS_VMPIDR_EL2, CGT_HCR_NV),
654+
SR_TRAP(SYS_SCTLR_EL2, CGT_HCR_NV),
655+
SR_TRAP(SYS_ACTLR_EL2, CGT_HCR_NV),
656+
SR_TRAP(SYS_SCTLR2_EL2, CGT_HCR_NV),
657+
SR_RANGE_TRAP(SYS_HCR_EL2,
658+
SYS_HCRX_EL2, CGT_HCR_NV),
659+
SR_TRAP(SYS_SMPRIMAP_EL2, CGT_HCR_NV),
660+
SR_TRAP(SYS_SMCR_EL2, CGT_HCR_NV),
661+
SR_RANGE_TRAP(SYS_TTBR0_EL2,
662+
SYS_TCR2_EL2, CGT_HCR_NV),
663+
SR_TRAP(SYS_VTTBR_EL2, CGT_HCR_NV),
664+
SR_TRAP(SYS_VTCR_EL2, CGT_HCR_NV),
665+
SR_TRAP(SYS_VNCR_EL2, CGT_HCR_NV),
666+
SR_RANGE_TRAP(SYS_HDFGRTR_EL2,
667+
SYS_HAFGRTR_EL2, CGT_HCR_NV),
653668
/* Skip the SP_EL1 encoding... */
654669
SR_TRAP(SYS_SPSR_EL2, CGT_HCR_NV),
655670
SR_TRAP(SYS_ELR_EL2, CGT_HCR_NV),
656-
SR_RANGE_TRAP(sys_reg(3, 4, 4, 1, 1),
657-
sys_reg(3, 4, 10, 15, 7), CGT_HCR_NV),
658-
SR_RANGE_TRAP(sys_reg(3, 4, 12, 0, 0),
659-
sys_reg(3, 4, 14, 15, 7), CGT_HCR_NV),
671+
/* Skip SPSR_irq, SPSR_abt, SPSR_und, SPSR_fiq */
672+
SR_TRAP(SYS_AFSR0_EL2, CGT_HCR_NV),
673+
SR_TRAP(SYS_AFSR1_EL2, CGT_HCR_NV),
674+
SR_TRAP(SYS_ESR_EL2, CGT_HCR_NV),
675+
SR_TRAP(SYS_VSESR_EL2, CGT_HCR_NV),
676+
SR_TRAP(SYS_TFSR_EL2, CGT_HCR_NV),
677+
SR_TRAP(SYS_FAR_EL2, CGT_HCR_NV),
678+
SR_TRAP(SYS_HPFAR_EL2, CGT_HCR_NV),
679+
SR_TRAP(SYS_PMSCR_EL2, CGT_HCR_NV),
680+
SR_TRAP(SYS_MAIR_EL2, CGT_HCR_NV),
681+
SR_TRAP(SYS_AMAIR_EL2, CGT_HCR_NV),
682+
SR_TRAP(SYS_MPAMHCR_EL2, CGT_HCR_NV),
683+
SR_TRAP(SYS_MPAMVPMV_EL2, CGT_HCR_NV),
684+
SR_TRAP(SYS_MPAM2_EL2, CGT_HCR_NV),
685+
SR_RANGE_TRAP(SYS_MPAMVPM0_EL2,
686+
SYS_MPAMVPM7_EL2, CGT_HCR_NV),
687+
/*
688+
* Note that the spec. describes a group of MEC registers
689+
* whose access should not trap, therefore skip the following:
690+
* MECID_A0_EL2, MECID_A1_EL2, MECID_P0_EL2,
691+
* MECID_P1_EL2, MECIDR_EL2, VMECID_A_EL2,
692+
* VMECID_P_EL2.
693+
*/
694+
SR_RANGE_TRAP(SYS_VBAR_EL2,
695+
SYS_RMR_EL2, CGT_HCR_NV),
696+
SR_TRAP(SYS_VDISR_EL2, CGT_HCR_NV),
697+
/* ICH_AP0R<m>_EL2 */
698+
SR_RANGE_TRAP(SYS_ICH_AP0R0_EL2,
699+
SYS_ICH_AP0R3_EL2, CGT_HCR_NV),
700+
/* ICH_AP1R<m>_EL2 */
701+
SR_RANGE_TRAP(SYS_ICH_AP1R0_EL2,
702+
SYS_ICH_AP1R3_EL2, CGT_HCR_NV),
703+
SR_TRAP(SYS_ICC_SRE_EL2, CGT_HCR_NV),
704+
SR_RANGE_TRAP(SYS_ICH_HCR_EL2,
705+
SYS_ICH_EISR_EL2, CGT_HCR_NV),
706+
SR_TRAP(SYS_ICH_ELRSR_EL2, CGT_HCR_NV),
707+
SR_TRAP(SYS_ICH_VMCR_EL2, CGT_HCR_NV),
708+
/* ICH_LR<m>_EL2 */
709+
SR_RANGE_TRAP(SYS_ICH_LR0_EL2,
710+
SYS_ICH_LR15_EL2, CGT_HCR_NV),
711+
SR_TRAP(SYS_CONTEXTIDR_EL2, CGT_HCR_NV),
712+
SR_TRAP(SYS_TPIDR_EL2, CGT_HCR_NV),
713+
SR_TRAP(SYS_SCXTNUM_EL2, CGT_HCR_NV),
714+
/* AMEVCNTVOFF0<n>_EL2, AMEVCNTVOFF1<n>_EL2 */
715+
SR_RANGE_TRAP(SYS_AMEVCNTVOFF0n_EL2(0),
716+
SYS_AMEVCNTVOFF1n_EL2(15), CGT_HCR_NV),
717+
/* CNT*_EL2 */
718+
SR_TRAP(SYS_CNTVOFF_EL2, CGT_HCR_NV),
719+
SR_TRAP(SYS_CNTPOFF_EL2, CGT_HCR_NV),
720+
SR_TRAP(SYS_CNTHCTL_EL2, CGT_HCR_NV),
721+
SR_RANGE_TRAP(SYS_CNTHP_TVAL_EL2,
722+
SYS_CNTHP_CVAL_EL2, CGT_HCR_NV),
723+
SR_RANGE_TRAP(SYS_CNTHV_TVAL_EL2,
724+
SYS_CNTHV_CVAL_EL2, CGT_HCR_NV),
660725
/* All _EL02, _EL12 registers */
661726
SR_RANGE_TRAP(sys_reg(3, 5, 0, 0, 0),
662727
sys_reg(3, 5, 10, 15, 7), CGT_HCR_NV),

0 commit comments

Comments
 (0)