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 <Dave.Martin@xxxxxxx> --- 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 kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm