2003-10-31 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 31 Oct 2003 15:25:34 +0000 (15:25 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 31 Oct 2003 15:25:34 +0000 (15:25 +0000)
* 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
gdb/remote.c
gdb/target.c
gdb/target.h

index b5a9fa507bfec4ccd469719a7256354f98f8a433..48f18583aea15d371c5ca9be06c93b61e95c1ff3 100644 (file)
@@ -1,3 +1,20 @@
+2003-10-31  Andrew Cagney  <cagney@redhat.com>
+
+       * 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  <kettenis@gnu.org>
 
        * i386-tdep.c (i386_supply_fpregset): Support floating-point
index 4b0ff1beb26ae7f7ef677ec77a231311d512a9ff..1e464dd0bcee16d4747ef066afb38026a6767032 100644 (file)
@@ -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;
index e99d9472d9632769e77b5e5d7345b3edfe33d510..a21fd9f1d37436360dbfd3f81e17b40dda78714d 100644 (file)
@@ -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;
index 2fb3381e7a2cd162f7e89df73f28c4f805c9a3d2..0746c1d33bb16d768ac87c88e423aa4ae5c92856 100644 (file)
@@ -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?