KVM: arm64: Simplify handling of CNTKCTL_EL12
authorMarc Zyngier <maz@kernel.org>
Wed, 4 Sep 2024 08:24:17 +0000 (09:24 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 11 Sep 2024 18:49:16 +0000 (19:49 +0100)
We go trough a great deal of effort to map CNTKCTL_EL12 to CNTKCTL_EL1
while hidding this mapping from userspace via a special visibility helper.

However, it would be far simpler to just provide an accessor doing the
mapping job, removing the need for a visibility helper.

With that done, we can also remove the EL12_REG() macro which serves
no purpose.

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

index c903240..9e44038 100644 (file)
@@ -2095,15 +2095,6 @@ static unsigned int hidden_user_visibility(const struct kvm_vcpu *vcpu,
        return REG_HIDDEN_USER;
 }
 
-#define EL12_REG(name, acc, rst, v) {          \
-       SYS_DESC(SYS_##name##_EL12),            \
-       .access = acc,                          \
-       .reset = rst,                           \
-       .reg = name##_EL1,                      \
-       .val = v,                               \
-       .visibility = hidden_user_visibility,   \
-}
-
 /*
  * Since reset() callback and field val are not used for idregs, they will be
  * used for specific purposes for idregs.
@@ -2211,6 +2202,18 @@ static bool access_spsr(struct kvm_vcpu *vcpu,
        return true;
 }
 
+static bool access_cntkctl_el12(struct kvm_vcpu *vcpu,
+                               struct sys_reg_params *p,
+                               const struct sys_reg_desc *r)
+{
+       if (p->is_write)
+               __vcpu_sys_reg(vcpu, CNTKCTL_EL1) = p->regval;
+       else
+               p->regval = __vcpu_sys_reg(vcpu, CNTKCTL_EL1);
+
+       return true;
+}
+
 static u64 reset_hcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
 {
        u64 val = r->val;
@@ -2798,7 +2801,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        EL2_REG_VNCR(CNTVOFF_EL2, reset_val, 0),
        EL2_REG(CNTHCTL_EL2, access_rw, reset_val, 0),
 
-       EL12_REG(CNTKCTL, access_rw, reset_val, 0),
+       { SYS_DESC(SYS_CNTKCTL_EL12), access_cntkctl_el12 },
 
        EL2_REG(SP_EL2, NULL, reset_unknown, 0),
 };