diff options
author | Pedro Alves <palves@redhat.com> | 2014-02-19 20:29:31 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2014-02-24 12:49:33 -0500 |
commit | e96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8 (patch) | |
tree | 270ed3ebd5f325a66bdf0c85b7725c1045bec67a /gdb | |
parent | 0837c976950e347cc48a1c55c6c8d60fc710c168 (diff) | |
download | gdb-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')
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/procfs.c | 73 |
2 files changed, 36 insertions, 46 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc8573c..b642ac9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2014-02-24 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. + 2014-02-24 Yuanhui Zhang <asmwarrior@gmail.com> * windows-nat.c (windows_xfer_shared_libraries): Return 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 |