aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2005-02-08 21:00:16 +0000
committerAndrew Cagney <cagney@redhat.com>2005-02-08 21:00:16 +0000
commit8f13581218ad9c20daa1d45618a04c2df4c48b03 (patch)
tree63f3e1ed0a1ccc54aa8e84696b917f7bc3a15f64
parent1c7c5e5b0903c114e94c1c3d69d5349ba64e33b1 (diff)
downloadfsf-binutils-gdb-8f13581218ad9c20daa1d45618a04c2df4c48b03.zip
fsf-binutils-gdb-8f13581218ad9c20daa1d45618a04c2df4c48b03.tar.gz
fsf-binutils-gdb-8f13581218ad9c20daa1d45618a04c2df4c48b03.tar.bz2
2005-02-08 Andrew Cagney <cagney@gnu.org>
* ppc-linux-nat.c (ppc_register_u_addr): Hack around 64-bit PT_FPSCR breakage.
-rw-r--r--gdb/ChangeLog3
-rw-r--r--gdb/ppc-linux-nat.c15
2 files changed, 16 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f709f7a..248fcda 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index c98bb93..9df3e3d 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -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;
}