KVM: arm64: Use visibility hook to treat ID regs as RAZ
authorOliver Upton <oliver.upton@linux.dev>
Tue, 13 Sep 2022 09:44:34 +0000 (09:44 +0000)
committerMarc Zyngier <maz@kernel.org>
Wed, 14 Sep 2022 10:36:16 +0000 (11:36 +0100)
The generic id reg accessors already handle RAZ registers by way of the
visibility hook. Add a visibility hook that returns REG_RAZ
unconditionally and throw out the RAZ specific accessors.

Reviewed-by: Reiji Watanabe <reijiw@google.com>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220913094441.3957645-2-oliver.upton@linux.dev
arch/arm64/kvm/sys_regs.c

index 3234f50..e18efb9 100644 (file)
@@ -1145,6 +1145,12 @@ static unsigned int id_visibility(const struct kvm_vcpu *vcpu,
        return 0;
 }
 
+static unsigned int raz_visibility(const struct kvm_vcpu *vcpu,
+                                  const struct sys_reg_desc *r)
+{
+       return REG_RAZ;
+}
+
 /* cpufeature ID register access trap handlers */
 
 static bool __access_id_reg(struct kvm_vcpu *vcpu,
@@ -1168,13 +1174,6 @@ static bool access_id_reg(struct kvm_vcpu *vcpu,
        return __access_id_reg(vcpu, p, r, raz);
 }
 
-static bool access_raz_id_reg(struct kvm_vcpu *vcpu,
-                             struct sys_reg_params *p,
-                             const struct sys_reg_desc *r)
-{
-       return __access_id_reg(vcpu, p, r, true);
-}
-
 /* Visibility overrides for SVE-specific control registers */
 static unsigned int sve_visibility(const struct kvm_vcpu *vcpu,
                                   const struct sys_reg_desc *rd)
@@ -1262,12 +1261,6 @@ static int set_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
        return __set_id_reg(vcpu, rd, val, raz);
 }
 
-static int set_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
-                         u64 val)
-{
-       return __set_id_reg(vcpu, rd, val, true);
-}
-
 static int get_raz_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
                       u64 *val)
 {
@@ -1374,9 +1367,10 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu,
  */
 #define ID_UNALLOCATED(crm, op2) {                     \
        Op0(3), Op1(0), CRn(0), CRm(crm), Op2(op2),     \
-       .access = access_raz_id_reg,                    \
-       .get_user = get_raz_reg,                        \
-       .set_user = set_raz_id_reg,                     \
+       .access = access_id_reg,                        \
+       .get_user = get_id_reg,                         \
+       .set_user = set_id_reg,                         \
+       .visibility = raz_visibility                    \
 }
 
 /*
@@ -1386,9 +1380,10 @@ static unsigned int mte_visibility(const struct kvm_vcpu *vcpu,
  */
 #define ID_HIDDEN(name) {                      \
        SYS_DESC(SYS_##name),                   \
-       .access = access_raz_id_reg,            \
-       .get_user = get_raz_reg,                \
-       .set_user = set_raz_id_reg,             \
+       .access = access_id_reg,                \
+       .get_user = get_id_reg,                 \
+       .set_user = set_id_reg,                 \
+       .visibility = raz_visibility,           \
 }
 
 /*