Fix debugging programs statically linked against the thread library.
[deliverable/binutils-gdb.git] / gdb / target.c
index 668987e6ce1828585223c2e03163ac2d31144a8c..ec4d01eff0ba13c7a1da777312c8463cd2009484 100644 (file)
@@ -664,7 +664,7 @@ push_target (struct target_ops *t)
        else
          target_stack = cur->next;     /* Unchain first on list */
        tmp = cur->next;
-       free (cur);
+       xfree (cur);
        cur = tmp;
       }
 
@@ -718,7 +718,7 @@ unpush_target (struct target_ops *t)
   else
     prev->next = cur->next;
 
-  free (cur);                  /* Release the target_stack_item */
+  xfree (cur);                 /* Release the target_stack_item */
 
   update_current_target ();
   cleanup_target (&current_target);
@@ -837,15 +837,10 @@ target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
   return target_xfer_memory (memaddr, myaddr, len, 1);
 }
 
-/* Move memory to or from the targets.  Iterate until all of it has
-   been moved, if necessary.  The top target gets priority; anything
-   it doesn't want, is offered to the next one down, etc.  Note the
-   business with curlen:  if an early target says "no, but I have a
-   boundary overlapping this xfer" then we shorten what we offer to
-   the subsequent targets so the early guy will get a chance at the
-   tail before the subsequent ones do. 
+/* Move memory to or from the targets.  The top target gets priority;
+   if it cannot handle it, it is offered to the next one down, etc.
 
-   Result is 0 or errno value.  */
+   Result is -1 on error, or the number of bytes transfered.  */
 
 int
 do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
@@ -863,17 +858,12 @@ do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
      0.  */
   errno = 0;
 
-  /* The quick case is that the top target does it all.  */
+  /* The quick case is that the top target can handle the transfer.  */
   res = current_target.to_xfer_memory
     (memaddr, myaddr, len, write, &current_target);
-  if (res == len)
-    return len;
-
-  if (res > 0)
-    goto bump;
-  /* If res <= 0 then we call it again in the loop.  Ah well.  */
 
-  while (len > 0)
+  /* If res <= 0 then we call it again in the loop.  Ah well. */
+  if (res <= 0)
     {
       for (item = target_stack; item; item = item->next)
        {
@@ -889,19 +879,18 @@ do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
        }
 
       if (res <= 0)
-       {
-           return -1;
-       }
-    bump:
-      done    += res;
-      memaddr += res;
-      myaddr  += res;
-      len     -= res;
+       return -1;
     }
-  
-  return done;
+
+  return res;
 }
 
+
+/* Perform a memory transfer.  Iterate until the entire region has
+   been transfered.
+
+   Result is 0 or errno value.  */
+
 static int
 target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
 {
@@ -937,17 +926,15 @@ target_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
 }
 
 
-/* Perform a partial memory transfer.  */
+/* Perform a partial memory transfer.
+
+   Result is -1 on error, or the number of bytes transfered.  */
 
 static int
 target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
                            int write_p, int *err)
 {
   int res;
-  int err_res;
-  int len_res;
-  struct target_ops *t;
-  struct target_stack_item *item;
 
   /* Zero length requests are ok and require no work.  */
   if (len == 0)
@@ -968,7 +955,7 @@ target_xfer_memory_partial (CORE_ADDR memaddr, char *myaddr, int len,
     }
 
   *err = 0;
-  return 0;
+  return res;
 }
 
 int
@@ -1435,6 +1422,7 @@ static struct {
   {"SIG63", "Real-time event 63"},
   {"SIGCANCEL", "LWP internal signal"},
   {"SIG32", "Real-time event 32"},
+  {"SIG64", "Real-time event 64"},
 
 #if defined(MACH) || defined(__MACH__)
   /* Mach exceptions */
@@ -1749,6 +1737,8 @@ target_signal_from_host (int hostsig)
       if (33 <= hostsig && hostsig <= 63)
        return (enum target_signal)
          (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
+      else if (hostsig == 64)
+       return TARGET_SIGNAL_REALTIME_64;
       else
        error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
     }
@@ -2020,6 +2010,8 @@ do_target_signal_to_host (enum target_signal oursig,
          if (retsig >= SIGRTMIN && retsig <= SIGRTMAX)
            return retsig;
        }
+      else if (oursig == TARGET_SIGNAL_REALTIME_64)
+       return 64;
 #endif
       *oursig_ok = 0;
       return 0;
This page took 0.025676 seconds and 4 git commands to generate.