qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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

  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).