From e96027e0d9b0a600aabd2c1c7cfdde6ce6d076e8 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 19 Feb 2014 20:29:31 +0000 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 9 +++++++ gdb/procfs.c | 73 +++++++++++++++++++-------------------------------- 2 files changed, 36 insertions(+), 46 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc8573c1d04..b642ac95acf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2014-02-24 Pedro Alves + + * 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 * windows-nat.c (windows_xfer_shared_libraries): Return diff --git a/gdb/procfs.c b/gdb/procfs.c index 822e1e0a1df..8204747784c 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 -- 2.30.2