[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] [Qemu-devel] [PATCH 04/13] target/arm/kvm: Move the get/p
From: |
Auger Eric |
Subject: |
Re: [Qemu-arm] [Qemu-devel] [PATCH 04/13] target/arm/kvm: Move the get/put of fpsimd registers out |
Date: |
Wed, 5 Jun 2019 09:15:49 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 |
Hi Drew,
On 5/12/19 10:36 AM, Andrew Jones wrote:
> Move the getting/putting of the fpsimd registers out of
> kvm_arch_get/put_registers() into their own helper functions
> to prepare for alternatively getting/putting SVE registers.
>
> No functional change.
>
> Signed-off-by: Andrew Jones <address@hidden>
> ---
> target/arm/kvm64.c | 148 +++++++++++++++++++++++++++------------------
> 1 file changed, 88 insertions(+), 60 deletions(-)
>
> diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
> index ba232b27a6d3..61947f3716e1 100644
> --- a/target/arm/kvm64.c
> +++ b/target/arm/kvm64.c
> @@ -706,13 +706,53 @@ int kvm_arm_cpreg_level(uint64_t regidx)
> #define AARCH64_SIMD_CTRL_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U32 | \
> KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(x))
>
> +static int kvm_arch_put_fpsimd(CPUState *cs)
> +{
> + ARMCPU *cpu = ARM_CPU(cs);
> + CPUARMState *env = &cpu->env;
> + struct kvm_one_reg reg;
> + uint32_t fpr;
> + int i, ret;
> +
> + for (i = 0; i < 32; i++) {
> + uint64_t *q = aa64_vfp_qreg(env, i);
> +#ifdef HOST_WORDS_BIGENDIAN
> + uint64_t fp_val[2] = { q[1], q[0] };
> + reg.addr = (uintptr_t)fp_val;
> +#else
> + reg.addr = (uintptr_t)q;
> +#endif
> + reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
> + ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + }
> + }
> +
> + reg.addr = (uintptr_t)(&fpr);
> + fpr = vfp_get_fpsr(env);
> + reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
> + ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + }
> +
> + reg.addr = (uintptr_t)(&fpr);
I don't think you need this assignment
> + fpr = vfp_get_fpcr(env);
> + reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
> + ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> int kvm_arch_put_registers(CPUState *cs, int level)
> {
> struct kvm_one_reg reg;
> - uint32_t fpr;
> uint64_t val;
> - int i;
> - int ret;
> + int i, ret;
> unsigned int el;
>
> ARMCPU *cpu = ARM_CPU(cs);
> @@ -802,33 +842,7 @@ int kvm_arch_put_registers(CPUState *cs, int level)
> }
> }
>
> - /* Advanced SIMD and FP registers. */
> - for (i = 0; i < 32; i++) {
> - uint64_t *q = aa64_vfp_qreg(env, i);
> -#ifdef HOST_WORDS_BIGENDIAN
> - uint64_t fp_val[2] = { q[1], q[0] };
> - reg.addr = (uintptr_t)fp_val;
> -#else
> - reg.addr = (uintptr_t)q;
> -#endif
> - reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
> - ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> - if (ret) {
> - return ret;
> - }
> - }
> -
> - reg.addr = (uintptr_t)(&fpr);
> - fpr = vfp_get_fpsr(env);
> - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
> - ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> - if (ret) {
> - return ret;
> - }
> -
> - fpr = vfp_get_fpcr(env);
> - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
> - ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
> + ret = kvm_arch_put_fpsimd(cs);
> if (ret) {
> return ret;
> }
> @@ -849,14 +863,54 @@ int kvm_arch_put_registers(CPUState *cs, int level)
> return ret;
> }
>
> +static int kvm_arch_get_fpsimd(CPUState *cs)
> +{
> + ARMCPU *cpu = ARM_CPU(cs);
> + CPUARMState *env = &cpu->env;
> + struct kvm_one_reg reg;
> + uint32_t fpr;
> + int i, ret;
> +
> + for (i = 0; i < 32; i++) {
> + uint64_t *q = aa64_vfp_qreg(env, i);
> + reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
> + reg.addr = (uintptr_t)q;
> + ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + } else {
> +#ifdef HOST_WORDS_BIGENDIAN
> + uint64_t t;
> + t = q[0], q[0] = q[1], q[1] = t;
> +#endif
> + }
> + }
> +
> + reg.addr = (uintptr_t)(&fpr);
> + reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
> + ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + }
> + vfp_set_fpsr(env, fpr);
> +
> + reg.addr = (uintptr_t)(&fpr);
same here
> + reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
> + ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> + if (ret) {
> + return ret;
> + }
> + vfp_set_fpcr(env, fpr);
> +
> + return 0;
> +}
> +
> int kvm_arch_get_registers(CPUState *cs)
> {
> struct kvm_one_reg reg;
> uint64_t val;
> - uint32_t fpr;
> unsigned int el;
> - int i;
> - int ret;
> + int i, ret;
>
> ARMCPU *cpu = ARM_CPU(cs);
> CPUARMState *env = &cpu->env;
> @@ -945,36 +999,10 @@ int kvm_arch_get_registers(CPUState *cs)
> env->spsr = env->banked_spsr[i];
> }
>
> - /* Advanced SIMD and FP registers */
> - for (i = 0; i < 32; i++) {
> - uint64_t *q = aa64_vfp_qreg(env, i);
> - reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
> - reg.addr = (uintptr_t)q;
> - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> - if (ret) {
> - return ret;
> - } else {
> -#ifdef HOST_WORDS_BIGENDIAN
> - uint64_t t;
> - t = q[0], q[0] = q[1], q[1] = t;
> -#endif
> - }
> - }
> -
> - reg.addr = (uintptr_t)(&fpr);
> - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
> - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> - if (ret) {
> - return ret;
> - }
> - vfp_set_fpsr(env, fpr);
> -
> - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
> - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®);
> + ret = kvm_arch_get_fpsimd(cs);
> if (ret) {
> return ret;
> }
> - vfp_set_fpcr(env, fpr);
>
> ret = kvm_get_vcpu_events(cpu);
> if (ret) {
>
Besides
Reviewed-by: Eric Auger <address@hidden>
Thanks
Eric
- Re: [Qemu-arm] [Qemu-devel] [PATCH 04/13] target/arm/kvm: Move the get/put of fpsimd registers out,
Auger Eric <=