* mips-tdep.c (init_extra_frame_info): Use frame relative stack
[deliverable/binutils-gdb.git] / gdb / remote.c
index d3fef8ba12b440c4b283dec1875f3cb25909dd78..87437a177981bef7d81d91ef76a5591eed6bc6b3 100644 (file)
@@ -133,7 +133,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdb-stabs.h"
 
 #include "dcache.h"
-#include "remote-utils.h"
 
 #if !defined(DONT_USE_REMOTE)
 #ifdef USG
@@ -192,7 +191,7 @@ static int
 readchar PARAMS ((void));
 
 static int
-remote_wait PARAMS ((WAITTYPE *status));
+remote_wait PARAMS ((int pid, WAITTYPE *status));
 
 static int
 tohex PARAMS ((int nib));
@@ -209,6 +208,9 @@ remote_interrupt PARAMS ((int signo));
 static void
 remote_interrupt_twice PARAMS ((int signo));
 
+static void
+interrupt_query PARAMS ((void));
+
 extern struct target_ops remote_ops;   /* Forward decl */
 
 /* This was 5 seconds, which is a long time to sit and wait.
@@ -226,7 +228,12 @@ int icache;
    starts.  */
 serial_t remote_desc = NULL;
 
-#define        PBUFSIZ 1024
+/* Having this larger than 400 causes us to be incompatible with m68k-stub.c
+   and i386-stub.c.  Normally, no one would notice because it only matters
+   for writing large chunks of memory (e.g. in downloads).  Also, this needs
+   to be more than 400 if required to hold the registers (see below, where
+   we round it up based on REGISTER_BYTES).  */
+#define        PBUFSIZ 400
 
 /* Maximum number of bytes to read/write at once.  The value here
    is chosen to fill up a packet (the headers account for the 32).  */
@@ -294,7 +301,7 @@ device is attached to the remote system (e.g. /dev/ttya).");
   if (!remote_desc)
     perror_with_name (name);
 
-  if (SERIAL_SETBAUDRATE (remote_desc, sr_get_baud_rate()))
+  if (SERIAL_SETBAUDRATE (remote_desc, baud_rate))
     {
       SERIAL_CLOSE (remote_desc);
       perror_with_name (name);
@@ -409,8 +416,8 @@ remote_interrupt (signo)
   /* If this doesn't work, try more severe steps.  */
   signal (signo, remote_interrupt_twice);
   
-  if (sr_get_debug ())
-    printf ("remote_interrupt called\n");
+  if (remote_debug)
+    printf_unfiltered ("remote_interrupt called\n");
 
   SERIAL_WRITE (remote_desc, "\003", 1); /* Send a ^C */
 }
@@ -424,18 +431,26 @@ remote_interrupt_twice (signo)
 {
   signal (signo, ofunc);
   
+  interrupt_query ();
+
+  signal (signo, remote_interrupt);
+}
+
+/* Ask the user what to do when an interrupt is received.  */
+
+static void
+interrupt_query ()
+{
   target_terminal_ours ();
+
   if (query ("Interrupted while waiting for the program.\n\
 Give up (and stop debugging it)? "))
     {
       target_mourn_inferior ();
       return_to_top_level (RETURN_QUIT);
     }
-  else
-    {
-      signal (signo, remote_interrupt);
-      target_terminal_inferior ();
-    }
+
+  target_terminal_inferior ();
 }
 
 /* Wait until the remote machine stops, then return,
@@ -444,7 +459,8 @@ Give up (and stop debugging it)? "))
    means in the case of this target).  */
 
 static int
-remote_wait (status)
+remote_wait (pid, status)
+     int pid;
      WAITTYPE *status;
 {
   unsigned char buf[PBUFSIZ];
@@ -521,19 +537,25 @@ remote_wait (status)
             new data address, and BB is the new bss address.  This is
             used by the NLM stub; gdb may see more sections.  */
          p = &buf[3];
-         text_addr = strtol (p, &p1, 16);
+         text_addr = strtoul (p, &p1, 16);
          if (p1 == p || *p1 != ';')
            warning ("Malformed relocation packet: Packet '%s'", buf);
          p = p1 + 1;
-         data_addr = strtol (p, &p1, 16);
+         data_addr = strtoul (p, &p1, 16);
          if (p1 == p || *p1 != ';')
            warning ("Malformed relocation packet: Packet '%s'", buf);
          p = p1 + 1;
-         bss_addr = strtol (p, &p1, 16);
+         bss_addr = strtoul (p, &p1, 16);
          if (p1 == p)
            warning ("Malformed relocation packet: Packet '%s'", buf);
 
-         if (symfile_objfile != NULL)
+         if (symfile_objfile != NULL
+             && (ANOFFSET (symfile_objfile->section_offsets,
+                           SECT_OFF_TEXT) != text_addr
+                 || ANOFFSET (symfile_objfile->section_offsets,
+                              SECT_OFF_DATA) != data_addr
+                 || ANOFFSET (symfile_objfile->section_offsets,
+                              SECT_OFF_BSS) != bss_addr))
            {
              struct section_offsets *offs;
 
@@ -543,12 +565,6 @@ remote_wait (status)
                 stuff.  (Just what does "text" as seen by the stub
                 mean, anyway?).  */
 
-             /* FIXME: Why don't the various symfile_offsets routines
-                in the sym_fns vectors set this?
-                (no good reason -kingdon).  */
-             if (symfile_objfile->num_sections == 0)
-               symfile_objfile->num_sections = SECT_OFF_MAX;
-
              offs = ((struct section_offsets *)
                      alloca (sizeof (struct section_offsets)
                              + (symfile_objfile->num_sections
@@ -562,6 +578,36 @@ remote_wait (status)
              ANOFFSET (offs, SECT_OFF_BSS) = bss_addr;
 
              objfile_relocate (symfile_objfile, offs);
+             {
+               struct obj_section *s;
+               bfd *abfd;
+
+               abfd = symfile_objfile->obfd;
+
+               for (s = symfile_objfile->sections;
+                    s < symfile_objfile->sections_end; ++s)
+                 {
+                   flagword flags;
+
+                   flags = bfd_get_section_flags (abfd, s->sec_ptr);
+
+                   if (flags & SEC_CODE)
+                     {
+                       s->addr += text_addr;
+                       s->endaddr += text_addr;
+                     }
+                   else if (flags & (SEC_DATA | SEC_LOAD))
+                     {
+                       s->addr += data_addr;
+                       s->endaddr += data_addr;
+                     }
+                   else if (flags & SEC_ALLOC)
+                     {
+                       s->addr += bss_addr;
+                       s->endaddr += bss_addr;
+                     }
+                 }
+             }
            }
          break;
        }
@@ -603,6 +649,17 @@ remote_fetch_registers (regno)
   /* Unimplemented registers read as all bits zero.  */
   memset (regs, 0, REGISTER_BYTES);
 
+  /* We can get out of synch in various cases.  If the first character
+     in the buffer is not a hex character, assume that has happened
+     and try to fetch another packet to read.  */
+  while ((buf[0] < '0' || buf[0] > '9')
+        && (buf[0] < 'a' || buf[0] > 'f'))
+    {
+      if (remote_debug)
+       printf_unfiltered ("Bad register packet; fetching a new packet\n");
+      getpkt (buf, 0);
+    }
+
   /* Reply describes registers byte by byte, each byte encoded as two
      hex characters.  Suck them all up, then supply them to the
      register cacheing/storage mechanism.  */
@@ -740,9 +797,6 @@ remote_write_bytes (memaddr, myaddr, len)
   int i;
   char *p;
 
-  if (len > PBUFSIZ / 2 - 20)
-    abort ();
-
   sprintf (buf, "M%x,%x:", memaddr, len);
 
   /* We send target system values byte by byte, in increasing byte addresses,
@@ -940,10 +994,10 @@ putpkt (buf)
 
   while (1)
     {
-      if (sr_get_debug ())
+      if (remote_debug)
        {
          *p = '\0';
-         printf ("Sending packet: %s...", buf2);  fflush(stdout);
+         printf_unfiltered ("Sending packet: %s...", buf2);  gdb_flush(gdb_stdout);
        }
       if (SERIAL_WRITE (remote_desc, buf2, p - buf2))
        perror_with_name ("putpkt: write failed");
@@ -956,8 +1010,8 @@ putpkt (buf)
          switch (ch)
            {
            case '+':
-             if (sr_get_debug ())
-               printf("Ack\n");
+             if (remote_debug)
+               printf_unfiltered("Ack\n");
              return;
            case SERIAL_TIMEOUT:
              break;            /* Retransmit buffer */
@@ -966,12 +1020,18 @@ putpkt (buf)
            case SERIAL_EOF:
              error ("putpkt: EOF while trying to read ACK");
            default:
-             if (sr_get_debug ())
-               printf ("%02X %c ", ch&0xFF, ch);
+             if (remote_debug)
+               printf_unfiltered ("%02X %c ", ch&0xFF, ch);
              continue;
            }
          break;                /* Here to retransmit */
        }
+
+      if (quit_flag)
+       {
+         quit_flag = 0;
+         interrupt_query ();
+       }
     }
 }
 
@@ -994,6 +1054,12 @@ getpkt (buf, forever)
 
   while (1)
     {
+      if (quit_flag)
+       {
+         quit_flag = 0;
+         interrupt_query ();
+       }
+
       /* This can loop forever if the remote side sends us characters
         continuously, but if it pauses, we'll get a zero from readchar
         because of timeout.  Then we'll count that as a retry.  */
@@ -1007,7 +1073,7 @@ getpkt (buf, forever)
          if (forever)
            continue;
          if (++retries >= MAX_RETRIES)
-           if (sr_get_debug ()) puts_filtered ("Timed out.\n");
+           if (remote_debug) puts_filtered ("Timed out.\n");
          goto out;
        }
 
@@ -1025,13 +1091,13 @@ getpkt (buf, forever)
          c = readchar ();
          if (c == SERIAL_TIMEOUT)
            {
-             if (sr_get_debug ())
+             if (remote_debug)
                puts_filtered ("Timeout in mid-packet, retrying\n");
              goto whole;               /* Start a new packet, count retries */
            } 
          if (c == '$')
            {
-             if (sr_get_debug ())
+             if (remote_debug)
                puts_filtered ("Saw new packet start in middle of old one\n");
              goto whole;               /* Start a new packet, count retries */
            }
@@ -1067,7 +1133,7 @@ whole:
        }
       else
        {
-         printf ("Ignoring packet error, continuing...\n");
+         printf_unfiltered ("Ignoring packet error, continuing...\n");
          break;
        }
     }
@@ -1076,8 +1142,8 @@ out:
 
   SERIAL_WRITE (remote_desc, "+", 1);
 
-  if (sr_get_debug ())
-    fprintf (stderr,"Packet received: %s\n", buf);
+  if (remote_debug)
+    fprintf_unfiltered (gdb_stderr,"Packet received: %s\n", buf);
 }
 \f
 static void
@@ -1189,10 +1255,12 @@ Specify the serial device it is connected to (e.g. /dev/ttya).",  /* to_doc */
   NULL,                                /* sections_end */
   OPS_MAGIC                    /* to_magic */
 };
+#endif /* Use remote.  */
 
 void
 _initialize_remote ()
 {
+#if !defined(DONT_USE_REMOTE)
   add_target (&remote_ops);
-}
 #endif
+}
This page took 0.028036 seconds and 4 git commands to generate.