|
|
7ab123 |
https://sourceware.org/ml/gdb-patches/2014-09/msg00156.html
|
|
|
7ab123 |
Message-Id: <1409947102-32166-1-git-send-email-emachado@linux.vnet.ibm.com>
|
|
|
7ab123 |
|
|
|
7ab123 |
commit 2e4bb98a0e52acbb2da4ae441b89a568af26adf8
|
|
|
7ab123 |
Author: Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
|
|
|
7ab123 |
Date: Mon Sep 8 13:37:23 2014 -0300
|
|
|
7ab123 |
|
|
|
7ab123 |
Fix ppc_collect/supply_ptrace_register() routines
|
|
|
7ab123 |
|
|
|
7ab123 |
This patch fixes the routines to collect and supply ptrace registers on ppc64le
|
|
|
7ab123 |
gdbserver. Originally written for big endian arch, they were causing several
|
|
|
7ab123 |
issues on little endian. With this fix, the number of unexpected failures in
|
|
|
7ab123 |
the testsuite dropped from 263 to 72 on ppc64le.
|
|
|
7ab123 |
|
|
|
7ab123 |
gdb/gdbserver/ChangeLog
|
|
|
7ab123 |
|
|
|
7ab123 |
* linux-ppc-low.c (ppc_collect_ptrace_register): Adjust routine to take
|
|
|
7ab123 |
endianness into account.
|
|
|
7ab123 |
(ppc_supply_ptrace_register): Likewise.
|
|
|
7ab123 |
|
|
|
7ab123 |
Index: gdb-7.6.1/gdb/gdbserver/linux-ppc-low.c
|
|
|
7ab123 |
===================================================================
|
|
|
7ab123 |
--- gdb-7.6.1.orig/gdb/gdbserver/linux-ppc-low.c
|
|
|
7ab123 |
+++ gdb-7.6.1/gdb/gdbserver/linux-ppc-low.c
|
|
|
7ab123 |
@@ -170,25 +170,52 @@ ppc_cannot_fetch_register (int regno)
|
|
|
7ab123 |
static void
|
|
|
7ab123 |
ppc_collect_ptrace_register (struct regcache *regcache, int regno, char *buf)
|
|
|
7ab123 |
{
|
|
|
7ab123 |
- int size = register_size (regno);
|
|
|
7ab123 |
-
|
|
|
7ab123 |
memset (buf, 0, sizeof (long));
|
|
|
7ab123 |
|
|
|
7ab123 |
- if (size < sizeof (long))
|
|
|
7ab123 |
- collect_register (regcache, regno, buf + sizeof (long) - size);
|
|
|
7ab123 |
+ if (__BYTE_ORDER == __LITTLE_ENDIAN)
|
|
|
7ab123 |
+ {
|
|
|
7ab123 |
+ /* Little-endian values always sit at the left end of the buffer. */
|
|
|
7ab123 |
+ collect_register (regcache, regno, buf);
|
|
|
7ab123 |
+ }
|
|
|
7ab123 |
+ else if (__BYTE_ORDER == __BIG_ENDIAN)
|
|
|
7ab123 |
+ {
|
|
|
7ab123 |
+ /* Big-endian values sit at the right end of the buffer. In case of
|
|
|
7ab123 |
+ registers whose sizes are smaller than sizeof (long), we must use a
|
|
|
7ab123 |
+ padding to access them correctly. */
|
|
|
7ab123 |
+ int size = register_size (regno);
|
|
|
7ab123 |
+
|
|
|
7ab123 |
+ if (size < sizeof (long))
|
|
|
7ab123 |
+ collect_register (regcache, regno, buf + sizeof (long) - size);
|
|
|
7ab123 |
+ else
|
|
|
7ab123 |
+ collect_register (regcache, regno, buf);
|
|
|
7ab123 |
+ }
|
|
|
7ab123 |
else
|
|
|
7ab123 |
- collect_register (regcache, regno, buf);
|
|
|
7ab123 |
+ perror_with_name ("Unexpected byte order");
|
|
|
7ab123 |
}
|
|
|
7ab123 |
|
|
|
7ab123 |
static void
|
|
|
7ab123 |
ppc_supply_ptrace_register (struct regcache *regcache,
|
|
|
7ab123 |
int regno, const char *buf)
|
|
|
7ab123 |
{
|
|
|
7ab123 |
- int size = register_size (regno);
|
|
|
7ab123 |
- if (size < sizeof (long))
|
|
|
7ab123 |
- supply_register (regcache, regno, buf + sizeof (long) - size);
|
|
|
7ab123 |
+ if (__BYTE_ORDER == __LITTLE_ENDIAN)
|
|
|
7ab123 |
+ {
|
|
|
7ab123 |
+ /* Little-endian values always sit at the left end of the buffer. */
|
|
|
7ab123 |
+ supply_register (regcache, regno, buf);
|
|
|
7ab123 |
+ }
|
|
|
7ab123 |
+ else if (__BYTE_ORDER == __BIG_ENDIAN)
|
|
|
7ab123 |
+ {
|
|
|
7ab123 |
+ /* Big-endian values sit at the right end of the buffer. In case of
|
|
|
7ab123 |
+ registers whose sizes are smaller than sizeof (long), we must use a
|
|
|
7ab123 |
+ padding to access them correctly. */
|
|
|
7ab123 |
+ int size = register_size (regno);
|
|
|
7ab123 |
+
|
|
|
7ab123 |
+ if (size < sizeof (long))
|
|
|
7ab123 |
+ supply_register (regcache, regno, buf + sizeof (long) - size);
|
|
|
7ab123 |
+ else
|
|
|
7ab123 |
+ supply_register (regcache, regno, buf);
|
|
|
7ab123 |
+ }
|
|
|
7ab123 |
else
|
|
|
7ab123 |
- supply_register (regcache, regno, buf);
|
|
|
7ab123 |
+ perror_with_name ("Unexpected byte order");
|
|
|
7ab123 |
}
|
|
|
7ab123 |
|
|
|
7ab123 |
|