linux low: Make the arch code free arch_process_info
[deliverable/binutils-gdb.git] / gdb / gdbserver / server.c
index 56c6393a4e5859b88d9d22b8c78dcea42025b033..a95973547ce1256726dde7f0bff91989f15deb12 100644 (file)
 
 #include "common/selftest.h"
 
+#define require_running_or_return(BUF)         \
+  if (!target_running ())                      \
+    {                                          \
+      write_enn (BUF);                         \
+      return;                                  \
+    }
+
+#define require_running_or_break(BUF)          \
+  if (!target_running ())                      \
+    {                                          \
+      write_enn (BUF);                         \
+      break;                                   \
+    }
+
 /* The environment to pass to the inferior when creating it.  */
 
 static gdb_environ our_environ;
@@ -855,6 +869,35 @@ handle_general_set (char *own_buf)
       return;
     }
 
+  if (startswith (own_buf, "QSetWorkingDir:"))
+    {
+      const char *p = own_buf + strlen ("QSetWorkingDir:");
+
+      if (*p != '\0')
+       {
+         std::string path = hex2str (p);
+
+         set_inferior_cwd (path.c_str ());
+
+         if (remote_debug)
+           debug_printf (_("[Set the inferior's current directory to %s]\n"),
+                         path.c_str ());
+       }
+      else
+       {
+         /* An empty argument means that we should clear out any
+            previously set cwd for the inferior.  */
+         set_inferior_cwd (NULL);
+
+         if (remote_debug)
+           debug_printf (_("\
+[Unset the inferior's current directory; will use gdbserver's cwd]\n"));
+       }
+      write_ok (own_buf);
+
+      return;
+    }
+
   /* Otherwise we didn't know what packet it was.  Say we didn't
      understand it.  */
   own_buf[0] = 0;
@@ -955,7 +998,7 @@ gdb_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
   res = prepare_to_access_memory ();
   if (res == 0)
     {
-      if (set_desired_thread (1))
+      if (set_desired_thread ())
        res = read_inferior_memory (memaddr, myaddr, len);
       else
        res = 1;
@@ -982,7 +1025,7 @@ gdb_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
       ret = prepare_to_access_memory ();
       if (ret == 0)
        {
-         if (set_desired_thread (1))
+         if (set_desired_thread ())
            ret = write_inferior_memory (memaddr, myaddr, len);
          else
            ret = EIO;
@@ -1143,12 +1186,99 @@ handle_search_memory (char *own_buf, int packet_len)
   free (pattern);
 }
 
-#define require_running(BUF)                   \
-  if (!target_running ())                      \
-    {                                          \
-      write_enn (BUF);                         \
-      return;                                  \
+/* Handle the "D" packet.  */
+
+static void
+handle_detach (char *own_buf)
+{
+  require_running_or_return (own_buf);
+
+  int pid;
+
+  if (multi_process)
+    {
+      /* skip 'D;' */
+      pid = strtol (&own_buf[2], NULL, 16);
     }
+  else
+    pid = ptid_get_pid (current_ptid);
+
+  if ((tracing && disconnected_tracing) || any_persistent_commands ())
+    {
+      struct process_info *process = find_process_pid (pid);
+
+      if (process == NULL)
+       {
+         write_enn (own_buf);
+         return;
+       }
+
+      if (tracing && disconnected_tracing)
+       fprintf (stderr,
+                "Disconnected tracing in effect, "
+                "leaving gdbserver attached to the process\n");
+
+      if (any_persistent_commands ())
+       fprintf (stderr,
+                "Persistent commands are present, "
+                "leaving gdbserver attached to the process\n");
+
+      /* Make sure we're in non-stop/async mode, so we we can both
+        wait for an async socket accept, and handle async target
+        events simultaneously.  There's also no point either in
+        having the target stop all threads, when we're going to
+        pass signals down without informing GDB.  */
+      if (!non_stop)
+       {
+         if (debug_threads)
+           debug_printf ("Forcing non-stop mode\n");
+
+         non_stop = 1;
+         start_non_stop (1);
+       }
+
+      process->gdb_detached = 1;
+
+      /* Detaching implicitly resumes all threads.  */
+      target_continue_no_signal (minus_one_ptid);
+
+      write_ok (own_buf);
+      return;
+    }
+
+  fprintf (stderr, "Detaching from process %d\n", pid);
+  stop_tracing ();
+  if (detach_inferior (pid) != 0)
+    write_enn (own_buf);
+  else
+    {
+      discard_queued_stop_replies (pid_to_ptid (pid));
+      write_ok (own_buf);
+
+      if (extended_protocol || target_running ())
+       {
+         /* There is still at least one inferior remaining or
+            we are in extended mode, so don't terminate gdbserver,
+            and instead treat this like a normal program exit.  */
+         last_status.kind = TARGET_WAITKIND_EXITED;
+         last_status.value.integer = 0;
+         last_ptid = pid_to_ptid (pid);
+
+         current_thread = NULL;
+       }
+      else
+       {
+         putpkt (own_buf);
+         remote_close ();
+
+         /* If we are attached, then we can exit.  Otherwise, we
+            need to hang around doing nothing, until the child is
+            gone.  */
+         join_inferior (pid);
+         exit (0);
+       }
+    }
+}
 
 /* Parse options to --debug-format= and "monitor set debug-format".
    ARG is the text after "--debug-format=" or "monitor set debug-format".
@@ -1326,7 +1456,7 @@ handle_qxfer_auxv (const char *annex,
 /* Handle qXfer:exec-file:read.  */
 
 static int
-handle_qxfer_exec_file (const char *const_annex,
+handle_qxfer_exec_file (const char *annex,
                        gdb_byte *readbuf, const gdb_byte *writebuf,
                        ULONGEST offset, LONGEST len)
 {
@@ -1337,7 +1467,7 @@ handle_qxfer_exec_file (const char *const_annex,
   if (the_target->pid_to_exec_file == NULL || writebuf != NULL)
     return -2;
 
-  if (const_annex[0] == '\0')
+  if (annex[0] == '\0')
     {
       if (current_thread == NULL)
        return -1;
@@ -1346,11 +1476,7 @@ handle_qxfer_exec_file (const char *const_annex,
     }
   else
     {
-      char *annex = (char *) alloca (strlen (const_annex) + 1);
-
-      strcpy (annex, const_annex);
       annex = unpack_varlen_hex (annex, &pid);
-
       if (annex[0] != '\0')
        return -1;
     }
@@ -1407,21 +1533,6 @@ handle_qxfer_features (const char *annex,
   return len;
 }
 
-/* Worker routine for handle_qxfer_libraries.
-   Add to the length pointed to by ARG a conservative estimate of the
-   length needed to transmit the file name of INF.  */
-
-static void
-accumulate_file_name_length (struct inferior_list_entry *inf, void *arg)
-{
-  struct dll_info *dll = (struct dll_info *) inf;
-  unsigned int *total_len = (unsigned int *) arg;
-
-  /* Over-estimate the necessary memory.  Assume that every character
-     in the library name must be escaped.  */
-  *total_len += 128 + 6 * strlen (dll->name);
-}
-
 /* Worker routine for handle_qxfer_libraries.
    Emit the XML to describe the library in INF.  */
 
@@ -1429,24 +1540,12 @@ static void
 emit_dll_description (struct inferior_list_entry *inf, void *arg)
 {
   struct dll_info *dll = (struct dll_info *) inf;
-  char **p_ptr = (char **) arg;
-  char *p = *p_ptr;
-  char *name;
-
-  strcpy (p, "  <library name=\"");
-  p = p + strlen (p);
-  name = xml_escape_text (dll->name);
-  strcpy (p, name);
-  free (name);
-  p = p + strlen (p);
-  strcpy (p, "\"><segment address=\"");
-  p = p + strlen (p);
-  sprintf (p, "0x%lx", (long) dll->base_addr);
-  p = p + strlen (p);
-  strcpy (p, "\"/></library>\n");
-  p = p + strlen (p);
-
-  *p_ptr = p;
+  std::string *document = (std::string *) arg;
+  std::string name = xml_escape_text (dll->name);
+
+  *document += string_printf
+    ("  <library name=\"%s\"><segment address=\"0x%lx\"/></library>\n",
+     name.c_str (), (long) dll->base_addr);
 }
 
 /* Handle qXfer:libraries:read.  */
@@ -1456,43 +1555,26 @@ handle_qxfer_libraries (const char *annex,
                        gdb_byte *readbuf, const gdb_byte *writebuf,
                        ULONGEST offset, LONGEST len)
 {
-  unsigned int total_len;
-  char *document, *p;
-
   if (writebuf != NULL)
     return -2;
 
   if (annex[0] != '\0' || current_thread == NULL)
     return -1;
 
-  total_len = 64;
-  for_each_inferior_with_data (&all_dlls, accumulate_file_name_length,
-                              &total_len);
+  std::string document = "<library-list version=\"1.0\">\n";
 
-  document = (char *) malloc (total_len);
-  if (document == NULL)
-    return -1;
+  for_each_inferior_with_data (&all_dlls, emit_dll_description, &document);
 
-  strcpy (document, "<library-list version=\"1.0\">\n");
-  p = document + strlen (document);
+  document += "</library-list>\n";
 
-  for_each_inferior_with_data (&all_dlls, emit_dll_description, &p);
+  if (offset > document.length ())
+    return -1;
 
-  strcpy (p, "</library-list>\n");
+  if (offset + len > document.length ())
+    len = document.length () - offset;
 
-  total_len = strlen (document);
+  memcpy (readbuf, &document[offset], len);
 
-  if (offset > total_len)
-    {
-      free (document);
-      return -1;
-    }
-
-  if (offset + len > total_len)
-    len = total_len - offset;
-
-  memcpy (readbuf, document + offset, len);
-  free (document);
   return len;
 }
 
@@ -1586,11 +1668,14 @@ handle_qxfer_threads_worker (struct inferior_list_entry *inf, void *arg)
 {
   struct thread_info *thread = (struct thread_info *) inf;
   struct buffer *buffer = (struct buffer *) arg;
-  ptid_t ptid = thread_to_gdb_id (thread);
+  ptid_t ptid = ptid_of (thread);
   char ptid_s[100];
   int core = target_core_of_thread (ptid);
   char core_s[21];
   const char *name = target_thread_name (ptid);
+  int handle_len;
+  gdb_byte *handle;
+  bool handle_status = target_thread_handle (ptid, &handle, &handle_len);
 
   write_ptid (ptid_s, ptid);
 
@@ -1605,6 +1690,13 @@ handle_qxfer_threads_worker (struct inferior_list_entry *inf, void *arg)
   if (name != NULL)
     buffer_xml_printf (buffer, " name=\"%s\"", name);
 
+  if (handle_status)
+    {
+      char *handle_s = (char *) alloca (handle_len * 2 + 1);
+      bin2hex (handle, handle_s, handle_len);
+      buffer_xml_printf (buffer, " handle=\"%s\"", handle_s);
+    }
+
   buffer_xml_printf (buffer, "/>\n");
 }
 
@@ -2070,21 +2162,20 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
   /* Reply the current thread id.  */
   if (strcmp ("qC", own_buf) == 0 && !disable_packet_qC)
     {
-      ptid_t gdb_id;
-      require_running (own_buf);
+      ptid_t ptid;
+      require_running_or_return (own_buf);
 
-      if (!ptid_equal (general_thread, null_ptid)
-         && !ptid_equal (general_thread, minus_one_ptid))
-       gdb_id = general_thread;
+      if (general_thread != null_ptid && general_thread != minus_one_ptid)
+       ptid = general_thread;
       else
        {
          thread_ptr = get_first_inferior (&all_threads);
-         gdb_id = thread_to_gdb_id ((struct thread_info *)thread_ptr);
+         ptid = thread_ptr->id;
        }
 
       sprintf (own_buf, "QC");
       own_buf += 2;
-      write_ptid (own_buf, gdb_id);
+      write_ptid (own_buf, ptid);
       return;
     }
 
@@ -2140,28 +2231,22 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
     {
       if (strcmp ("qfThreadInfo", own_buf) == 0)
        {
-         ptid_t gdb_id;
-
-         require_running (own_buf);
+         require_running_or_return (own_buf);
          thread_ptr = get_first_inferior (&all_threads);
 
          *own_buf++ = 'm';
-         gdb_id = thread_to_gdb_id ((struct thread_info *)thread_ptr);
-         write_ptid (own_buf, gdb_id);
+         write_ptid (own_buf, thread_ptr->id);
          thread_ptr = thread_ptr->next;
          return;
        }
 
       if (strcmp ("qsThreadInfo", own_buf) == 0)
        {
-         ptid_t gdb_id;
-
-         require_running (own_buf);
+         require_running_or_return (own_buf);
          if (thread_ptr != NULL)
            {
              *own_buf++ = 'm';
-             gdb_id = thread_to_gdb_id ((struct thread_info *)thread_ptr);
-             write_ptid (own_buf, gdb_id);
+             write_ptid (own_buf, thread_ptr->id);
              thread_ptr = thread_ptr->next;
              return;
            }
@@ -2178,7 +2263,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
     {
       CORE_ADDR text, data;
 
-      require_running (own_buf);
+      require_running_or_return (own_buf);
       if (the_target->read_offsets (&text, &data))
        sprintf (own_buf, "Text=%lX;Data=%lX;Bss=%lX",
                 (long)text, (long)data, (long)data);
@@ -2295,7 +2380,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       sprintf (own_buf,
               "PacketSize=%x;QPassSignals+;QProgramSignals+;"
               "QStartupWithShell+;QEnvironmentHexEncoded+;"
-              "QEnvironmentReset+;QEnvironmentUnset+",
+              "QEnvironmentReset+;QEnvironmentUnset+;"
+              "QSetWorkingDir+",
               PBUFSIZ - 1);
 
       if (target_supports_catch_syscall ())
@@ -2415,7 +2501,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       int i, err;
       ptid_t ptid = null_ptid;
 
-      require_running (own_buf);
+      require_running_or_return (own_buf);
 
       for (i = 0; i < 3; i++)
        {
@@ -2475,7 +2561,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
   if (the_target->get_tib_address != NULL
       && startswith (own_buf, "qGetTIBAddr:"))
     {
-      char *annex;
+      const char *annex;
       int n;
       CORE_ADDR tlb;
       ptid_t ptid = read_ptid (own_buf + 12, &annex);
@@ -2528,7 +2614,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
 
   if (startswith (own_buf, "qSearch:memory:"))
     {
-      require_running (own_buf);
+      require_running_or_return (own_buf);
       handle_search_memory (own_buf, packet_len);
       return;
     }
@@ -2546,7 +2632,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
        }
       else
        {
-         require_running (own_buf);
+         require_running_or_return (own_buf);
          process = current_process ();
        }
 
@@ -2563,12 +2649,12 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
   if (startswith (own_buf, "qCRC:"))
     {
       /* CRC check (compare-section).  */
-      char *comma;
+      const char *comma;
       ULONGEST base;
       int len;
       unsigned long long crc;
 
-      require_running (own_buf);
+      require_running_or_return (own_buf);
       comma = unpack_varlen_hex (own_buf + 5, &base);
       if (*comma++ != ',')
        {
@@ -2672,7 +2758,7 @@ handle_pending_status (const struct thread_resume *resumption,
 static void
 handle_v_cont (char *own_buf)
 {
-  char *p, *q;
+  const char *p;
   int n = 0, i = 0;
   struct thread_resume *resume_info;
   struct thread_resume default_action { null_ptid };
@@ -2711,8 +2797,8 @@ handle_v_cont (char *own_buf)
 
       if (p[0] == 'S' || p[0] == 'C')
        {
-         int sig;
-         sig = strtol (p + 1, &q, 16);
+         char *q;
+         int sig = strtol (p + 1, &q, 16);
          if (p == q)
            goto err;
          p = q;
@@ -2749,6 +2835,7 @@ handle_v_cont (char *own_buf)
        }
       else if (p[0] == ':')
        {
+         const char *q;
          ptid_t ptid = read_ptid (p + 1, &q);
 
          if (p == q)
@@ -3348,7 +3435,7 @@ handle_status (char *own_buf)
          /* GDB assumes the current thread is the thread we're
             reporting the status for.  */
          general_thread = thread->id;
-         set_desired_thread (1);
+         set_desired_thread ();
 
          gdb_assert (tp->last_status.kind != TARGET_WAITKIND_IGNORE);
          prepare_resume_reply (own_buf, tp->entry.id, &tp->last_status);
@@ -3441,26 +3528,6 @@ gdbserver_show_disableable (FILE *stream)
           "  threads     \tAll of the above\n");
 }
 
-
-#undef require_running
-#define require_running(BUF)                   \
-  if (!target_running ())                      \
-    {                                          \
-      write_enn (BUF);                         \
-      break;                                   \
-    }
-
-static int
-first_thread_of (struct inferior_list_entry *entry, void *args)
-{
-  int pid = * (int *) args;
-
-  if (ptid_get_pid (entry->id) == pid)
-    return 1;
-
-  return 0;
-}
-
 static void
 kill_inferior_callback (struct inferior_list_entry *entry)
 {
@@ -3587,6 +3654,7 @@ captured_main (int argc, char *argv[])
   volatile int attach = 0;
   int was_running;
   bool selftest = false;
+  const char *selftest_filter = NULL;
 
   while (*next_arg != NULL && **next_arg == '-')
     {
@@ -3707,6 +3775,11 @@ captured_main (int argc, char *argv[])
        run_once = 1;
       else if (strcmp (*next_arg, "--selftest") == 0)
        selftest = true;
+      else if (startswith (*next_arg, "--selftest="))
+       {
+         selftest = true;
+         selftest_filter = *next_arg + strlen ("--selftest=");
+       }
       else
        {
          fprintf (stderr, "Unknown argument: %s\n", *next_arg);
@@ -3783,7 +3856,7 @@ captured_main (int argc, char *argv[])
 
   if (selftest)
     {
-      selftests::run_tests ();
+      selftests::run_tests (selftest_filter);
       throw_quit ("Quit");
     }
 
@@ -3963,9 +4036,9 @@ main (int argc, char *argv[])
    after the last processed option.  */
 
 static void
-process_point_options (struct gdb_breakpoint *bp, char **packet)
+process_point_options (struct gdb_breakpoint *bp, const char **packet)
 {
-  char *dataptr = *packet;
+  const char *dataptr = *packet;
   int persist;
 
   /* Check if data has the correct format.  */
@@ -4016,13 +4089,10 @@ process_point_options (struct gdb_breakpoint *bp, char **packet)
 static int
 process_serial_event (void)
 {
-  char ch;
-  int i = 0;
   int signal;
   unsigned int len;
   int res;
   CORE_ADDR mem_addr;
-  int pid;
   unsigned char sig;
   int packet_len;
   int new_packet_len = -1;
@@ -4039,8 +4109,7 @@ process_serial_event (void)
     }
   response_needed = 1;
 
-  i = 0;
-  ch = own_buf[i++];
+  char ch = own_buf[0];
   switch (ch)
     {
     case 'q':
@@ -4050,91 +4119,7 @@ process_serial_event (void)
       handle_general_set (own_buf);
       break;
     case 'D':
-      require_running (own_buf);
-
-      if (multi_process)
-       {
-         i++; /* skip ';' */
-         pid = strtol (&own_buf[i], NULL, 16);
-       }
-      else
-       pid = ptid_get_pid (current_ptid);
-
-      if ((tracing && disconnected_tracing) || any_persistent_commands ())
-       {
-         struct process_info *process = find_process_pid (pid);
-
-         if (process == NULL)
-           {
-             write_enn (own_buf);
-             break;
-           }
-
-         if (tracing && disconnected_tracing)
-           fprintf (stderr,
-                    "Disconnected tracing in effect, "
-                    "leaving gdbserver attached to the process\n");
-
-         if (any_persistent_commands ())
-           fprintf (stderr,
-                    "Persistent commands are present, "
-                    "leaving gdbserver attached to the process\n");
-
-         /* Make sure we're in non-stop/async mode, so we we can both
-            wait for an async socket accept, and handle async target
-            events simultaneously.  There's also no point either in
-            having the target stop all threads, when we're going to
-            pass signals down without informing GDB.  */
-         if (!non_stop)
-           {
-             if (debug_threads)
-               debug_printf ("Forcing non-stop mode\n");
-
-             non_stop = 1;
-             start_non_stop (1);
-           }
-
-         process->gdb_detached = 1;
-
-         /* Detaching implicitly resumes all threads.  */
-         target_continue_no_signal (minus_one_ptid);
-
-         write_ok (own_buf);
-         break; /* from switch/case */
-       }
-
-      fprintf (stderr, "Detaching from process %d\n", pid);
-      stop_tracing ();
-      if (detach_inferior (pid) != 0)
-       write_enn (own_buf);
-      else
-       {
-         discard_queued_stop_replies (pid_to_ptid (pid));
-         write_ok (own_buf);
-
-         if (extended_protocol || target_running ())
-           {
-             /* There is still at least one inferior remaining or
-                we are in extended mode, so don't terminate gdbserver,
-                and instead treat this like a normal program exit.  */
-             last_status.kind = TARGET_WAITKIND_EXITED;
-             last_status.value.integer = 0;
-             last_ptid = pid_to_ptid (pid);
-
-             current_thread = NULL;
-           }
-         else
-           {
-             putpkt (own_buf);
-             remote_close ();
-
-             /* If we are attached, then we can exit.  Otherwise, we
-                need to hang around doing nothing, until the child is
-                gone.  */
-             join_inferior (pid);
-             exit (0);
-           }
-       }
+      handle_detach (own_buf);
       break;
     case '!':
       extended_protocol = 1;
@@ -4146,27 +4131,18 @@ process_serial_event (void)
     case 'H':
       if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's')
        {
-         ptid_t gdb_id, thread_id;
-         int pid;
+         require_running_or_break (own_buf);
 
-         require_running (own_buf);
+         ptid_t thread_id = read_ptid (&own_buf[2], NULL);
 
-         gdb_id = read_ptid (&own_buf[2], NULL);
-
-         pid = ptid_get_pid (gdb_id);
-
-         if (ptid_equal (gdb_id, null_ptid)
-             || ptid_equal (gdb_id, minus_one_ptid))
+         if (thread_id == null_ptid || thread_id == minus_one_ptid)
            thread_id = null_ptid;
-         else if (pid != 0
-                  && ptid_equal (pid_to_ptid (pid),
-                                 gdb_id))
+         else if (thread_id.is_pid ())
            {
-             struct thread_info *thread =
-               (struct thread_info *) find_inferior (&all_threads,
-                                                     first_thread_of,
-                                                     &pid);
-             if (!thread)
+             /* The ptid represents a pid.  */
+             thread_info *thread = find_any_thread_of_pid (thread_id.pid ());
+
+             if (thread == NULL)
                {
                  write_enn (own_buf);
                  break;
@@ -4176,8 +4152,8 @@ process_serial_event (void)
            }
          else
            {
-             thread_id = gdb_id_to_thread_id (gdb_id);
-             if (ptid_equal (thread_id, null_ptid))
+             /* The ptid represents a lwp/tid.  */
+             if (find_thread_ptid (thread_id) == NULL)
                {
                  write_enn (own_buf);
                  break;
@@ -4200,7 +4176,7 @@ process_serial_event (void)
                }
 
              general_thread = thread_id;
-             set_desired_thread (1);
+             set_desired_thread ();
              gdb_assert (current_thread != NULL);
            }
          else if (own_buf[1] == 'c')
@@ -4216,7 +4192,7 @@ process_serial_event (void)
        }
       break;
     case 'g':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       if (current_traceframe >= 0)
        {
          struct regcache *regcache
@@ -4233,7 +4209,7 @@ process_serial_event (void)
        {
          struct regcache *regcache;
 
-         if (!set_desired_thread (1))
+         if (!set_desired_thread ())
            write_enn (own_buf);
          else
            {
@@ -4243,14 +4219,14 @@ process_serial_event (void)
        }
       break;
     case 'G':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       if (current_traceframe >= 0)
        write_enn (own_buf);
       else
        {
          struct regcache *regcache;
 
-         if (!set_desired_thread (1))
+         if (!set_desired_thread ())
            write_enn (own_buf);
          else
            {
@@ -4261,7 +4237,7 @@ process_serial_event (void)
        }
       break;
     case 'm':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       decode_m_packet (&own_buf[1], &mem_addr, &len);
       res = gdb_read_memory (mem_addr, mem_buf, len);
       if (res < 0)
@@ -4270,7 +4246,7 @@ process_serial_event (void)
        bin2hex (mem_buf, own_buf, res);
       break;
     case 'M':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       decode_M_packet (&own_buf[1], &mem_addr, &len, &mem_buf);
       if (gdb_write_memory (mem_addr, mem_buf, len) == 0)
        write_ok (own_buf);
@@ -4278,7 +4254,7 @@ process_serial_event (void)
        write_enn (own_buf);
       break;
     case 'X':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       if (decode_X_packet (&own_buf[1], packet_len - 1,
                           &mem_addr, &len, &mem_buf) < 0
          || gdb_write_memory (mem_addr, mem_buf, len) != 0)
@@ -4287,7 +4263,7 @@ process_serial_event (void)
        write_ok (own_buf);
       break;
     case 'C':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       hex2bin (own_buf + 1, &sig, 1);
       if (gdb_signal_to_host_p ((enum gdb_signal) sig))
        signal = gdb_signal_to_host ((enum gdb_signal) sig);
@@ -4296,7 +4272,7 @@ process_serial_event (void)
       myresume (own_buf, 0, signal);
       break;
     case 'S':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       hex2bin (own_buf + 1, &sig, 1);
       if (gdb_signal_to_host_p ((enum gdb_signal) sig))
        signal = gdb_signal_to_host ((enum gdb_signal) sig);
@@ -4305,12 +4281,12 @@ process_serial_event (void)
       myresume (own_buf, 1, signal);
       break;
     case 'c':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       signal = 0;
       myresume (own_buf, 0, signal);
       break;
     case 's':
-      require_running (own_buf);
+      require_running_or_break (own_buf);
       signal = 0;
       myresume (own_buf, 1, signal);
       break;
@@ -4324,7 +4300,7 @@ process_serial_event (void)
        char type = own_buf[1];
        int res;
        const int insert = ch == 'Z';
-       char *p = &own_buf[3];
+       const char *p = &own_buf[3];
 
        p = unpack_varlen_hex (p, &addr);
        kind = strtol (p + 1, &dataptr, 16);
@@ -4344,7 +4320,8 @@ process_serial_event (void)
                   is telling us to drop that list and use this one
                   instead.  */
                clear_breakpoint_conditions_and_commands (bp);
-               process_point_options (bp, &dataptr);
+               const char *options = dataptr;
+               process_point_options (bp, &options);
              }
          }
        else
@@ -4382,13 +4359,10 @@ process_serial_event (void)
 
     case 'T':
       {
-       ptid_t gdb_id, thread_id;
-
-       require_running (own_buf);
+       require_running_or_break (own_buf);
 
-       gdb_id = read_ptid (&own_buf[1], NULL);
-       thread_id = gdb_id_to_thread_id (gdb_id);
-       if (ptid_equal (thread_id, null_ptid))
+       ptid_t thread_id = read_ptid (&own_buf[1], NULL);
+       if (find_thread_ptid (thread_id) == NULL)
          {
            write_enn (own_buf);
            break;
@@ -4484,7 +4458,7 @@ handle_serial_event (int err, gdb_client_data client_data)
 
   /* Be sure to not change the selected thread behind GDB's back.
      Important in the non-stop mode asynchronous protocol.  */
-  set_desired_thread (1);
+  set_desired_thread ();
 
   return 0;
 }
@@ -4579,7 +4553,7 @@ handle_target_event (int err, gdb_client_data client_data)
 
   /* Be sure to not change the selected thread behind GDB's back.
      Important in the non-stop mode asynchronous protocol.  */
-  set_desired_thread (1);
+  set_desired_thread ();
 
   return 0;
 }
This page took 0.035515 seconds and 4 git commands to generate.