db34050364
CVE-2016-1981: infinite loop in e1000 (bz #1299995) Fix Out-of-bounds read in usb-ehci (bz #1300234, bz #1299455) CVE-2016-2197: ahci: null pointer dereference (bz #1302952) Fix gdbstub for VSX registers for ppc64 (bz #1304377) Fix qemu-img vmdk images to work with VMware (bz #1299185)
77 lines
2.6 KiB
Diff
77 lines
2.6 KiB
Diff
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
|
|
Date: Fri, 15 Jan 2016 16:00:38 +0100
|
|
Subject: [PATCH] target-ppc: gdbstub: fix altivec registers for little-endian
|
|
guests
|
|
|
|
Altivec registers are 128-bit wide. They are stored in memory as two
|
|
64-bit values that must be byteswapped when the guest is little-endian.
|
|
Let's reuse the ppc_maybe_bswap_register() helper for this.
|
|
|
|
We also need to fix the ordering of the 64-bit elements according to
|
|
the target endianness, for both system and user mode.
|
|
|
|
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
|
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
(cherry picked from commit ea499e71506c91aa259a7fdccf1d6b2022f5b530)
|
|
---
|
|
target-ppc/translate_init.c | 12 ++++++++++--
|
|
1 file changed, 10 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
|
|
index c1d2db6..a72e4b6 100644
|
|
--- a/target-ppc/translate_init.c
|
|
+++ b/target-ppc/translate_init.c
|
|
@@ -8757,9 +8757,9 @@ static void dump_ppc_insns (CPUPPCState *env)
|
|
static bool avr_need_swap(CPUPPCState *env)
|
|
{
|
|
#ifdef HOST_WORDS_BIGENDIAN
|
|
- return false;
|
|
+ return msr_le;
|
|
#else
|
|
- return true;
|
|
+ return !msr_le;
|
|
#endif
|
|
}
|
|
|
|
@@ -8803,14 +8803,18 @@ static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
|
stq_p(mem_buf, env->avr[n].u64[1]);
|
|
stq_p(mem_buf+8, env->avr[n].u64[0]);
|
|
}
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 8);
|
|
+ ppc_maybe_bswap_register(env, mem_buf + 8, 8);
|
|
return 16;
|
|
}
|
|
if (n == 32) {
|
|
stl_p(mem_buf, env->vscr);
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 4);
|
|
return 4;
|
|
}
|
|
if (n == 33) {
|
|
stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 4);
|
|
return 4;
|
|
}
|
|
return 0;
|
|
@@ -8819,6 +8823,8 @@ static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
|
static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
|
{
|
|
if (n < 32) {
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 8);
|
|
+ ppc_maybe_bswap_register(env, mem_buf + 8, 8);
|
|
if (!avr_need_swap(env)) {
|
|
env->avr[n].u64[0] = ldq_p(mem_buf);
|
|
env->avr[n].u64[1] = ldq_p(mem_buf+8);
|
|
@@ -8829,10 +8835,12 @@ static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
|
|
return 16;
|
|
}
|
|
if (n == 32) {
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 4);
|
|
env->vscr = ldl_p(mem_buf);
|
|
return 4;
|
|
}
|
|
if (n == 33) {
|
|
+ ppc_maybe_bswap_register(env, mem_buf, 4);
|
|
env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
|
|
return 4;
|
|
}
|