@@ -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)
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@arm.com> --- arch/arm64/kvm/guest.c | 65 ++++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 31 deletions(-)