From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: lvivier@redhat.com, thuth@redhat.com,
mark.cave-ayland@ilande.co.uk, agraf@suse.de,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
bharata@linux.vnet.ibm.com,
David Gibson <david@gibson.dropbear.id.au>,
gkurz@linux.vnet.ibm.com
Subject: [Qemu-devel] [PULL 19/28] target-ppc: kvm: fix floating point registers sync on little-endian hosts
Date: Mon, 25 Jan 2016 12:15:18 +1100 [thread overview]
Message-ID: <1453684527-23564-20-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1453684527-23564-1-git-send-email-david@gibson.dropbear.id.au>
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
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 <gkurz@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
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
next prev parent reply other threads:[~2016-01-25 1:14 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-25 1:14 [Qemu-devel] [PULL 00/28] ppc-for-2.6 queue 20160125 David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 01/28] target-ppc: Use sensible POWER8/POWER8E versions David Gibson
2016-01-25 19:14 ` Alexander Graf
2016-01-25 19:26 ` Thomas Huth
2016-01-25 20:20 ` Alexander Graf
2016-01-29 6:15 ` [Qemu-devel] [Qemu-ppc] " Stewart Smith
2016-01-25 1:15 ` [Qemu-devel] [PULL 02/28] target-ppc: use cpu_write_xer() helper in cpu_post_load David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 03/28] macio: use the existing IDEDMA aiocb to hold the active DMA aiocb David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 04/28] macio: add dma_active to VMStateDescription David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 05/28] mac_dbdma: add DBDMA controller state " David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 06/28] cuda: add missing fields " David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 07/28] spapr: Small fixes to rtas_ibm_get_system_parameter, remove rtas_st_buffer David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 08/28] spapr: Remove rtas_st_buffer_direct() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 09/28] spapr: Remove abuse of rtas_ld() in h_client_architecture_support David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 10/28] spapr: Don't create ibm, dynamic-reconfiguration-memory w/o DR LMBs David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 11/28] ppc: Clean up error handling in ppc_set_compat() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 12/28] pseries: Clean up error handling of spapr_cpu_init() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 13/28] pseries: Clean up error handling in spapr_validate_node_memory() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 14/28] pseries: Clean up error handling in spapr_vga_init() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 15/28] pseries: Clean up error handling in spapr_rtas_register() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 16/28] pseries: Clean up error handling in xics_system_init() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 17/28] pseries: Clean up error reporting in ppc_spapr_init() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 18/28] pseries: Clean up error reporting in htab migration functions David Gibson
2016-01-25 1:15 ` David Gibson [this message]
2016-01-25 1:15 ` [Qemu-devel] [PULL 20/28] target-ppc: rename and export maybe_bswap_register() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 21/28] target-ppc: gdbstub: fix float registers for little-endian guests David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 22/28] target-ppc: gdbstub: introduce avr_need_swap() David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 23/28] target-ppc: gdbstub: fix altivec registers for little-endian guests David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 24/28] target-ppc: gdbstub: fix spe " David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 25/28] target-ppc: gdbstub: Add VSX support David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 26/28] pseries: Allow TCG h_enter to work with hotplugged memory David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 27/28] cuda.c: return error for unknown commands David Gibson
2016-01-25 1:15 ` [Qemu-devel] [PULL 28/28] uninorth.c: add support for UniNorth kMacRISCPCIAddressSelect (0x48) register David Gibson
2016-01-25 10:42 ` [Qemu-devel] [PULL 00/28] ppc-for-2.6 queue 20160125 Peter Maydell
2016-01-25 11:19 ` David Gibson
2016-01-25 11:59 ` Peter Maydell
2016-01-25 14:00 ` David Gibson
2016-01-25 14:38 ` Peter Maydell
2016-01-26 5:37 ` David Gibson
2016-01-26 7:08 ` Alexander Graf
2016-01-26 10:56 ` Gerd Hoffmann
2016-01-27 3:01 ` David Gibson
2016-01-27 13:36 ` Gerd Hoffmann
2016-01-27 13:49 ` Laurent Vivier
2016-01-26 9:13 ` Peter Maydell
2016-01-29 3:31 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1453684527-23564-20-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=bharata@linux.vnet.ibm.com \
--cc=gkurz@linux.vnet.ibm.com \
--cc=lvivier@redhat.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).