Currently qemu does not get and put the state of the floating point
and
vector registers to KVM. This is obviously a problem for savevm, as
well
as possibly being problematic for debugging of FP-using guests.
This patch fixes this by using new extensions to the ONE_REG
interface to
synchronize the qemu floating point state with KVM.
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/kvm.c | 123
++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 123 insertions(+)
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index e84b993..7ed76be 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -518,6 +518,125 @@ static void kvm_put_one_spr(CPUState *cs,
uint64_t id, int spr)
}
}
+static void kvm_put_fp(CPUState *cs)
+{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+ struct kvm_one_reg reg;
+ int i;
+ int ret;
+
+ if (env->insns_flags & PPC_FLOAT) {
+ uint64_t fpscr = env->fpscr;
+ bool vsx = !!(env->insns_flags2 & PPC2_VSX);
+
+ reg.id = KVM_REG_PPC_FPSCR;
+ reg.addr = (uintptr_t)&fpscr;
+ ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
+ if (ret < 0) {
+ fprintf(stderr, "Warning: Unable to set FPSCR to KVM:
%s\n",
+ strerror(errno));
+ }
+ for (i = 0; i < 32; i++) {
+ uint64_t vsr[2];
+
+ vsr[0] = float64_val(env->fpr[i]);
+ vsr[1] = env->vsr[i];
+ reg.addr = (uintptr_t) &vsr;
+ reg.id = vsx ? KVM_REG_PPC_VSR(i) : KVM_REG_PPC_FPR(i);
+
+ ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, ®);
+ if (ret < 0) {
+ fprintf(stderr, "Warning Unable to set %s%d to KVM:
%s\n",
+ vsx ? "VSR" : "FPR", i, strerror(errno));
+ }
+ }
+ }