File gdb-7.7-bnc895831.patch of Package gdb
2014-09-08 Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
gdb/gdbserver/
* linux-ppc-low.c (ppc_collect_ptrace_register): Adjust routine to take
endianness into account.
(ppc_supply_ptrace_register): Likewise.
diff -uprN gdb-7.7.orig/gdb/gdbserver/linux-ppc-low.c gdb-7.7/gdb/gdbserver/linux-ppc-low.c
--- gdb-7.7.orig/gdb/gdbserver/linux-ppc-low.c 2014-01-08 03:23:36.000000000 -0600
+++ gdb-7.7/gdb/gdbserver/linux-ppc-low.c 2014-09-09 08:52:18.210004056 -0500
@@ -202,25 +202,52 @@ ppc_cannot_fetch_register (int regno)
static void
ppc_collect_ptrace_register (struct regcache *regcache, int regno, char *buf)
{
- int size = register_size (regcache->tdesc, regno);
-
memset (buf, 0, sizeof (long));
- if (size < sizeof (long))
- collect_register (regcache, regno, buf + sizeof (long) - size);
+ if (__BYTE_ORDER == __LITTLE_ENDIAN)
+ {
+ /* Little-endian values always sit at the left end of the buffer. */
+ collect_register (regcache, regno, buf);
+ }
+ else if (__BYTE_ORDER == __BIG_ENDIAN)
+ {
+ /* Big-endian values sit at the right end of the buffer. In case of
+ registers whose sizes are smaller than sizeof (long), we must use a
+ padding to access them correctly. */
+ int size = register_size (regcache->tdesc, regno);
+
+ if (size < sizeof (long))
+ collect_register (regcache, regno, buf + sizeof (long) - size);
+ else
+ collect_register (regcache, regno, buf);
+ }
else
- collect_register (regcache, regno, buf);
+ perror_with_name ("Unexpected byte order");
}
static void
ppc_supply_ptrace_register (struct regcache *regcache,
int regno, const char *buf)
{
- int size = register_size (regcache->tdesc, regno);
- if (size < sizeof (long))
- supply_register (regcache, regno, buf + sizeof (long) - size);
+ if (__BYTE_ORDER == __LITTLE_ENDIAN)
+ {
+ /* Little-endian values always sit at the left end of the buffer. */
+ supply_register (regcache, regno, buf);
+ }
+ else if (__BYTE_ORDER == __BIG_ENDIAN)
+ {
+ /* Big-endian values sit at the right end of the buffer. In case of
+ registers whose sizes are smaller than sizeof (long), we must use a
+ padding to access them correctly. */
+ int size = register_size (regcache->tdesc, regno);
+
+ if (size < sizeof (long))
+ supply_register (regcache, regno, buf + sizeof (long) - size);
+ else
+ supply_register (regcache, regno, buf);
+ }
else
- supply_register (regcache, regno, buf);
+ perror_with_name ("Unexpected byte order");
}