Hi Dave,

On 19/03/2019 17:52, Dave Martin wrote:
> In preparation for adding logic to filter out some KVM_REG_ARM_CORE
> registers from the KVM_GET_REG_LIST output, this patch factors out
> the core register enumeration into a separate function and rebuilds
> num_core_regs() on top of it.
> 
> This may be a little more expensive (depending on how good a job
> the compiler does of specialising the code), but KVM_GET_REG_LIST
> is not a hot path.
> 
> This will make it easier to consolidate ID filtering code in one
> place.
> 
> No functional change.
> 
> Signed-off-by: Dave Martin <[email protected]>
> 

Reviewed-by: Julien Thierry <[email protected]>

Cheers,

Julien

> ---
> 
> Changes since v5:
> 
>  * New patch.
> 
>    This reimplements part of the separately-posted patch "KVM: arm64:
>    Factor out KVM_GET_REG_LIST core register enumeration", minus aspects
>    that potentially break the ABI.
> 
>    As a result, the opportunity to truly consolidate all the ID reg
>    filtering in one place is deliberately left on the floor, for now.
>    This will be addressed in a separate series later on.
> ---
>  arch/arm64/kvm/guest.c | 33 +++++++++++++++++++++++++--------
>  1 file changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
> index 3e38eb2..a391a61 100644
> --- a/arch/arm64/kvm/guest.c
> +++ b/arch/arm64/kvm/guest.c
> @@ -23,6 +23,7 @@
>  #include <linux/err.h>
>  #include <linux/kvm_host.h>
>  #include <linux/module.h>
> +#include <linux/stddef.h>
>  #include <linux/string.h>
>  #include <linux/vmalloc.h>
>  #include <linux/fs.h>
> @@ -194,9 +195,28 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, 
> struct kvm_regs *regs)
>       return -EINVAL;
>  }
>  
> +static int kvm_arm_copy_core_reg_indices(u64 __user *uindices)
> +{
> +     unsigned int i;
> +     int n = 0;
> +     const u64 core_reg = KVM_REG_ARM64 | KVM_REG_SIZE_U64 | 
> KVM_REG_ARM_CORE;
> +
> +     for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
> +             if (uindices) {
> +                     if (put_user(core_reg | i, uindices))
> +                             return -EFAULT;
> +                     uindices++;
> +             }
> +
> +             n++;
> +     }
> +
> +     return n;
> +}
> +
>  static unsigned long num_core_regs(void)
>  {
> -     return sizeof(struct kvm_regs) / sizeof(__u32);
> +     return kvm_arm_copy_core_reg_indices(NULL);
>  }
>  
>  /**
> @@ -276,15 +296,12 @@ 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;
> -     const u64 core_reg = KVM_REG_ARM64 | KVM_REG_SIZE_U64 | 
> KVM_REG_ARM_CORE;
>       int ret;
>  
> -     for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
> -             if (put_user(core_reg | i, uindices))
> -                     return -EFAULT;
> -             uindices++;
> -     }
> +     ret = kvm_arm_copy_core_reg_indices(uindices);
> +     if (ret)
> +             return ret;
> +     uindices += ret;
>  
>       ret = kvm_arm_copy_fw_reg_indices(vcpu, uindices);
>       if (ret)
> 

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

Reply via email to