]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: arm64: Unify trap handlers injecting an UNDEF
authorMarc Zyngier <maz@kernel.org>
Tue, 10 Nov 2020 14:13:07 +0000 (14:13 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 12 Nov 2020 21:22:45 +0000 (21:22 +0000)
A large number of system register trap handlers only inject an
UNDEF exeption, and yet each class of sysreg seems to provide its
own, identical function.

Let's unify them all, saving us introducing yet another one later.

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

index 0aa86250e354abd027fd03799c48af9457200062..b0022f37c8f1f878b04a833a60904fa46de20ef1 100644 (file)
@@ -1038,8 +1038,8 @@ static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
        { SYS_DESC(SYS_PMEVTYPERn_EL0(n)),                                      \
          access_pmu_evtyper, reset_unknown, (PMEVTYPER0_EL0 + n), }
 
-static bool access_amu(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
-                            const struct sys_reg_desc *r)
+static bool undef_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
+                        const struct sys_reg_desc *r)
 {
        kvm_inject_undefined(vcpu);
 
@@ -1047,24 +1047,10 @@ static bool access_amu(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 }
 
 /* Macro to expand the AMU counter and type registers*/
-#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), access_amu }
-#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), access_amu }
-#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), access_amu }
-#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), access_amu }
-
-static bool trap_ptrauth(struct kvm_vcpu *vcpu,
-                        struct sys_reg_params *p,
-                        const struct sys_reg_desc *rd)
-{
-       /*
-        * If we land here, that is because we didn't fixup the access on exit
-        * by allowing the PtrAuth sysregs. The only way this happens is when
-        * the guest does not have PtrAuth support enabled.
-        */
-       kvm_inject_undefined(vcpu);
-
-       return false;
-}
+#define AMU_AMEVCNTR0_EL0(n) { SYS_DESC(SYS_AMEVCNTR0_EL0(n)), undef_access }
+#define AMU_AMEVTYPER0_EL0(n) { SYS_DESC(SYS_AMEVTYPER0_EL0(n)), undef_access }
+#define AMU_AMEVCNTR1_EL0(n) { SYS_DESC(SYS_AMEVCNTR1_EL0(n)), undef_access }
+#define AMU_AMEVTYPER1_EL0(n) { SYS_DESC(SYS_AMEVTYPER1_EL0(n)), undef_access }
 
 static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
                        const struct sys_reg_desc *rd)
@@ -1072,8 +1058,14 @@ static unsigned int ptrauth_visibility(const struct kvm_vcpu *vcpu,
        return vcpu_has_ptrauth(vcpu) ? 0 : REG_HIDDEN;
 }
 
+/*
+ * If we land here on a PtrAuth access, that is because we didn't
+ * fixup the access on exit by allowing the PtrAuth sysregs. The only
+ * way this happens is when the guest does not have PtrAuth support
+ * enabled.
+ */
 #define __PTRAUTH_KEY(k)                                               \
-       { SYS_DESC(SYS_## k), trap_ptrauth, reset_unknown, k,           \
+       { SYS_DESC(SYS_## k), undef_access, reset_unknown, k,           \
        .visibility = ptrauth_visibility}
 
 #define PTRAUTH_KEY(k)                                                 \
@@ -1374,13 +1366,6 @@ static bool access_ccsidr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
        return true;
 }
 
-static bool access_mte_regs(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
-                           const struct sys_reg_desc *r)
-{
-       kvm_inject_undefined(vcpu);
-       return false;
-}
-
 /* sys_reg_desc initialiser for known cpufeature ID registers */
 #define ID_SANITISED(name) {                   \
        SYS_DESC(SYS_##name),                   \
@@ -1549,8 +1534,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_ACTLR_EL1), access_actlr, reset_actlr, ACTLR_EL1 },
        { SYS_DESC(SYS_CPACR_EL1), NULL, reset_val, CPACR_EL1, 0 },
 
-       { SYS_DESC(SYS_RGSR_EL1), access_mte_regs },
-       { SYS_DESC(SYS_GCR_EL1), access_mte_regs },
+       { SYS_DESC(SYS_RGSR_EL1), undef_access },
+       { SYS_DESC(SYS_GCR_EL1), undef_access },
 
        { SYS_DESC(SYS_ZCR_EL1), NULL, reset_val, ZCR_EL1, 0, .visibility = sve_visibility },
        { SYS_DESC(SYS_TTBR0_EL1), access_vm_reg, reset_unknown, TTBR0_EL1 },
@@ -1576,8 +1561,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { SYS_DESC(SYS_ERXMISC0_EL1), trap_raz_wi },
        { SYS_DESC(SYS_ERXMISC1_EL1), trap_raz_wi },
 
-       { SYS_DESC(SYS_TFSR_EL1), access_mte_regs },
-       { SYS_DESC(SYS_TFSRE0_EL1), access_mte_regs },
+       { SYS_DESC(SYS_TFSR_EL1), undef_access },
+       { SYS_DESC(SYS_TFSRE0_EL1), undef_access },
 
        { SYS_DESC(SYS_FAR_EL1), access_vm_reg, reset_unknown, FAR_EL1 },
        { SYS_DESC(SYS_PAR_EL1), NULL, reset_unknown, PAR_EL1 },
@@ -1641,14 +1626,14 @@ 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_AMCR_EL0), access_amu },
-       { SYS_DESC(SYS_AMCFGR_EL0), access_amu },
-       { SYS_DESC(SYS_AMCGCR_EL0), access_amu },
-       { SYS_DESC(SYS_AMUSERENR_EL0), access_amu },
-       { SYS_DESC(SYS_AMCNTENCLR0_EL0), access_amu },
-       { SYS_DESC(SYS_AMCNTENSET0_EL0), access_amu },
-       { SYS_DESC(SYS_AMCNTENCLR1_EL0), access_amu },
-       { SYS_DESC(SYS_AMCNTENSET1_EL0), access_amu },
+       { SYS_DESC(SYS_AMCR_EL0), undef_access },
+       { SYS_DESC(SYS_AMCFGR_EL0), undef_access },
+       { SYS_DESC(SYS_AMCGCR_EL0), undef_access },
+       { SYS_DESC(SYS_AMUSERENR_EL0), undef_access },
+       { SYS_DESC(SYS_AMCNTENCLR0_EL0), undef_access },
+       { SYS_DESC(SYS_AMCNTENSET0_EL0), undef_access },
+       { SYS_DESC(SYS_AMCNTENCLR1_EL0), undef_access },
+       { SYS_DESC(SYS_AMCNTENSET1_EL0), undef_access },
        AMU_AMEVCNTR0_EL0(0),
        AMU_AMEVCNTR0_EL0(1),
        AMU_AMEVCNTR0_EL0(2),