Currently, enumeration of the core register IDs for
KVM_GET_REG_LIST is open-coded in kvm_arm_copy_reg_indices().

This will become cumbersome as the enumeration logic becomes more
complex.  In preparation for future patches, this patch factors the
code out into a separate function copy_core_reg_indices(),
consistently with the way other classes of registers are handled.

No functional change.

Signed-off-by: Dave Martin <[email protected]>
---
 arch/arm64/kvm/guest.c | 65 ++++++++++++++++++++++++++------------------------
 1 file changed, 34 insertions(+), 31 deletions(-)

diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index cbe423b..46eb867 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -205,23 +205,53 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, 
struct kvm_regs *regs)
        return -EINVAL;
 }
 
-static unsigned long num_core_regs(void)
+static int copy_core_reg_indices(u64 __user **uind)
 {
        unsigned int i;
        int n = 0;
 
        for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
+               u64 reg = KVM_REG_ARM64 | KVM_REG_ARM_CORE | i;
                int size = core_reg_size_from_offset(i);
 
                if (size < 0)
                        continue;
 
+               switch (size) {
+               case sizeof(__u32):
+                       reg |= KVM_REG_SIZE_U32;
+                       break;
+
+               case sizeof(__u64):
+                       reg |= KVM_REG_SIZE_U64;
+                       break;
+
+               case sizeof(__uint128_t):
+                       reg |= KVM_REG_SIZE_U128;
+                       break;
+
+               default:
+                       WARN_ON(1);
+                       continue;
+               }
+
+               if (uind) {
+                       if (put_user(reg, *uind))
+                               return -EFAULT;
+                       ++*uind;
+               }
+
                n++;
        }
 
        return n;
 }
 
+static unsigned long num_core_regs(void)
+{
+       return copy_core_reg_indices(NULL);
+}
+
 /**
  * ARM64 versions of the TIMER registers, always available on arm64
  */
@@ -293,38 +323,11 @@ unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu)
  */
 int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
 {
-       unsigned int i;
        int ret;
 
-       for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
-               u64 reg = KVM_REG_ARM64 | KVM_REG_ARM_CORE | i;
-               int size = core_reg_size_from_offset(i);
-
-               if (size < 0)
-                       continue;
-
-               switch (size) {
-               case sizeof(__u32):
-                       reg |= KVM_REG_SIZE_U32;
-                       break;
-
-               case sizeof(__u64):
-                       reg |= KVM_REG_SIZE_U64;
-                       break;
-
-               case sizeof(__uint128_t):
-                       reg |= KVM_REG_SIZE_U128;
-                       break;
-
-               default:
-                       WARN_ON(1);
-                       continue;
-               }
-
-               if (put_user(reg, uindices))
-                       return -EFAULT;
-               uindices++;
-       }
+       ret = copy_core_reg_indices(&uindices);
+       if (ret < 0)
+               return ret;
 
        ret = kvm_arm_copy_fw_reg_indices(vcpu, uindices);
        if (ret)
-- 
2.1.4

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to