Message ID | 20230718111404.23479-3-cohuck@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm/kvm: use kvm_{get,set}_one_reg | expand |
Hi Connie, On 7/18/23 21:14, Cornelia Huck wrote: > We can neaten the code by switching the callers that work on a > CPUstate to the kvm_get_one_reg function. > > Signed-off-by: Cornelia Huck <cohuck@redhat.com> > --- > target/arm/kvm.c | 15 +++--------- > target/arm/kvm64.c | 57 ++++++++++++---------------------------------- > 2 files changed, 18 insertions(+), 54 deletions(-) > The replacements look good to me. However, I guess it's worty to apply the same replacements for target/arm/kvm64.c since we're here? [gshan@gshan arm]$ pwd /home/gshan/sandbox/q/target/arm [gshan@gshan arm]$ git grep KVM_GET_ONE_REG kvm64.c: err = ioctl(fd, KVM_GET_ONE_REG, &idreg); kvm64.c: return ioctl(fd, KVM_GET_ONE_REG, &idreg); kvm64.c: ret = ioctl(fdarray[2], KVM_GET_ONE_REG, ®); Thanks, Gavin > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index cdbffc3c6e0d..4123f6dc9d72 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -525,24 +525,19 @@ bool write_kvmstate_to_list(ARMCPU *cpu) > bool ok = true; > > for (i = 0; i < cpu->cpreg_array_len; i++) { > - struct kvm_one_reg r; > uint64_t regidx = cpu->cpreg_indexes[i]; > uint32_t v32; > int ret; > > - r.id = regidx; > - > switch (regidx & KVM_REG_SIZE_MASK) { > case KVM_REG_SIZE_U32: > - r.addr = (uintptr_t)&v32; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r); > + ret = kvm_get_one_reg(cs, regidx, &v32); > if (!ret) { > cpu->cpreg_values[i] = v32; > } > break; > case KVM_REG_SIZE_U64: > - r.addr = (uintptr_t)(cpu->cpreg_values + i); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r); > + ret = kvm_get_one_reg(cs, regidx, cpu->cpreg_values + i); > break; > default: > g_assert_not_reached(); > @@ -678,17 +673,13 @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu) > void kvm_arm_get_virtual_time(CPUState *cs) > { > ARMCPU *cpu = ARM_CPU(cs); > - struct kvm_one_reg reg = { > - .id = KVM_REG_ARM_TIMER_CNT, > - .addr = (uintptr_t)&cpu->kvm_vtime, > - }; > int ret; > > if (cpu->kvm_vtime_dirty) { > return; > } > > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime); > if (ret) { > error_report("Failed to get KVM_REG_ARM_TIMER_CNT"); > abort(); > diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c > index b4d02dff5381..66b52d6f8d23 100644 > --- a/target/arm/kvm64.c > +++ b/target/arm/kvm64.c > @@ -908,14 +908,11 @@ int kvm_arch_put_registers(CPUState *cs, int level) > static int kvm_arch_get_fpsimd(CPUState *cs) > { > CPUARMState *env = &ARM_CPU(cs)->env; > - struct kvm_one_reg reg; > 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, ®); > + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q); > if (ret) { > return ret; > } else { > @@ -939,15 +936,12 @@ static int kvm_arch_get_sve(CPUState *cs) > { > ARMCPU *cpu = ARM_CPU(cs); > CPUARMState *env = &cpu->env; > - struct kvm_one_reg reg; > uint64_t *r; > int n, ret; > > for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) { > r = &env->vfp.zregs[n].d[0]; > - reg.addr = (uintptr_t)r; > - reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r); > if (ret) { > return ret; > } > @@ -956,9 +950,7 @@ static int kvm_arch_get_sve(CPUState *cs) > > for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) { > r = &env->vfp.pregs[n].p[0]; > - reg.addr = (uintptr_t)r; > - reg.id = KVM_REG_ARM64_SVE_PREG(n, 0); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r); > if (ret) { > return ret; > } > @@ -966,9 +958,7 @@ static int kvm_arch_get_sve(CPUState *cs) > } > > r = &env->vfp.pregs[FFR_PRED_NUM].p[0]; > - reg.addr = (uintptr_t)r; > - reg.id = KVM_REG_ARM64_SVE_FFR(0); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r); > if (ret) { > return ret; > } > @@ -979,7 +969,6 @@ static int kvm_arch_get_sve(CPUState *cs) > > int kvm_arch_get_registers(CPUState *cs) > { > - struct kvm_one_reg reg; > uint64_t val; > unsigned int el; > uint32_t fpr; > @@ -989,31 +978,24 @@ int kvm_arch_get_registers(CPUState *cs) > CPUARMState *env = &cpu->env; > > for (i = 0; i < 31; i++) { > - reg.id = AARCH64_CORE_REG(regs.regs[i]); > - reg.addr = (uintptr_t) &env->xregs[i]; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]), > + &env->xregs[i]); > if (ret) { > return ret; > } > } > > - reg.id = AARCH64_CORE_REG(regs.sp); > - reg.addr = (uintptr_t) &env->sp_el[0]; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]); > if (ret) { > return ret; > } > > - reg.id = AARCH64_CORE_REG(sp_el1); > - reg.addr = (uintptr_t) &env->sp_el[1]; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]); > if (ret) { > return ret; > } > > - reg.id = AARCH64_CORE_REG(regs.pstate); > - reg.addr = (uintptr_t) &val; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val); > if (ret) { > return ret; > } > @@ -1030,9 +1012,7 @@ int kvm_arch_get_registers(CPUState *cs) > */ > aarch64_restore_sp(env, 1); > > - reg.id = AARCH64_CORE_REG(regs.pc); > - reg.addr = (uintptr_t) &env->pc; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc); > if (ret) { > return ret; > } > @@ -1046,9 +1026,7 @@ int kvm_arch_get_registers(CPUState *cs) > aarch64_sync_64_to_32(env); > } > > - reg.id = AARCH64_CORE_REG(elr_el1); > - reg.addr = (uintptr_t) &env->elr_el[1]; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]); > if (ret) { > return ret; > } > @@ -1058,9 +1036,8 @@ int kvm_arch_get_registers(CPUState *cs) > * KVM SPSRs 0-4 map to QEMU banks 1-5 > */ > for (i = 0; i < KVM_NR_SPSR; i++) { > - reg.id = AARCH64_CORE_REG(spsr[i]); > - reg.addr = (uintptr_t) &env->banked_spsr[i + 1]; > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(spsr[i]), > + &env->banked_spsr[i + 1]); > if (ret) { > return ret; > } > @@ -1081,17 +1058,13 @@ int kvm_arch_get_registers(CPUState *cs) > return ret; > } > > - reg.addr = (uintptr_t)(&fpr); > - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr); > if (ret) { > return ret; > } > vfp_set_fpsr(env, fpr); > > - reg.addr = (uintptr_t)(&fpr); > - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr); > - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); > + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr); > if (ret) { > return ret; > }
On Mon, Jul 24 2023, Gavin Shan <gshan@redhat.com> wrote: > Hi Connie, > > On 7/18/23 21:14, Cornelia Huck wrote: >> We can neaten the code by switching the callers that work on a >> CPUstate to the kvm_get_one_reg function. >> >> Signed-off-by: Cornelia Huck <cohuck@redhat.com> >> --- >> target/arm/kvm.c | 15 +++--------- >> target/arm/kvm64.c | 57 ++++++++++++---------------------------------- >> 2 files changed, 18 insertions(+), 54 deletions(-) >> > > The replacements look good to me. However, I guess it's worty to apply > the same replacements for target/arm/kvm64.c since we're here? > > [gshan@gshan arm]$ pwd > /home/gshan/sandbox/q/target/arm > [gshan@gshan arm]$ git grep KVM_GET_ONE_REG > kvm64.c: err = ioctl(fd, KVM_GET_ONE_REG, &idreg); > kvm64.c: return ioctl(fd, KVM_GET_ONE_REG, &idreg); > kvm64.c: ret = ioctl(fdarray[2], KVM_GET_ONE_REG, ®); These are the callers that don't work on a CPUState (all in initial feature discovery IIRC), so they need to stay that way.
On 7/24/23 18:48, Cornelia Huck wrote: > On Mon, Jul 24 2023, Gavin Shan <gshan@redhat.com> wrote: >> >> On 7/18/23 21:14, Cornelia Huck wrote: >>> We can neaten the code by switching the callers that work on a >>> CPUstate to the kvm_get_one_reg function. >>> >>> Signed-off-by: Cornelia Huck <cohuck@redhat.com> >>> --- >>> target/arm/kvm.c | 15 +++--------- >>> target/arm/kvm64.c | 57 ++++++++++++---------------------------------- >>> 2 files changed, 18 insertions(+), 54 deletions(-) >>> >> >> The replacements look good to me. However, I guess it's worty to apply >> the same replacements for target/arm/kvm64.c since we're here? >> >> [gshan@gshan arm]$ pwd >> /home/gshan/sandbox/q/target/arm >> [gshan@gshan arm]$ git grep KVM_GET_ONE_REG >> kvm64.c: err = ioctl(fd, KVM_GET_ONE_REG, &idreg); >> kvm64.c: return ioctl(fd, KVM_GET_ONE_REG, &idreg); >> kvm64.c: ret = ioctl(fdarray[2], KVM_GET_ONE_REG, ®); > > These are the callers that don't work on a CPUState (all in initial > feature discovery IIRC), so they need to stay that way. > Right, All these ioctl commands are issued when CPUState isn't around. However, there are two wrappers read_sys_{reg32, reg64}(). The ioctl call in kvm_arm_sve_get_vls() can be replaced by read_sys_reg64(). I guess it'd better to do this in a separate patch if you agree. Thanks, Gavin
On Tue, Jul 25 2023, Gavin Shan <gshan@redhat.com> wrote: > On 7/24/23 18:48, Cornelia Huck wrote: >> On Mon, Jul 24 2023, Gavin Shan <gshan@redhat.com> wrote: >>> >>> On 7/18/23 21:14, Cornelia Huck wrote: >>>> We can neaten the code by switching the callers that work on a >>>> CPUstate to the kvm_get_one_reg function. >>>> >>>> Signed-off-by: Cornelia Huck <cohuck@redhat.com> >>>> --- >>>> target/arm/kvm.c | 15 +++--------- >>>> target/arm/kvm64.c | 57 ++++++++++++---------------------------------- >>>> 2 files changed, 18 insertions(+), 54 deletions(-) >>>> >>> >>> The replacements look good to me. However, I guess it's worty to apply >>> the same replacements for target/arm/kvm64.c since we're here? >>> >>> [gshan@gshan arm]$ pwd >>> /home/gshan/sandbox/q/target/arm >>> [gshan@gshan arm]$ git grep KVM_GET_ONE_REG >>> kvm64.c: err = ioctl(fd, KVM_GET_ONE_REG, &idreg); >>> kvm64.c: return ioctl(fd, KVM_GET_ONE_REG, &idreg); >>> kvm64.c: ret = ioctl(fdarray[2], KVM_GET_ONE_REG, ®); >> >> These are the callers that don't work on a CPUState (all in initial >> feature discovery IIRC), so they need to stay that way. >> > > Right, All these ioctl commands are issued when CPUState isn't around. However, there > are two wrappers read_sys_{reg32, reg64}(). The ioctl call in kvm_arm_sve_get_vls() > can be replaced by read_sys_reg64(). I guess it'd better to do this in a separate > patch if you agree. Yes, we could do that, but I'm not sure how much it adds to the code... in any case, I agree that this would be a separate patch.
On 7/18/23 21:14, Cornelia Huck wrote: > We can neaten the code by switching the callers that work on a > CPUstate to the kvm_get_one_reg function. > > Signed-off-by: Cornelia Huck <cohuck@redhat.com> > --- > target/arm/kvm.c | 15 +++--------- > target/arm/kvm64.c | 57 ++++++++++++---------------------------------- > 2 files changed, 18 insertions(+), 54 deletions(-) > Reviewed-by: Gavin Shan <gshan@redhat.com> Thanks, Gavin
[spooky season is coming up, so time for some thread necromancy!] On Thu, Jul 27 2023, Cornelia Huck <cohuck@redhat.com> wrote: > On Tue, Jul 25 2023, Gavin Shan <gshan@redhat.com> wrote: > >> On 7/24/23 18:48, Cornelia Huck wrote: >>> On Mon, Jul 24 2023, Gavin Shan <gshan@redhat.com> wrote: >>>> >>>> On 7/18/23 21:14, Cornelia Huck wrote: >>>>> We can neaten the code by switching the callers that work on a >>>>> CPUstate to the kvm_get_one_reg function. >>>>> >>>>> Signed-off-by: Cornelia Huck <cohuck@redhat.com> >>>>> --- >>>>> target/arm/kvm.c | 15 +++--------- >>>>> target/arm/kvm64.c | 57 ++++++++++++---------------------------------- >>>>> 2 files changed, 18 insertions(+), 54 deletions(-) >>>>> >>>> >>>> The replacements look good to me. However, I guess it's worty to apply >>>> the same replacements for target/arm/kvm64.c since we're here? >>>> >>>> [gshan@gshan arm]$ pwd >>>> /home/gshan/sandbox/q/target/arm >>>> [gshan@gshan arm]$ git grep KVM_GET_ONE_REG >>>> kvm64.c: err = ioctl(fd, KVM_GET_ONE_REG, &idreg); >>>> kvm64.c: return ioctl(fd, KVM_GET_ONE_REG, &idreg); >>>> kvm64.c: ret = ioctl(fdarray[2], KVM_GET_ONE_REG, ®); >>> >>> These are the callers that don't work on a CPUState (all in initial >>> feature discovery IIRC), so they need to stay that way. >>> >> >> Right, All these ioctl commands are issued when CPUState isn't around. However, there >> are two wrappers read_sys_{reg32, reg64}(). The ioctl call in kvm_arm_sve_get_vls() >> can be replaced by read_sys_reg64(). I guess it'd better to do this in a separate >> patch if you agree. > > Yes, we could do that, but I'm not sure how much it adds to the > code... in any case, I agree that this would be a separate patch. This series has managed to bubble up to the top of my todo list again, and I think I'll just go ahead and include that as a separate change on top.
diff --git a/target/arm/kvm.c b/target/arm/kvm.c index cdbffc3c6e0d..4123f6dc9d72 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -525,24 +525,19 @@ bool write_kvmstate_to_list(ARMCPU *cpu) bool ok = true; for (i = 0; i < cpu->cpreg_array_len; i++) { - struct kvm_one_reg r; uint64_t regidx = cpu->cpreg_indexes[i]; uint32_t v32; int ret; - r.id = regidx; - switch (regidx & KVM_REG_SIZE_MASK) { case KVM_REG_SIZE_U32: - r.addr = (uintptr_t)&v32; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r); + ret = kvm_get_one_reg(cs, regidx, &v32); if (!ret) { cpu->cpreg_values[i] = v32; } break; case KVM_REG_SIZE_U64: - r.addr = (uintptr_t)(cpu->cpreg_values + i); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r); + ret = kvm_get_one_reg(cs, regidx, cpu->cpreg_values + i); break; default: g_assert_not_reached(); @@ -678,17 +673,13 @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu) void kvm_arm_get_virtual_time(CPUState *cs) { ARMCPU *cpu = ARM_CPU(cs); - struct kvm_one_reg reg = { - .id = KVM_REG_ARM_TIMER_CNT, - .addr = (uintptr_t)&cpu->kvm_vtime, - }; int ret; if (cpu->kvm_vtime_dirty) { return; } - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime); if (ret) { error_report("Failed to get KVM_REG_ARM_TIMER_CNT"); abort(); diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index b4d02dff5381..66b52d6f8d23 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -908,14 +908,11 @@ int kvm_arch_put_registers(CPUState *cs, int level) static int kvm_arch_get_fpsimd(CPUState *cs) { CPUARMState *env = &ARM_CPU(cs)->env; - struct kvm_one_reg reg; 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, ®); + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q); if (ret) { return ret; } else { @@ -939,15 +936,12 @@ static int kvm_arch_get_sve(CPUState *cs) { ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; - struct kvm_one_reg reg; uint64_t *r; int n, ret; for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) { r = &env->vfp.zregs[n].d[0]; - reg.addr = (uintptr_t)r; - reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r); if (ret) { return ret; } @@ -956,9 +950,7 @@ static int kvm_arch_get_sve(CPUState *cs) for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) { r = &env->vfp.pregs[n].p[0]; - reg.addr = (uintptr_t)r; - reg.id = KVM_REG_ARM64_SVE_PREG(n, 0); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r); if (ret) { return ret; } @@ -966,9 +958,7 @@ static int kvm_arch_get_sve(CPUState *cs) } r = &env->vfp.pregs[FFR_PRED_NUM].p[0]; - reg.addr = (uintptr_t)r; - reg.id = KVM_REG_ARM64_SVE_FFR(0); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r); if (ret) { return ret; } @@ -979,7 +969,6 @@ static int kvm_arch_get_sve(CPUState *cs) int kvm_arch_get_registers(CPUState *cs) { - struct kvm_one_reg reg; uint64_t val; unsigned int el; uint32_t fpr; @@ -989,31 +978,24 @@ int kvm_arch_get_registers(CPUState *cs) CPUARMState *env = &cpu->env; for (i = 0; i < 31; i++) { - reg.id = AARCH64_CORE_REG(regs.regs[i]); - reg.addr = (uintptr_t) &env->xregs[i]; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]), + &env->xregs[i]); if (ret) { return ret; } } - reg.id = AARCH64_CORE_REG(regs.sp); - reg.addr = (uintptr_t) &env->sp_el[0]; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]); if (ret) { return ret; } - reg.id = AARCH64_CORE_REG(sp_el1); - reg.addr = (uintptr_t) &env->sp_el[1]; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]); if (ret) { return ret; } - reg.id = AARCH64_CORE_REG(regs.pstate); - reg.addr = (uintptr_t) &val; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val); if (ret) { return ret; } @@ -1030,9 +1012,7 @@ int kvm_arch_get_registers(CPUState *cs) */ aarch64_restore_sp(env, 1); - reg.id = AARCH64_CORE_REG(regs.pc); - reg.addr = (uintptr_t) &env->pc; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc); if (ret) { return ret; } @@ -1046,9 +1026,7 @@ int kvm_arch_get_registers(CPUState *cs) aarch64_sync_64_to_32(env); } - reg.id = AARCH64_CORE_REG(elr_el1); - reg.addr = (uintptr_t) &env->elr_el[1]; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]); if (ret) { return ret; } @@ -1058,9 +1036,8 @@ int kvm_arch_get_registers(CPUState *cs) * KVM SPSRs 0-4 map to QEMU banks 1-5 */ for (i = 0; i < KVM_NR_SPSR; i++) { - reg.id = AARCH64_CORE_REG(spsr[i]); - reg.addr = (uintptr_t) &env->banked_spsr[i + 1]; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(spsr[i]), + &env->banked_spsr[i + 1]); if (ret) { return ret; } @@ -1081,17 +1058,13 @@ int kvm_arch_get_registers(CPUState *cs) return ret; } - reg.addr = (uintptr_t)(&fpr); - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr); if (ret) { return ret; } vfp_set_fpsr(env, fpr); - reg.addr = (uintptr_t)(&fpr); - reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr); - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, ®); + ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr); if (ret) { return ret; }
We can neaten the code by switching the callers that work on a CPUstate to the kvm_get_one_reg function. Signed-off-by: Cornelia Huck <cohuck@redhat.com> --- target/arm/kvm.c | 15 +++--------- target/arm/kvm64.c | 57 ++++++++++++---------------------------------- 2 files changed, 18 insertions(+), 54 deletions(-)