aboutsummaryrefslogtreecommitdiff
path: root/gdb/target.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2003-10-17 18:24:49 +0000
committerAndrew Cagney <cagney@redhat.com>2003-10-17 18:24:49 +0000
commit1e3ff5ad7f7cd527f735fe5f36e20ba378f87f96 (patch)
tree385856bbf343c1930a92bd7acf791ac3a839a1dd /gdb/target.c
parent4b71bec021130a4ed50378864ef1807083c78adc (diff)
downloadgdb-1e3ff5ad7f7cd527f735fe5f36e20ba378f87f96.zip
gdb-1e3ff5ad7f7cd527f735fe5f36e20ba378f87f96.tar.gz
gdb-1e3ff5ad7f7cd527f735fe5f36e20ba378f87f96.tar.bz2
2003-10-17 Andrew Cagney <cagney@redhat.com>
* target.h (struct target_ops): Add "to_read_partial" and "to_write_partial", delete "to_query". (target_read_partial, target_write_partial): Declare. (target_read, target_write): Declare. (target_query): Delete macro. * target.c (target_read_partial): New function. (target_write_partial, target_read, target_write): New function. (update_current_target): Delete inheritance of "to_query". Add comments about "to_read_partial" and "to_write_partial". (debug_to_partial_read, debug_to_partial_write): New functions. (debug_to_query): Delete function. (setup_target_debug): Set "to_read_partial" and "to_write_partial" instead of "to_query". * remote.c (remote_read_partial): Replace "remote_query". (init_remote_ops): Set "to_read_partial" instead of "to_query". (init_remote_async_ops): Ditto. * kod.c (gdb_kod_query): Make "bufsize" a LONGEST. Use "target_read_partial" instead of "target_query". * avr-tdep.c (avr_io_reg_read_command): Make "bufsize" a LONGEST. Use "target_read_partial" instead of "target_query".
Diffstat (limited to 'gdb/target.c')
-rw-r--r--gdb/target.c130
1 files changed, 121 insertions, 9 deletions
diff --git a/gdb/target.c b/gdb/target.c
index 9559914..252cb14 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -159,8 +159,6 @@ static int debug_to_thread_alive (ptid_t);
static void debug_to_stop (void);
-static int debug_to_query (int /*char */ , char *, char *, int *);
-
/* Pointer to array of target architecture structures; the size of the
array; the current index into the array; the allocated size of the
array. */
@@ -422,7 +420,8 @@ update_current_target (void)
INHERIT (to_pid_to_str, t);
INHERIT (to_extra_thread_info, t);
INHERIT (to_stop, t);
- INHERIT (to_query, t);
+ /* Do not inherit to_read_partial. */
+ /* Do not inherit to_write_partial. */
INHERIT (to_rcmd, t);
INHERIT (to_enable_exception_callback, t);
INHERIT (to_get_current_exception_event, t);
@@ -1056,6 +1055,90 @@ target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
return target_xfer_memory_partial (memaddr, buf, len, 1, err);
}
+/* More generic transfers. */
+
+LONGEST
+target_read_partial (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, void *buf,
+ ULONGEST offset, LONGEST len)
+{
+ struct target_ops *op;
+
+ /* Find the first target stratum that can handle the request. */
+ for (op = ops;
+ op != NULL && op->to_read_partial == NULL;
+ op = op->beneath)
+ ;
+ if (op == NULL)
+ return -1;
+
+ /* Now apply the operation at that level. */
+ return op->to_read_partial (op, object, annex, buf, offset, len);
+}
+
+LONGEST
+target_write_partial (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, const void *buf,
+ ULONGEST offset, LONGEST len)
+{
+ struct target_ops *op;
+
+ /* Find the first target stratum that can handle the request. */
+ for (op = ops;
+ op != NULL && op->to_write_partial == NULL;
+ op = op->beneath)
+ ;
+ if (op == NULL)
+ return -1;
+
+ return op->to_write_partial (op, object, annex, buf, offset, len);
+}
+
+/* Wrappers to perform the full transfer. */
+LONGEST
+target_read (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, void *buf,
+ ULONGEST offset, LONGEST len)
+{
+ LONGEST xfered = 0;
+ while (xfered < len)
+ {
+ LONGEST xfer = target_write_partial (ops, object, annex,
+ (bfd_byte *) buf + xfered,
+ offset + xfered, len - xfered);
+ /* Call an observer, notifying them of the xfer progress? */
+ if (xfer < 0)
+ return xfer;
+ xfered += xfer;
+ QUIT;
+ }
+ return len;
+}
+
+LONGEST
+target_write (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, const void *buf,
+ ULONGEST offset, LONGEST len)
+{
+ LONGEST xfered = 0;
+ while (xfered < len)
+ {
+ LONGEST xfer = target_write_partial (ops, object, annex,
+ (bfd_byte *) buf + xfered,
+ offset + xfered, len - xfered);
+ /* Call an observer, notifying them of the xfer progress? */
+ if (xfer < 0)
+ return xfer;
+ xfered += xfer;
+ QUIT;
+ }
+ return len;
+}
+
static void
target_info (char *args, int from_tty)
{
@@ -2128,14 +2211,42 @@ debug_to_stop (void)
fprintf_unfiltered (gdb_stdlog, "target_stop ()\n");
}
-static int
-debug_to_query (int type, char *req, char *resp, int *siz)
+static LONGEST
+debug_to_read_partial (struct target_ops *ops,
+ enum target_object object,
+ const char *annex, void *buf,
+ ULONGEST offset, LONGEST len)
{
- int retval;
+ LONGEST retval;
+
+ retval = target_read_partial (&debug_target, object, annex, buf, offset,
+ len);
- retval = debug_target.to_query (type, req, resp, siz);
+ 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;
+}
- fprintf_unfiltered (gdb_stdlog, "target_query (%c, %s, %s, %d) = %d\n", type, req, resp, *siz, 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)
+{
+ LONGEST retval;
+
+ retval = target_write_partial (&debug_target, object, annex, buf, offset,
+ len);
+
+ fprintf_unfiltered (gdb_stdlog,
+ "target_write_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;
}
@@ -2237,7 +2348,8 @@ 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_query = debug_to_query;
+ current_target.to_read_partial = debug_to_read_partial;
+ current_target.to_write_partial = debug_to_write_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;