From 4b8a223fcb9a9d720b65cb6bc36ff82982e0bf4d Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Fri, 31 Oct 2003 15:25:34 +0000 Subject: [PATCH] 2003-10-31 Andrew Cagney * target.h (struct target_ops): Replace "to_read_partial" and "to_write_partial" with "to_xfer_partial". Update comments. * target.c (debug_to_write_partial): Delete function. (debug_to_xfer_partial): Replace debug_to_read_partial. (add_target, update_current_target, setup_target_debug): Set "to_xfer_partial" instead of "to_read_partial" and "to_write_partial". (default_xfer_partial): Replace "default_write_partial". (default_read_partial): Delete. (target_read_partial, target_write_partial): Call "to_xfer_partial". * remote.c (init_remote_ops): Set "to_xfer_partial". (init_remote_async_ops): Ditto. (remote_xfer_partial): Replace "remote_read_partial". --- gdb/ChangeLog | 17 +++++++ gdb/remote.c | 22 +++++---- gdb/target.c | 124 +++++++++++++++----------------------------------- gdb/target.h | 22 ++++----- 4 files changed, 76 insertions(+), 109 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b5a9fa507bf..48f18583aea 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2003-10-31 Andrew Cagney + + * target.h (struct target_ops): Replace "to_read_partial" and + "to_write_partial" with "to_xfer_partial". Update comments. + * target.c (debug_to_write_partial): Delete function. + (debug_to_xfer_partial): Replace debug_to_read_partial. + (add_target, update_current_target, setup_target_debug): Set + "to_xfer_partial" instead of "to_read_partial" and + "to_write_partial". + (default_xfer_partial): Replace "default_write_partial". + (default_read_partial): Delete. + (target_read_partial, target_write_partial): Call + "to_xfer_partial". + * remote.c (init_remote_ops): Set "to_xfer_partial". + (init_remote_async_ops): Ditto. + (remote_xfer_partial): Replace "remote_read_partial". + 2003-10-31 Mark Kettenis * i386-tdep.c (i386_supply_fpregset): Support floating-point diff --git a/gdb/remote.c b/gdb/remote.c index 4b0ff1beb26..1e464dd0bce 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5102,8 +5102,8 @@ the loaded file\n"); } static LONGEST -remote_read_partial (struct target_ops *ops, enum target_object object, - const char *annex, void *buf, +remote_xfer_partial (struct target_ops *ops, enum target_object object, + const char *annex, const void *writebuf, void *readbuf, ULONGEST offset, LONGEST len) { struct remote_state *rs = get_remote_state (); @@ -5112,6 +5112,10 @@ remote_read_partial (struct target_ops *ops, enum target_object object, char *p2 = &buf2[0]; char query_type; + /* Only handle reads. */ + if (writebuf != NULL || readbuf == NULL) + return -1; + /* Map pre-existing objects onto letters. DO NOT do this for new objects!!! Instead specify new query packets. */ switch (object) @@ -5126,9 +5130,9 @@ remote_read_partial (struct target_ops *ops, enum target_object object, return -1; } - /* Note: a zero BUF, OFFSET and LEN can be used to query the minimum + /* Note: a zero OFFSET and LEN can be used to query the minimum buffer size. */ - if (buf == NULL && offset == 0 && len == 0) + if (offset == 0 && len == 0) return (rs->remote_packet_size); /* Minimum outbuf size is (rs->remote_packet_size) - if bufsiz is not large enough let the caller. */ @@ -5141,7 +5145,7 @@ remote_read_partial (struct target_ops *ops, enum target_object object, error ("remote query is only available after target open"); gdb_assert (annex != NULL); - gdb_assert (buf != NULL); + gdb_assert (readbuf != NULL); *p2++ = 'q'; *p2++ = query_type; @@ -5165,9 +5169,9 @@ remote_read_partial (struct target_ops *ops, enum target_object object, if (i < 0) return i; - getpkt (buf, len, 0); + getpkt (readbuf, len, 0); - return strlen (buf); + return strlen (readbuf); } static void @@ -5445,7 +5449,7 @@ Specify the serial device it is connected to\n\ remote_ops.to_pid_to_str = remote_pid_to_str; remote_ops.to_extra_thread_info = remote_threads_extra_info; remote_ops.to_stop = remote_stop; - remote_ops.to_read_partial = remote_read_partial; + remote_ops.to_xfer_partial = remote_xfer_partial; remote_ops.to_rcmd = remote_rcmd; remote_ops.to_stratum = process_stratum; remote_ops.to_has_all_memory = 1; @@ -5965,7 +5969,7 @@ Specify the serial device it is connected to (e.g. /dev/ttya)."; remote_async_ops.to_pid_to_str = remote_pid_to_str; remote_async_ops.to_extra_thread_info = remote_threads_extra_info; remote_async_ops.to_stop = remote_stop; - remote_async_ops.to_read_partial = remote_read_partial; + remote_async_ops.to_xfer_partial = remote_xfer_partial; remote_async_ops.to_rcmd = remote_rcmd; remote_async_ops.to_stratum = process_stratum; remote_async_ops.to_has_all_memory = 1; diff --git a/gdb/target.c b/gdb/target.c index e99d9472d96..a21fd9f1d37 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -73,14 +73,11 @@ static void nosupport_runtime (void); static void normal_target_post_startup_inferior (ptid_t ptid); -static LONGEST default_read_partial (struct target_ops *ops, +static LONGEST default_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, void *buf, - ULONGEST offset, LONGEST len); -static LONGEST default_write_partial (struct target_ops *ops, - enum target_object object, - const char *annex, const void *buf, - ULONGEST offset, LONGEST len); + const char *annex, const void *writebuf, + void *readbuf, ULONGEST offset, + LONGEST len); /* Transfer LEN bytes between target address MEMADDR and GDB address MYADDR. Returns 0 for success, errno code for failure (which @@ -223,8 +220,7 @@ void add_target (struct target_ops *t) { /* Provide default values for all "must have" methods. */ - t->to_read_partial = default_read_partial; - t->to_write_partial = default_write_partial; + t->to_xfer_partial = default_xfer_partial; if (!target_structs) { @@ -433,8 +429,7 @@ update_current_target (void) INHERIT (to_pid_to_str, t); INHERIT (to_extra_thread_info, t); INHERIT (to_stop, t); - /* Do not inherit to_read_partial. */ - /* Do not inherit to_write_partial. */ + /* Do not inherit to_xfer_partial. */ INHERIT (to_rcmd, t); INHERIT (to_enable_exception_callback, t); INHERIT (to_get_current_exception_event, t); @@ -616,8 +611,7 @@ update_current_target (void) de_fault (to_stop, (void (*) (void)) target_ignore); - current_target.to_read_partial = default_read_partial; - current_target.to_write_partial = default_write_partial; + current_target.to_xfer_partial = default_xfer_partial; de_fault (to_rcmd, (void (*) (char *, struct ui_file *)) tcomplain); @@ -1079,55 +1073,30 @@ target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err) /* More generic transfers. */ static LONGEST -default_read_partial (struct target_ops *ops, +default_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, void *buf, - ULONGEST offset, LONGEST len) -{ - if (object == TARGET_OBJECT_MEMORY - && ops->to_xfer_memory != NULL) - /* If available, fall back to the target's "to_xfer_memory" - method. */ - { - int xfered; - errno = 0; - xfered = ops->to_xfer_memory (offset, buf, len, 0/*read*/, NULL, ops); - if (xfered > 0) - return xfered; - else if (xfered == 0 && errno == 0) - /* "to_xfer_memory" uses 0, cross checked against ERRNO as one - indication of an error. */ - return 0; - else - return -1; - } - else if (ops->beneath != NULL) - return target_read_partial (ops->beneath, object, annex, buf, offset, len); - else - return -1; -} - -static LONGEST -default_write_partial (struct target_ops *ops, - enum target_object object, - const char *annex, const void *buf, - ULONGEST offset, LONGEST len) + const char *annex, const void *writebuf, + void *readbuf, ULONGEST offset, LONGEST len) { if (object == TARGET_OBJECT_MEMORY && ops->to_xfer_memory != NULL) /* If available, fall back to the target's "to_xfer_memory" method. */ { - int xfered; + int xfered = -1; errno = 0; - { - void *buffer = xmalloc (len); - struct cleanup *cleanup = make_cleanup (xfree, buffer); - memcpy (buffer, buf, len); - xfered = ops->to_xfer_memory (offset, buffer, len, 1/*write*/, NULL, + if (writebuf != NULL) + { + void *buffer = xmalloc (len); + struct cleanup *cleanup = make_cleanup (xfree, buffer); + memcpy (buffer, writebuf, len); + xfered = ops->to_xfer_memory (offset, buffer, len, 1/*write*/, NULL, + ops); + do_cleanups (cleanup); + } + if (readbuf != NULL) + xfered = ops->to_xfer_memory (offset, readbuf, len, 0/*read*/, NULL, ops); - do_cleanups (cleanup); - } if (xfered > 0) return xfered; else if (xfered == 0 && errno == 0) @@ -1138,8 +1107,8 @@ default_write_partial (struct target_ops *ops, return -1; } else if (ops->beneath != NULL) - return target_write_partial (ops->beneath, object, annex, buf, offset, - len); + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + writebuf, readbuf, offset, len); else return -1; } @@ -1156,8 +1125,8 @@ target_read_partial (struct target_ops *ops, const char *annex, void *buf, ULONGEST offset, LONGEST len) { - gdb_assert (ops->to_read_partial != NULL); - return ops->to_read_partial (ops, object, annex, buf, offset, len); + gdb_assert (ops->to_xfer_partial != NULL); + return ops->to_xfer_partial (ops, object, annex, NULL, buf, offset, len); } LONGEST @@ -1166,8 +1135,8 @@ target_write_partial (struct target_ops *ops, const char *annex, const void *buf, ULONGEST offset, LONGEST len) { - gdb_assert (ops->to_write_partial != NULL); - return ops->to_write_partial (ops, object, annex, buf, offset, len); + gdb_assert (ops->to_xfer_partial != NULL); + return ops->to_xfer_partial (ops, object, annex, buf, NULL, offset, len); } /* Wrappers to perform the full transfer. */ @@ -2318,40 +2287,20 @@ debug_to_stop (void) } static LONGEST -debug_to_read_partial (struct target_ops *ops, +debug_to_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, void *buf, - ULONGEST offset, LONGEST len) -{ - LONGEST retval; - - retval = target_read_partial (&debug_target, object, annex, buf, offset, - len); - - fprintf_unfiltered (gdb_stdlog, - "target_read_partial (%d, %s, 0x%lx, 0x%s, %s) = %s\n", - (int) object, (annex ? annex : "(null)"), - (long) buf, paddr_nz (offset), - paddr_d (len), paddr_d (retval)); - - return retval; -} - -static LONGEST -debug_to_write_partial (struct target_ops *ops, - enum target_object object, - const char *annex, const void *buf, - ULONGEST offset, LONGEST len) + const char *annex, const void *writebuf, + void *readbuf, ULONGEST offset, LONGEST len) { LONGEST retval; - retval = target_write_partial (&debug_target, object, annex, buf, offset, - len); + retval = debug_target.to_xfer_partial (&debug_target, object, annex, + writebuf, readbuf, offset, len); fprintf_unfiltered (gdb_stdlog, - "target_write_partial (%d, %s, 0x%lx, 0x%s, %s) = %s\n", + "target_xfer_partial (%d, %s, 0x%lx, 0x%lx, 0x%s, %s) = %s\n", (int) object, (annex ? annex : "(null)"), - (long) buf, paddr_nz (offset), + (long) writebuf, (long) readbuf, paddr_nz (offset), paddr_d (len), paddr_d (retval)); return retval; @@ -2454,8 +2403,7 @@ setup_target_debug (void) current_target.to_thread_alive = debug_to_thread_alive; current_target.to_find_new_threads = debug_to_find_new_threads; current_target.to_stop = debug_to_stop; - current_target.to_read_partial = debug_to_read_partial; - current_target.to_write_partial = debug_to_write_partial; + current_target.to_xfer_partial = debug_to_xfer_partial; current_target.to_rcmd = debug_to_rcmd; current_target.to_enable_exception_callback = debug_to_enable_exception_callback; current_target.to_get_current_exception_event = debug_to_get_current_exception_event; diff --git a/gdb/target.h b/gdb/target.h index 2fb3381e7a2..0746c1d33bb 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -211,10 +211,10 @@ enum target_signal target_signal_from_name (char *); to locally take responsibility for something it didn't have to worry about. - NOTE: cagney/2003-10-17: For backward compatibility with the - "target_query" method that this replaced, when BUF, OFFSET and LEN - are NULL/zero, return the "minimum" buffer size. See "remote.c" - for further information. */ + NOTE: cagney/2003-10-17: With a TARGET_OBJECT_KOD object, for + backward compatibility with the "target_query" method that this + replaced, when OFFSET and LEN are both zero, return the "minimum" + buffer size. See "remote.c" for further information. */ enum target_object { @@ -404,15 +404,13 @@ struct target_ops struct objfile *objfile, CORE_ADDR offset); - /* See above. */ - LONGEST (*to_read_partial) (struct target_ops *ops, + /* Perform partial transfers on OBJECT. See target_read_partial + and target_write_partial for details of each variant. One, and + only one, of readbuf or writebuf must be non-NULL. */ + LONGEST (*to_xfer_partial) (struct target_ops *ops, enum target_object object, - const char *annex, void *buf, - ULONGEST offset, LONGEST len); - LONGEST (*to_write_partial) (struct target_ops *ops, - enum target_object object, - const char *annex, const void *buf, - ULONGEST offset, LONGEST len); + const char *annex, const void *writebuf, + void *readbuf, ULONGEST offset, LONGEST len); int to_magic; /* Need sub-structure for target machine related rather than comm related? -- 2.30.2