* [rfa/ppc64/GNU/Linux] Fix obvious 32x64 probs in ppc-linux-nat.c
@ 2003-11-25 22:51 Andrew Cagney
2003-12-01 17:14 ` Kevin Buettner
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cagney @ 2003-11-25 22:51 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 145 bytes --]
Hello,
This fixes three "obvious" 32x64 problems in ppc-linux-nat.c - it uses
the PTRACE "wordsize" where applicable.
ok for mainline?
Andrew
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 3047 bytes --]
2003-11-25 Andrew Cagney <cagney@redhat.com>
* ppc-linux-nat.c (store_register, fetch_register): Convert
between ptrace and regcache's wordsize.
(ppc_register_u_addr): Use the ptrace wordsize.
Index: ./gdb/ppc-linux-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-linux-nat.c,v
retrieving revision 1.26
diff -u -r1.26 ppc-linux-nat.c
--- ./gdb/ppc-linux-nat.c 2 Oct 2003 20:28:30 -0000 1.26
+++ ./gdb/ppc-linux-nat.c 25 Nov 2003 22:43:04 -0000
@@ -127,7 +127,9 @@
{
int u_addr = -1;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
- int wordsize = tdep->wordsize;
+ /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace
+ interface, and not the wordsize of the program's ABI. */
+ int wordsize = sizeof (PTRACE_XFER_TYPE);
/* General purpose registers occupy 1 slot each in the buffer */
if (regno >= tdep->ppc_gp0_regnum && regno <= tdep->ppc_gplast_regnum )
@@ -235,6 +237,9 @@
return;
}
+ /* Read the raw register using PTRACE_XFER_TYPE sized chunks. On a
+ 32-bit platform, 64-bit floating-point registers will require two
+ transfers. */
for (i = 0; i < DEPRECATED_REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
@@ -248,7 +253,19 @@
perror_with_name (mess);
}
}
- supply_register (regno, buf);
+
+ /* Now supply the register. Be careful to map between ptrace's and
+ the current_regcache's idea of the current wordsize. */
+ if ((regno >= FP0_REGNUM && regno < FP0_REGNUM +32)
+ || gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_LITTLE)
+ /* FPs are always 64 bits. Little endian values are always found
+ at the left-hand end of the register. */
+ regcache_raw_supply (current_regcache, regno, buf);
+ else
+ /* Big endian register, need to fetch the right-hand end. */
+ regcache_raw_supply (current_regcache, regno,
+ (buf + sizeof (PTRACE_XFER_TYPE)
+ - register_size (current_gdbarch, regno)));
}
static void
@@ -380,7 +397,21 @@
if (regaddr == -1)
return;
- regcache_collect (regno, buf);
+ /* First collect the register value from the regcache. Be careful
+ to to convert the regcache's wordsize into ptrace's wordsize. */
+ memset (buf, 0, sizeof buf);
+ if ((regno >= FP0_REGNUM && regno < FP0_REGNUM + 32)
+ || TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
+ /* Floats are always 64-bit. Little endian registers are always
+ at the left-hand end of the register cache. */
+ regcache_raw_collect (current_regcache, regno, buf);
+ else
+ /* Big-endian registers belong at the right-hand end of the
+ buffer. */
+ regcache_raw_collect (current_regcache, regno,
+ (buf + sizeof (PTRACE_XFER_TYPE)
+ - register_size (current_gdbarch, regno)));
+
for (i = 0; i < DEPRECATED_REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-12-03 19:38 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-25 22:51 [rfa/ppc64/GNU/Linux] Fix obvious 32x64 probs in ppc-linux-nat.c Andrew Cagney
2003-12-01 17:14 ` Kevin Buettner
2003-12-03 19:38 ` Andrew Cagney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox