diff options
Diffstat (limited to 'gdb/procfs.c')
-rw-r--r-- | gdb/procfs.c | 73 |
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 |