diff options
author | Greg Kurz <gkurz@linux.vnet.ibm.com> | 2016-01-15 16:00:12 +0100 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2016-01-30 23:37:37 +1100 |
commit | 3a4b791b4c13e02537a5cc572fa3de70bc5f68da (patch) | |
tree | 49d8aaa7e9e11336797511fd4b1a4545c71ce197 /include/hw/intc | |
parent | 98a5d100c2dfcc2b6daefd8c176eb34055e5b38d (diff) | |
download | qemu-3a4b791b4c13e02537a5cc572fa3de70bc5f68da.zip qemu-3a4b791b4c13e02537a5cc572fa3de70bc5f68da.tar.gz qemu-3a4b791b4c13e02537a5cc572fa3de70bc5f68da.tar.bz2 |
target-ppc: kvm: fix floating point registers sync on little-endian hosts
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>
Diffstat (limited to 'include/hw/intc')
0 files changed, 0 insertions, 0 deletions