target/arm/kvm64: Move the get/put of fpsimd registers out
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 <drjones@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
4ed9d9f894
commit
30e3537fa5
@ -719,13 +719,53 @@ int kvm_arm_cpreg_level(uint64_t regidx)
|
|||||||
#define AARCH64_SIMD_CTRL_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U32 | \
|
#define AARCH64_SIMD_CTRL_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U32 | \
|
||||||
KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(x))
|
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);
|
||||||
|
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)
|
int kvm_arch_put_registers(CPUState *cs, int level)
|
||||||
{
|
{
|
||||||
struct kvm_one_reg reg;
|
struct kvm_one_reg reg;
|
||||||
uint32_t fpr;
|
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
int i;
|
int i, ret;
|
||||||
int ret;
|
|
||||||
unsigned int el;
|
unsigned int el;
|
||||||
|
|
||||||
ARMCPU *cpu = ARM_CPU(cs);
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
@ -815,33 +855,7 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advanced SIMD and FP registers. */
|
ret = kvm_arch_put_fpsimd(cs);
|
||||||
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, ®);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -862,14 +876,54 @@ int kvm_arch_put_registers(CPUState *cs, int level)
|
|||||||
return ret;
|
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);
|
||||||
|
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)
|
int kvm_arch_get_registers(CPUState *cs)
|
||||||
{
|
{
|
||||||
struct kvm_one_reg reg;
|
struct kvm_one_reg reg;
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
uint32_t fpr;
|
|
||||||
unsigned int el;
|
unsigned int el;
|
||||||
int i;
|
int i, ret;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ARMCPU *cpu = ARM_CPU(cs);
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
CPUARMState *env = &cpu->env;
|
CPUARMState *env = &cpu->env;
|
||||||
@ -958,36 +1012,10 @@ int kvm_arch_get_registers(CPUState *cs)
|
|||||||
env->spsr = env->banked_spsr[i];
|
env->spsr = env->banked_spsr[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advanced SIMD and FP registers */
|
ret = kvm_arch_get_fpsimd(cs);
|
||||||
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) {
|
if (ret) {
|
||||||
return 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, ®);
|
|
||||||
if (ret) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
vfp_set_fpcr(env, fpr);
|
|
||||||
|
|
||||||
ret = kvm_get_vcpu_events(cpu);
|
ret = kvm_get_vcpu_events(cpu);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
Loading…
Reference in New Issue
Block a user