KVM: arm64: Handle SCXTNUM_ELx traps
authorMarc Zyngier <maz@kernel.org>
Tue, 10 Nov 2020 14:13:08 +0000 (14:13 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 12 Nov 2020 21:22:46 +0000 (21:22 +0000)
As the kernel never sets HCR_EL2.EnSCXT, accesses to SCXTNUM_ELx
will trap to EL2. Let's handle that as gracefully as possible
by injecting an UNDEF exception into the guest. This is consistent
with the guest's view of ID_AA64PFR0_EL1.CSV2 being at most 1.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Acked-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20201110141308.451654-4-maz@kernel.org
arch/arm64/include/asm/sysreg.h
arch/arm64/kvm/sys_regs.c

index d52c1b3..a427a56 100644 (file)
 #define SYS_CONTEXTIDR_EL1             sys_reg(3, 0, 13, 0, 1)
 #define SYS_TPIDR_EL1                  sys_reg(3, 0, 13, 0, 4)
 
+#define SYS_SCXTNUM_EL1                        sys_reg(3, 0, 13, 0, 7)
+
 #define SYS_CNTKCTL_EL1                        sys_reg(3, 0, 14, 1, 0)
 
 #define SYS_CCSIDR_EL1                 sys_reg(3, 1, 0, 0, 0)
 #define SYS_TPIDR_EL0                  sys_reg(3, 3, 13, 0, 2)
 #define SYS_TPIDRRO_EL0                        sys_reg(3, 3, 13, 0, 3)
 
+#define SYS_SCXTNUM_EL0                        sys_reg(3, 3, 13, 0, 7)
+
 /* Definitions for system register interface to AMU for ARMv8.4 onwards */
 #define SYS_AM_EL0(crm, op2)           sys_reg(3, 3, 13, (crm), (op2))
 #define SYS_AMCR_EL0                   SYS_AM_EL0(2, 0)
index b0022f3..c1726fb 100644 (file)
@@ -1598,6 +1598,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_CONTEXTIDR_EL1), access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 },
        { SYS_DESC(SYS_TPIDR_EL1), NULL, reset_unknown, TPIDR_EL1 },
 
+       { SYS_DESC(SYS_SCXTNUM_EL1), undef_access },
+
        { SYS_DESC(SYS_CNTKCTL_EL1), NULL, reset_val, CNTKCTL_EL1, 0},
 
        { SYS_DESC(SYS_CCSIDR_EL1), access_ccsidr },
@@ -1626,6 +1628,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_TPIDR_EL0), NULL, reset_unknown, TPIDR_EL0 },
        { SYS_DESC(SYS_TPIDRRO_EL0), NULL, reset_unknown, TPIDRRO_EL0 },
 
+       { SYS_DESC(SYS_SCXTNUM_EL0), undef_access },
+
        { SYS_DESC(SYS_AMCR_EL0), undef_access },
        { SYS_DESC(SYS_AMCFGR_EL0), undef_access },
        { SYS_DESC(SYS_AMCGCR_EL0), undef_access },