[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 19/28] target-ppc: kvm: fix floating point registers sy
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 19/28] target-ppc: kvm: fix floating point registers sync on little-endian hosts |
Date: |
Mon, 25 Jan 2016 12:15:18 +1100 |
From: Greg Kurz <address@hidden>
On VSX capable CPUs, the 32 FP registers are mapped to the high-bits
of the 32 first VSX registers. So if you have:
VSR31 = (uint128) 0x0102030405060708090a0b0c0d0e0f00
then
FPR31 = (uint64) 0x0102030405060708
The kernel stores the VSX registers in the fp_state struct following the
host endian element ordering.
On big-endian:
fp_state.fpr[31][0] = 0x0102030405060708
fp_state.fpr[31][1] = 0x090a0b0c0d0e0f00
On little-endian:
fp_state.fpr[31][0] = 0x090a0b0c0d0e0f00
fp_state.fpr[31][1] = 0x0102030405060708
The KVM_GET_ONE_REG and KVM_SET_ONE_REG ioctls preserve this ordering, but
QEMU considers it as big-endian and always copies element [0] to the
fpr[] array and element [1] to the vsr[] array. This does not work with
little-endian hosts, and you will get:
(qemu) p $f31
0x90a0b0c0d0e0f00
instead of:
(qemu) p $f31
0x102030405060708
This patch fixes the element ordering for little-endian hosts.
Signed-off-by: Greg Kurz <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/kvm.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 9940a90..4524999 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -650,8 +650,13 @@ static int kvm_put_fp(CPUState *cs)
for (i = 0; i < 32; i++) {
uint64_t vsr[2];
+#ifdef HOST_WORDS_BIGENDIAN
vsr[0] = float64_val(env->fpr[i]);
vsr[1] = env->vsr[i];
+#else
+ vsr[0] = env->vsr[i];
+ vsr[1] = float64_val(env->fpr[i]);
+#endif
reg.addr = (uintptr_t) &vsr;
reg.id = vsx ? KVM_REG_PPC_VSR(i) : KVM_REG_PPC_FPR(i);
@@ -721,10 +726,17 @@ static int kvm_get_fp(CPUState *cs)
vsx ? "VSR" : "FPR", i, strerror(errno));
return ret;
} else {
+#ifdef HOST_WORDS_BIGENDIAN
env->fpr[i] = vsr[0];
if (vsx) {
env->vsr[i] = vsr[1];
}
+#else
+ env->fpr[i] = vsr[1];
+ if (vsx) {
+ env->vsr[i] = vsr[0];
+ }
+#endif
}
}
}
--
2.5.0
- [Qemu-ppc] [PULL 17/28] pseries: Clean up error reporting in ppc_spapr_init(), (continued)
- [Qemu-ppc] [PULL 17/28] pseries: Clean up error reporting in ppc_spapr_init(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 26/28] pseries: Allow TCG h_enter to work with hotplugged memory, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 03/28] macio: use the existing IDEDMA aiocb to hold the active DMA aiocb, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 01/28] target-ppc: Use sensible POWER8/POWER8E versions, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 09/28] spapr: Remove abuse of rtas_ld() in h_client_architecture_support, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 02/28] target-ppc: use cpu_write_xer() helper in cpu_post_load, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 10/28] spapr: Don't create ibm, dynamic-reconfiguration-memory w/o DR LMBs, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 16/28] pseries: Clean up error handling in xics_system_init(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 18/28] pseries: Clean up error reporting in htab migration functions, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 06/28] cuda: add missing fields to VMStateDescription, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 19/28] target-ppc: kvm: fix floating point registers sync on little-endian hosts,
David Gibson <=
- [Qemu-ppc] [PULL 13/28] pseries: Clean up error handling in spapr_validate_node_memory(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 22/28] target-ppc: gdbstub: introduce avr_need_swap(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 12/28] pseries: Clean up error handling of spapr_cpu_init(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 11/28] ppc: Clean up error handling in ppc_set_compat(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 14/28] pseries: Clean up error handling in spapr_vga_init(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 27/28] cuda.c: return error for unknown commands, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 20/28] target-ppc: rename and export maybe_bswap_register(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 08/28] spapr: Remove rtas_st_buffer_direct(), David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 28/28] uninorth.c: add support for UniNorth kMacRISCPCIAddressSelect (0x48) register, David Gibson, 2016/01/24
- [Qemu-ppc] [PULL 07/28] spapr: Small fixes to rtas_ibm_get_system_parameter, remove rtas_st_buffer, David Gibson, 2016/01/24