Blame SOURCES/gdb-rhbz1125820-ppc64le-enablement-36of37.patch

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