aboutsummaryrefslogtreecommitdiff
path: root/gdb/procfs.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2014-02-19 20:29:31 +0000
committerJoel Brobecker <brobecker@adacore.com>2014-02-24 12:49:33 -0500
commite96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8 (patch)
tree270ed3ebd5f325a66bdf0c85b7725c1045bec67a /gdb/procfs.c
parent0837c976950e347cc48a1c55c6c8d60fc710c168 (diff)
downloadgdb-e96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8.zip
gdb-e96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8.tar.gz
gdb-e96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8.tar.bz2
procfs.c: Don't install a deprecated_xfer_memory method
This removes yet another instance of a deprecated_xfer_memory user, and fixes a nasty regression as a side-effect: (gdb) start Temporary breakpoint 1 at 0x19070: file simple_main.adb, line 4. Starting program: /[...]/simple_main Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x19070 Cannot insert breakpoint -3. Temporarily disabling shared library breakpoints: breakpoint #-3 The regression was introduced by the to_xfer_partial transition to return a status enum. procfs_xfer_partial was updated but not the case where object is TARGET_OBJECT_MEMORY. As result, procfs_xfer_partial was returning the length xfered rather than the status, and the xfered buffer was left uninitialized. gdb/ 2014-02-19 Pedro Alves <palves@redhat.com> * procfs.c (procfs_target): Don't install procfs_xfer_memory as deprecated_xfer_memory hook. (procfs_xfer_partial): Call procfs_xfer_memory instead of the deprecated_xfer_memory target hook. (procfs_xfer_memory): Adjust interface as a to_xfer_partial helper.
Diffstat (limited to 'gdb/procfs.c')
-rw-r--r--gdb/procfs.c73
1 files changed, 27 insertions, 46 deletions
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 822e1e0..8204747 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -127,9 +127,10 @@ static void procfs_create_inferior (struct target_ops *, char *,
char *, char **, int);
static ptid_t procfs_wait (struct target_ops *,
ptid_t, struct target_waitstatus *, int);
-static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
- struct mem_attrib *attrib,
- struct target_ops *);
+static enum target_xfer_status procfs_xfer_memory (gdb_byte *,
+ const gdb_byte *,
+ ULONGEST, ULONGEST,
+ ULONGEST *);
static target_xfer_partial_ftype procfs_xfer_partial;
static int procfs_thread_alive (struct target_ops *ops, ptid_t);
@@ -197,7 +198,6 @@ procfs_target (void)
t->to_fetch_registers = procfs_fetch_registers;
t->to_store_registers = procfs_store_registers;
t->to_xfer_partial = procfs_xfer_partial;
- t->deprecated_xfer_memory = procfs_xfer_memory;
t->to_pass_signals = procfs_pass_signals;
t->to_files_info = procfs_files_info;
t->to_stop = procfs_stop;
@@ -3986,13 +3986,7 @@ procfs_xfer_partial (struct target_ops *ops, enum target_object object,
switch (object)
{
case TARGET_OBJECT_MEMORY:
- if (readbuf)
- return (*ops->deprecated_xfer_memory) (offset, readbuf,
- len, 0/*read*/, NULL, ops);
- if (writebuf)
- return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
- len, 1/*write*/, NULL, ops);
- return TARGET_XFER_E_IO;
+ return procfs_xfer_memory (readbuf, writebuf, offset, len, xfered_len);
#ifdef NEW_PROC_API
case TARGET_OBJECT_AUXV:
@@ -4009,23 +4003,15 @@ procfs_xfer_partial (struct target_ops *ops, enum target_object object,
}
}
+/* Helper for procfs_xfer_partial that handles memory transfers.
+ Arguments are like target_xfer_partial. */
-/* Transfer LEN bytes between GDB address MYADDR and target address
- MEMADDR. If DOWRITE is non-zero, transfer them to the target,
- otherwise transfer them from the target. TARGET is unused.
-
- The return value is 0 if an error occurred or no bytes were
- transferred. Otherwise, it will be a positive value which
- indicates the number of bytes transferred between gdb and the
- target. (Note that the interface also makes provisions for
- negative values, but this capability isn't implemented here.) */
-
-static int
-procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite,
- struct mem_attrib *attrib, struct target_ops *target)
+static enum target_xfer_status
+procfs_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
+ ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
{
procinfo *pi;
- int nbytes = 0;
+ int nbytes;
/* Find procinfo for main process. */
pi = find_procinfo_or_die (ptid_get_pid (inferior_ptid), 0);
@@ -4033,31 +4019,26 @@ procfs_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int dowrite,
open_procinfo_files (pi, FD_AS) == 0)
{
proc_warn (pi, "xfer_memory, open_proc_files", __LINE__);
- return 0;
+ return TARGET_XFER_E_IO;
}
- if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) == (off_t) memaddr)
+ if (lseek (pi->as_fd, (off_t) memaddr, SEEK_SET) != (off_t) memaddr)
+ return TARGET_XFER_E_IO;
+
+ if (writebuf != NULL)
{
- if (dowrite)
- {
-#ifdef NEW_PROC_API
- PROCFS_NOTE ("write memory:\n");
-#else
- PROCFS_NOTE ("write memory:\n");
-#endif
- nbytes = write (pi->as_fd, myaddr, len);
- }
- else
- {
- PROCFS_NOTE ("read memory:\n");
- nbytes = read (pi->as_fd, myaddr, len);
- }
- if (nbytes < 0)
- {
- nbytes = 0;
- }
+ PROCFS_NOTE ("write memory:\n");
+ nbytes = write (pi->as_fd, writebuf, len);
+ }
+ else
+ {
+ PROCFS_NOTE ("read memory:\n");
+ nbytes = read (pi->as_fd, readbuf, len);
}
- return nbytes;
+ if (nbytes <= 0)
+ return TARGET_XFER_E_IO;
+ *xfered_len = nbytes;
+ return TARGET_XFER_OK;
}
/* Called by target_resume before making child runnable. Mark cached