2005-02-08 Andrew Cagney <cagney@gnu.org>
authorAndrew Cagney <cagney@redhat.com>
Tue, 8 Feb 2005 21:00:16 +0000 (21:00 +0000)
committerAndrew Cagney <cagney@redhat.com>
Tue, 8 Feb 2005 21:00:16 +0000 (21:00 +0000)
* ppc-linux-nat.c (ppc_register_u_addr): Hack around 64-bit
PT_FPSCR breakage.

gdb/ChangeLog
gdb/ppc-linux-nat.c

index f709f7af6e564d9ed21e394757b56f45a1a5cc5e..248fcdacf378441a2950b231e8a37eae545daca2 100644 (file)
@@ -1,5 +1,8 @@
 2005-02-08  Andrew Cagney  <cagney@gnu.org>
 
+       * ppc-linux-nat.c (ppc_register_u_addr): Hack around 64-bit
+       PT_FPSCR breakage.
+
        * value.c (struct value): Move to here ...
        * value.h (struct value): ... from here.  Copy comments to
        corresponding function declarations, re-order.
index c98bb93f879f61449d0d8a9775f16a0661975d2d..9df3e3d126fb66054743090fa5da84b5fd1b35ff 100644 (file)
@@ -212,8 +212,19 @@ ppc_register_u_addr (int regno)
     u_addr = PT_MSR * wordsize;
   if (tdep->ppc_fpscr_regnum >= 0
       && regno == tdep->ppc_fpscr_regnum)
-    u_addr = PT_FPSCR * wordsize;
-
+    {
+      /* NOTE: cagney/2005-02-08: On some 64-bit GNU/Linux systems the
+        kernel headers incorrectly contained the 32-bit definition of
+        PT_FPSCR.  For the 32-bit definition, floating-point
+        registers occupy two 32-bit "slots", and the FPSCR lives in
+        the secondhalf of such a slot-pair (hence +1).  For 64-bit,
+        the FPSCR instead occupies the full 64-bit 2-word-slot and
+        hence no adjustment is necessary.  Hack around this.  */
+      if (wordsize == 8 && PT_FPSCR == (48 + 32 + 1))
+       u_addr = (48 + 32) * wordsize;
+      else
+       u_addr = PT_FPSCR * wordsize;
+    }
   return u_addr;
 }