[PowerPC] Consolidate linux vector regset sizes
[deliverable/binutils-gdb.git] / gdb / gdbserver / remote-utils.c
index 292197a4c924dba897ac7c2ff5687988de639f1a..3b5a459ae4cdcffc3313013dad5dea4c754e0f2d 100644 (file)
@@ -1,5 +1,5 @@
 /* Remote utility routines for the remote server for GDB.
-   Copyright (C) 1986-2016 Free Software Foundation, Inc.
+   Copyright (C) 1986-2018 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "server.h"
-#include "terminal.h"
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#endif
 #include "target.h"
 #include "gdbthread.h"
 #include "tdesc.h"
 #include "dll.h"
 #include "rsp-low.h"
+#include "gdbthread.h"
 #include <ctype.h>
 #if HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
@@ -217,9 +220,9 @@ handle_accept_event (int err, gdb_client_data client_data)
    NAME is the filename used for communication.  */
 
 void
-remote_prepare (char *name)
+remote_prepare (const char *name)
 {
-  char *port_str;
+  const char *port_str;
 #ifdef USE_WIN32API
   static int winsock_initialized;
 #endif
@@ -284,9 +287,9 @@ remote_prepare (char *name)
    NAME is the filename used for communication.  */
 
 void
-remote_open (char *name)
+remote_open (const char *name)
 {
-  char *port_str;
+  const char *port_str;
 
   port_str = strchr (name, ':');
 #ifdef USE_WIN32API
@@ -324,7 +327,7 @@ remote_open (char *name)
       if (remote_desc < 0)
        perror_with_name ("Could not open remote device");
 
-#ifdef HAVE_TERMIOS
+#if HAVE_TERMIOS_H
       {
        struct termios termios;
        tcgetattr (remote_desc, &termios);
@@ -341,33 +344,6 @@ remote_open (char *name)
       }
 #endif
 
-#ifdef HAVE_TERMIO
-      {
-       struct termio termio;
-       ioctl (remote_desc, TCGETA, &termio);
-
-       termio.c_iflag = 0;
-       termio.c_oflag = 0;
-       termio.c_lflag = 0;
-       termio.c_cflag &= ~(CSIZE | PARENB);
-       termio.c_cflag |= CLOCAL | CS8;
-       termio.c_cc[VMIN] = 1;
-       termio.c_cc[VTIME] = 0;
-
-       ioctl (remote_desc, TCSETA, &termio);
-      }
-#endif
-
-#ifdef HAVE_SGTTY
-      {
-       struct sgttyb sg;
-
-       ioctl (remote_desc, TIOCGETP, &sg);
-       sg.sg_flags = RAW;
-       ioctl (remote_desc, TIOCSETP, &sg);
-      }
-#endif
-
       fprintf (stderr, "Remote debugging using %s\n", name);
 
       enable_async_notification (remote_desc);
@@ -402,6 +378,8 @@ remote_close (void)
 {
   delete_file_handler (remote_desc);
 
+  disable_async_io ();
+
 #ifdef USE_WIN32API
   closesocket (remote_desc);
 #else
@@ -527,7 +505,7 @@ write_ptid (char *buf, ptid_t ptid)
 }
 
 static ULONGEST
-hex_or_minus_one (char *buf, char **obuf)
+hex_or_minus_one (const char *buf, const char **obuf)
 {
   ULONGEST ret;
 
@@ -548,10 +526,10 @@ hex_or_minus_one (char *buf, char **obuf)
 /* Extract a PTID from BUF.  If non-null, OBUF is set to the to one
    passed the last parsed char.  Returns null_ptid on error.  */
 ptid_t
-read_ptid (char *buf, char **obuf)
+read_ptid (const char *buf, const char **obuf)
 {
-  char *p = buf;
-  char *pp;
+  const char *p = buf;
+  const char *pp;
   ULONGEST pid = 0, tid = 0;
 
   if (*p == 'p')
@@ -659,18 +637,18 @@ putpkt_binary_1 (char *buf, int cnt, int is_notif)
          if (remote_debug)
            {
              if (is_notif)
-               fprintf (stderr, "putpkt (\"%s\"); [notif]\n", buf2);
+               debug_printf ("putpkt (\"%s\"); [notif]\n", buf2);
              else
-               fprintf (stderr, "putpkt (\"%s\"); [noack mode]\n", buf2);
-             fflush (stderr);
+               debug_printf ("putpkt (\"%s\"); [noack mode]\n", buf2);
+             debug_flush ();
            }
          break;
        }
 
       if (remote_debug)
        {
-         fprintf (stderr, "putpkt (\"%s\"); [looking for ack]\n", buf2);
-         fflush (stderr);
+         debug_printf ("putpkt (\"%s\"); [looking for ack]\n", buf2);
+         debug_flush ();
        }
 
       cc = readchar ();
@@ -683,8 +661,8 @@ putpkt_binary_1 (char *buf, int cnt, int is_notif)
 
       if (remote_debug)
        {
-         fprintf (stderr, "[received '%c' (0x%x)]\n", cc, cc);
-         fflush (stderr);
+         debug_printf ("[received '%c' (0x%x)]\n", cc, cc);
+         debug_flush ();
        }
 
       /* Check for an input interrupt while we're here.  */
@@ -775,19 +753,19 @@ check_remote_input_interrupt_request (void)
   input_interrupt (0);
 }
 
-/* Asynchronous I/O support.  SIGIO must be enabled when waiting, in order to
-   accept Control-C from the client, and must be disabled when talking to
-   the client.  */
+/* Asynchronous I/O support.  SIGIO must be unblocked when waiting,
+   in order to accept Control-C from the client, and must be blocked
+   when talking to the client.  */
 
 static void
-unblock_async_io (void)
+block_unblock_async_io (int block)
 {
 #ifndef USE_WIN32API
   sigset_t sigio_set;
 
   sigemptyset (&sigio_set);
   sigaddset (&sigio_set, SIGIO);
-  sigprocmask (SIG_UNBLOCK, &sigio_set, NULL);
+  sigprocmask (block ? SIG_BLOCK : SIG_UNBLOCK, &sigio_set, NULL);
 #endif
 }
 
@@ -823,9 +801,8 @@ enable_async_io (void)
   if (async_io_enabled)
     return;
 
-#ifndef USE_WIN32API
-  signal (SIGIO, input_interrupt);
-#endif
+  block_unblock_async_io (0);
+
   async_io_enabled = 1;
 #ifdef __QNX__
   nto_comctrl (1);
@@ -839,9 +816,8 @@ disable_async_io (void)
   if (!async_io_enabled)
     return;
 
-#ifndef USE_WIN32API
-  signal (SIGIO, SIG_IGN);
-#endif
+  block_unblock_async_io (1);
+
   async_io_enabled = 0;
 #ifdef __QNX__
   nto_comctrl (0);
@@ -852,12 +828,14 @@ disable_async_io (void)
 void
 initialize_async_io (void)
 {
-  /* Make sure that async I/O starts disabled.  */
+  /* Make sure that async I/O starts blocked.  */
   async_io_enabled = 1;
   disable_async_io ();
 
-  /* Make sure the signal is unblocked.  */
-  unblock_async_io ();
+  /* Install the signal handler.  */
+#ifndef USE_WIN32API
+  signal (SIGIO, input_interrupt);
+#endif
 }
 
 /* Internal buffer used by readchar.
@@ -884,7 +862,7 @@ readchar (void)
          if (readchar_bufcnt == 0)
            {
              if (remote_debug)
-               fprintf (stderr, "readchar: Got EOF\n");
+               debug_printf ("readchar: Got EOF\n");
            }
          else
            perror ("readchar");
@@ -972,8 +950,8 @@ getpkt (char *buf)
            break;
          if (remote_debug)
            {
-             fprintf (stderr, "[getpkt: discarding char '%c']\n", c);
-             fflush (stderr);
+             debug_printf ("[getpkt: discarding char '%c']\n", c);
+             debug_flush ();
            }
 
          if (c < 0)
@@ -1019,8 +997,8 @@ getpkt (char *buf)
     {
       if (remote_debug)
        {
-         fprintf (stderr, "getpkt (\"%s\");  [sending ack] \n", buf);
-         fflush (stderr);
+         debug_printf ("getpkt (\"%s\");  [sending ack] \n", buf);
+         debug_flush ();
        }
 
       if (write_prim ("+", 1) != 1)
@@ -1028,19 +1006,35 @@ getpkt (char *buf)
 
       if (remote_debug)
        {
-         fprintf (stderr, "[sent ack]\n");
-         fflush (stderr);
+         debug_printf ("[sent ack]\n");
+         debug_flush ();
        }
     }
   else
     {
       if (remote_debug)
        {
-         fprintf (stderr, "getpkt (\"%s\");  [no ack sent] \n", buf);
-         fflush (stderr);
+         debug_printf ("getpkt (\"%s\");  [no ack sent] \n", buf);
+         debug_flush ();
        }
     }
 
+  /* The readchar above may have already read a '\003' out of the socket
+     and moved it to the local buffer.  For example, when GDB sends
+     vCont;c immediately followed by interrupt (see
+     gdb.base/interrupt-noterm.exp).  As soon as we see the vCont;c, we'll
+     resume the inferior and wait.  Since we've already moved the '\003'
+     to the local buffer, SIGIO won't help.  In that case, if we don't
+     check for interrupt after the vCont;c packet, the interrupt character
+     would stay in the buffer unattended until after the next (unrelated)
+     stop.  */
+  while (readchar_bufcnt > 0 && *readchar_bufp == '\003')
+    {
+      /* Consume the interrupt character in the buffer.  */
+      readchar ();
+      (*the_target->request_interrupt) ();
+    }
+
   return bp - buf;
 }
 
@@ -1167,7 +1161,7 @@ prepare_resume_reply (char *buf, ptid_t ptid,
 
        saved_thread = current_thread;
 
-       current_thread = find_thread_ptid (ptid);
+       switch_to_thread (ptid);
 
        regp = current_target_desc ()->expedite_regs;
 
@@ -1179,7 +1173,7 @@ prepare_resume_reply (char *buf, ptid_t ptid,
            CORE_ADDR addr;
            int i;
 
-           strncpy (buf, "watch:", 6);
+           memcpy (buf, "watch:", 6);
            buf += 6;
 
            addr = (*the_target->stopped_data_address) ();
@@ -1441,7 +1435,7 @@ clear_symbol_cache (struct sym_cache **symcache_p)
 int
 look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb)
 {
-  char own_buf[266], *p, *q;
+  char *p, *q;
   int len;
   struct sym_cache *sym;
   struct process_info *proc;
@@ -1476,23 +1470,37 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb)
   /* We ought to handle pretty much any packet at this point while we
      wait for the qSymbol "response".  That requires re-entering the
      main loop.  For now, this is an adequate approximation; allow
-     GDB to read from memory while it figures out the address of the
-     symbol.  */
-  while (own_buf[0] == 'm')
+     GDB to read from memory and handle 'v' packets (for vFile transfers)
+     while it figures out the address of the symbol.  */
+  while (1)
     {
-      CORE_ADDR mem_addr;
-      unsigned char *mem_buf;
-      unsigned int mem_len;
+      if (own_buf[0] == 'm')
+       {
+         CORE_ADDR mem_addr;
+         unsigned char *mem_buf;
+         unsigned int mem_len;
 
-      decode_m_packet (&own_buf[1], &mem_addr, &mem_len);
-      mem_buf = (unsigned char *) xmalloc (mem_len);
-      if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0)
-       bin2hex (mem_buf, own_buf, mem_len);
+         decode_m_packet (&own_buf[1], &mem_addr, &mem_len);
+         mem_buf = (unsigned char *) xmalloc (mem_len);
+         if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0)
+           bin2hex (mem_buf, own_buf, mem_len);
+         else
+           write_enn (own_buf);
+         free (mem_buf);
+         if (putpkt (own_buf) < 0)
+           return -1;
+       }
+      else if (own_buf[0] == 'v')
+       {
+         int new_len = -1;
+         handle_v_requests (own_buf, len, &new_len);
+         if (new_len != -1)
+           putpkt_binary (own_buf, new_len);
+         else
+           putpkt (own_buf);
+       }
       else
-       write_enn (own_buf);
-      free (mem_buf);
-      if (putpkt (own_buf) < 0)
-       return -1;
+       break;
       len = getpkt (own_buf);
       if (len < 0)
        return -1;
@@ -1540,12 +1548,10 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb)
 int
 relocate_instruction (CORE_ADDR *to, CORE_ADDR oldloc)
 {
-  char own_buf[266];
   int len;
   ULONGEST written = 0;
 
   /* Send the request.  */
-  strcpy (own_buf, "qRelocInsn:");
   sprintf (own_buf, "qRelocInsn:%s;%s", paddress (oldloc),
           paddress (*to));
   if (putpkt (own_buf) < 0)
This page took 0.029603 seconds and 4 git commands to generate.