]> Git Repo - binutils.git/blobdiff - gdb/target.c
* fork-child.c: Update copyright year. Fix coding style.
[binutils.git] / gdb / target.c
index 5faf5a84725c3fdf268958e20fa935a39b3bb23b..9770b9ae0ace84bb2178269dad915cb885d6b591 100644 (file)
@@ -159,6 +159,12 @@ static int debug_to_thread_alive (ptid_t);
 
 static void debug_to_stop (void);
 
+/* NOTE: cagney/2004-09-29: Many targets reference this variable in
+   wierd and mysterious ways.  Putting the variable here lets those
+   wierd and mysterious ways keep building while they are being
+   converted to the inferior inheritance structure.  */
+struct target_ops child_ops;
+
 /* Pointer to array of target architecture structures; the size of the
    array; the current index into the array; the allocated size of the 
    array.  */
@@ -379,7 +385,6 @@ update_current_target (void)
       INHERIT (to_disconnect, t);
       INHERIT (to_resume, t);
       INHERIT (to_wait, t);
-      INHERIT (to_post_wait, t);
       INHERIT (to_fetch_registers, t);
       INHERIT (to_store_registers, t);
       INHERIT (to_prepare_to_store, t);
@@ -481,9 +486,6 @@ update_current_target (void)
   de_fault (to_wait, 
            (ptid_t (*) (ptid_t, struct target_waitstatus *)) 
            noprocess);
-  de_fault (to_post_wait, 
-           (void (*) (ptid_t, int)) 
-           target_ignore);
   de_fault (to_fetch_registers, 
            (void (*) (int)) 
            target_ignore);
@@ -779,7 +781,7 @@ target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
       tlen = MIN (len, 4 - (memaddr & 3));
       offset = memaddr & 3;
 
-      errcode = target_xfer_memory (memaddr & ~3, buf, 4, 0);
+      errcode = target_read_memory (memaddr & ~3, buf, 4);
       if (errcode != 0)
        {
          /* The transfer request might have crossed the boundary to an
@@ -787,7 +789,7 @@ target_read_string (CORE_ADDR memaddr, char **string, int len, int *errnop)
             a single byte.  */
          tlen = 1;
          offset = 0;
-         errcode = target_xfer_memory (memaddr, buf, 1, 0);
+         errcode = target_read_memory (memaddr, buf, 1);
          if (errcode != 0)
            goto done;
        }
@@ -838,6 +840,89 @@ target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
   return NULL;
 }
 
+/* Return non-zero when the target vector has supplied an xfer_partial
+   method and it, rather than xfer_memory, should be used.  */
+static int
+target_xfer_partial_p (void)
+{
+  return (target_stack != NULL
+         && target_stack->to_xfer_partial != default_xfer_partial);
+}
+
+/* Attempt a transfer all LEN bytes starting at OFFSET between the
+   inferior's KIND:ANNEX space and GDB's READBUF/WRITEBUF buffer.  If
+   the transfer succeeds, return zero, otherwize the host ERRNO is
+   returned.
+
+   The inferior is formed from several layers.  In the case of
+   corefiles, inf-corefile is layered above inf-exec and a request for
+   text (corefiles do not include text pages) will be first sent to
+   the core-stratum, fail, and then sent to the object-file where it
+   will succeed.
+
+   NOTE: cagney/2004-09-30:
+
+   The old code tried to use four separate mechanisms for mapping an
+   object:offset:len tuple onto an inferior and its address space: the
+   target stack; the inferior's TO_SECTIONS; solib's SO_LIST;
+   overlays.
+
+   This is stupid.
+
+   The code below is instead using a single mechanism (currently
+   strata).  If that mechanism proves insufficient then re-factor it
+   implementing another singluar mechanism (for instance, a generic
+   object:annex onto inferior:object:annex say).  */
+
+static int
+xfer_using_stratum (enum target_object object, const char *annex,
+                   CORE_ADDR memaddr, int len, void *readbuf,
+                   const void *writebuf)
+{
+  LONGEST xfered;
+  struct target_ops *target;
+
+  /* Always successful.  */
+  if (len == 0)
+    return 0;
+  /* Never successful.  */
+  if (target_stack == NULL)
+    return EIO;
+
+  target = target_stack;
+  while (1)
+    {
+      xfered = target->to_xfer_partial (target, object, annex,
+                                       readbuf, writebuf, memaddr, len);
+      if (xfered > 0)
+       {
+         /* The partial xfer succeeded, update the counts, check that
+            the xfer hasn't finished and if it hasn't set things up
+            for the next round.  */
+         len -= xfered;
+         if (len <= 0)
+           return 0;
+         target = target_stack;
+       }
+      else if (xfered < 0)
+       {
+         /* Something totally screwed up, abandon the attempt to
+            xfer.  */
+         if (errno)
+           return errno;
+         else
+           return EIO;
+       }
+      else
+       {
+         /* This "stratum" didn't work, try the next one down.  */
+         target = target->beneath;
+         if (target == NULL)
+           return EIO;
+       }
+    }
+}
+
 /* Read LEN bytes of target memory at address MEMADDR, placing the results in
    GDB's memory at MYADDR.  Returns either 0 for success or an errno value
    if any error occurs.
@@ -851,13 +936,21 @@ target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
 int
 target_read_memory (CORE_ADDR memaddr, char *myaddr, int len)
 {
-  return target_xfer_memory (memaddr, myaddr, len, 0);
+  if (target_xfer_partial_p ())
+    return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
+                              memaddr, len, myaddr, NULL);
+  else
+    return target_xfer_memory (memaddr, myaddr, len, 0);
 }
 
 int
 target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
 {
-  return target_xfer_memory (memaddr, myaddr, len, 1);
+  if (target_xfer_partial_p ())
+    return xfer_using_stratum (TARGET_OBJECT_MEMORY, NULL,
+                              memaddr, len, NULL, myaddr);
+  else
+    return target_xfer_memory (memaddr, myaddr, len, 1);
 }
 
 static int trust_readonly = 0;
@@ -1063,13 +1156,23 @@ target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
 int
 target_read_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
 {
-  return target_xfer_memory_partial (memaddr, buf, len, 0, err);
+  if (target_xfer_partial_p ())
+    return target_stack->to_xfer_partial (target_stack,
+                                         TARGET_OBJECT_MEMORY, NULL,
+                                         buf, NULL, memaddr, len);
+  else
+    return target_xfer_memory_partial (memaddr, buf, len, 0, err);
 }
 
 int
 target_write_memory_partial (CORE_ADDR memaddr, char *buf, int len, int *err)
 {
-  return target_xfer_memory_partial (memaddr, buf, len, 1, err);
+  if (target_xfer_partial_p ())
+    return target_stack->to_xfer_partial (target_stack,
+                                         TARGET_OBJECT_MEMORY, NULL,
+                                         NULL, buf, memaddr, len);
+  else
+    return target_xfer_memory_partial (memaddr, buf, len, 1, err);
 }
 
 /* More generic transfers.  */
@@ -1216,11 +1319,6 @@ target_info (char *args, int from_tty)
   if (symfile_objfile != NULL)
     printf_unfiltered ("Symbols from \"%s\".\n", symfile_objfile->name);
 
-#ifdef FILES_INFO_HOOK
-  if (FILES_INFO_HOOK ())
-    return;
-#endif
-
   for (t = target_stack; t != NULL; t = t->beneath)
     {
       if (!t->to_has_memory)
@@ -1745,15 +1843,6 @@ debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
   return retval;
 }
 
-static void
-debug_to_post_wait (ptid_t ptid, int status)
-{
-  debug_target.to_post_wait (ptid, status);
-
-  fprintf_unfiltered (gdb_stdlog, "target_post_wait (%d, %d)\n",
-                     PIDGET (ptid), status);
-}
-
 static void
 debug_print_register (const char * func, int regno)
 {
@@ -2345,7 +2434,6 @@ setup_target_debug (void)
   current_target.to_disconnect = debug_to_disconnect;
   current_target.to_resume = debug_to_resume;
   current_target.to_wait = debug_to_wait;
-  current_target.to_post_wait = debug_to_post_wait;
   current_target.to_fetch_registers = debug_to_fetch_registers;
   current_target.to_store_registers = debug_to_store_registers;
   current_target.to_prepare_to_store = debug_to_prepare_to_store;
This page took 0.031735 seconds and 4 git commands to generate.