Fix watchpoint-stops-at-right-insn.exp
[deliverable/binutils-gdb.git] / gdb / gdbserver / tracepoint.c
index 13b3ff60d84751766be40931bfa45b8608575b64..2e83d71aed29a2184e314d7239bb76ae7ed9ec72 100644 (file)
 #include "tracepoint.h"
 #include "gdbthread.h"
 #include "agent.h"
+#include "rsp-low.h"
 
 #include <ctype.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/time.h>
-#include <stddef.h>
 #include <inttypes.h>
 #include <stdint.h>
 
@@ -61,6 +61,8 @@
 
 */
 
+#ifdef IN_PROCESS_AGENT
+
 static void trace_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
 
 static void
@@ -81,6 +83,19 @@ trace_vdebug (const char *fmt, ...)
       trace_vdebug ((fmt), ##args);            \
   } while (0)
 
+#else
+
+#define trace_debug_1(level, fmt, args...)     \
+  do {                                         \
+    if (level <= debug_threads)                        \
+      {                                                \
+       debug_printf ((fmt), ##args);           \
+       debug_printf ("\n");                    \
+      }                                                \
+  } while (0)
+
+#endif
+
 #define trace_debug(FMT, args...)              \
   trace_debug_1 (1, FMT, ##args)
 
@@ -338,7 +353,7 @@ tracepoint_look_up_symbols (void)
       if (look_up_one_symbol (symbol_list[i].name, addrp, 1) == 0)
        {
          if (debug_threads)
-           fprintf (stderr, "symbol `%s' not found\n", symbol_list[i].name);
+           debug_printf ("symbol `%s' not found\n", symbol_list[i].name);
          return;
        }
     }
@@ -2692,7 +2707,7 @@ cmd_qtdpsrc (char *own_buf)
   packet = unpack_varlen_hex (packet, &slen);
   ++packet; /* skip a colon */
   src = xmalloc (slen + 1);
-  nbytes = unhexify (src, packet, strlen (packet) / 2);
+  nbytes = hex2bin (packet, (gdb_byte *) src, strlen (packet) / 2);
   src[nbytes] = '\0';
 
   newlast = xmalloc (sizeof (struct source_string));
@@ -2734,7 +2749,7 @@ cmd_qtdv (char *own_buf)
 
   nbytes = strlen (packet) / 2;
   varname = xmalloc (nbytes + 1);
-  nbytes = unhexify (varname, packet, nbytes);
+  nbytes = hex2bin (packet, (gdb_byte *) varname, nbytes);
   varname[nbytes] = '\0';
 
   tsv = create_trace_state_variable (num, 1);
@@ -2927,7 +2942,10 @@ get_jump_space_head (void)
     {
       if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_jump_pad_buffer,
                                      &gdb_jump_pad_head))
-       fatal ("error extracting jump_pad_buffer");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "error extracting jump_pad_buffer");
+       }
     }
 
   return gdb_jump_pad_head;
@@ -2958,15 +2976,15 @@ claim_trampoline_space (ULONGEST used, CORE_ADDR *trampoline)
       if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer,
                                      &trampoline_buffer_tail))
        {
-         fatal ("error extracting trampoline_buffer");
-         return 0;
+         internal_error (__FILE__, __LINE__,
+                         "error extracting trampoline_buffer");
        }
 
       if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer_end,
                                      &trampoline_buffer_head))
        {
-         fatal ("error extracting trampoline_buffer_end");
-         return 0;
+         internal_error (__FILE__, __LINE__,
+                         "error extracting trampoline_buffer_end");
        }
     }
 
@@ -3001,8 +3019,8 @@ have_fast_tracepoint_trampoline_buffer (char *buf)
   if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer_end,
                                  &trampoline_end))
     {
-      fatal ("error extracting trampoline_buffer_end");
-      return 0;
+      internal_error (__FILE__, __LINE__,
+                     "error extracting trampoline_buffer_end");
     }
   
   if (buf)
@@ -3012,8 +3030,8 @@ have_fast_tracepoint_trampoline_buffer (char *buf)
       if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer_error,
                                  &errbuf))
        {
-         fatal ("error extracting errbuf");
-         return 0;
+         internal_error (__FILE__, __LINE__,
+                         "error extracting errbuf");
        }
 
       read_inferior_memory (errbuf, (unsigned char *) buf, 100);
@@ -3355,14 +3373,25 @@ cmd_qtstart (char *packet)
   if (agent_loaded_p ())
     {
       if (write_inferior_integer (ipa_sym_addrs.addr_tracing, 1))
-       fatal ("Error setting tracing variable in lib");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "Error setting tracing variable in lib");
+       }
 
       if (write_inferior_data_pointer (ipa_sym_addrs.addr_stopping_tracepoint,
                                       0))
-       fatal ("Error clearing stopping_tracepoint variable in lib");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "Error clearing stopping_tracepoint variable"
+                         " in lib");
+       }
 
       if (write_inferior_integer (ipa_sym_addrs.addr_trace_buffer_is_full, 0))
-       fatal ("Error clearing trace_buffer_is_full variable in lib");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "Error clearing trace_buffer_is_full variable"
+                         " in lib");
+       }
 
       stop_tracing_bkpt = set_breakpoint_at (ipa_sym_addrs.addr_stop_tracing,
                                             stop_tracing_handler);
@@ -3414,7 +3443,10 @@ stop_tracing (void)
   if (agent_loaded_p ())
     {
       if (write_inferior_integer (ipa_sym_addrs.addr_tracing, 0))
-       fatal ("Error clearing tracing variable in lib");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "Error clearing tracing variable in lib");
+       }
     }
 
   tracing_stop_time = get_timestamp ();
@@ -3607,17 +3639,17 @@ cmd_qtstatus (char *packet)
   str = (tracing_user_name ? tracing_user_name : "");
   slen = strlen (str);
   buf1 = (char *) alloca (slen * 2 + 1);
-  hexify (buf1, str, slen);
+  bin2hex ((gdb_byte *) str, buf1, slen);
 
   str = (tracing_notes ? tracing_notes : "");
   slen = strlen (str);
   buf2 = (char *) alloca (slen * 2 + 1);
-  hexify (buf2, str, slen);
+  bin2hex ((gdb_byte *) str, buf2, slen);
 
   str = (tracing_stop_note ? tracing_stop_note : "");
   slen = strlen (str);
   buf3 = (char *) alloca (slen * 2 + 1);
-  hexify (buf3, str, slen);
+  bin2hex ((gdb_byte *) str, buf3, slen);
 
   trace_debug ("Returning trace status as %d, stop reason %s",
               tracing, tracing_stop_reason);
@@ -3647,7 +3679,7 @@ cmd_qtstatus (char *packet)
       p = stop_reason_rsp = alloca (strlen ("terror:") + hexstr_len + 1);
       strcpy (p, "terror:");
       p += strlen (p);
-      convert_int_to_ascii ((gdb_byte *) result_name, p, strlen (result_name));
+      bin2hex ((gdb_byte *) result_name, p, strlen (result_name));
     }
 
   /* If this was a forced stop, include any stop note that was supplied.  */
@@ -3766,7 +3798,7 @@ response_source (char *packet,
 
   len = strlen (src->str);
   buf = alloca (len * 2 + 1);
-  convert_int_to_ascii ((gdb_byte *) src->str, buf, len);
+  bin2hex ((gdb_byte *) src->str, buf, len);
 
   sprintf (packet, "Z%x:%s:%s:%x:%x:%s",
           tpoint->number, paddress (tpoint->address),
@@ -3855,7 +3887,7 @@ response_tsv (char *packet, struct trace_state_variable *tsv)
     {
       namelen = strlen (tsv->name);
       buf = alloca (namelen * 2 + 1);
-      convert_int_to_ascii ((gdb_byte *) tsv->name, buf, namelen);
+      bin2hex ((gdb_byte *) tsv->name, buf, namelen);
     }
 
   sprintf (packet, "%x:%s:%x:%s", tsv->number, phex_nz (tsv->initial_value, 0),
@@ -3927,6 +3959,17 @@ cmd_qtstmat (char *packet)
     run_inferior_command (packet, strlen (packet) + 1);
 }
 
+/* Helper for gdb_agent_about_to_close.
+   Return non-zero if thread ENTRY is in the same process in DATA.  */
+
+static int
+same_process_p (struct inferior_list_entry *entry, void *data)
+{
+  int *pid = data;
+
+  return ptid_get_pid (entry->id) == *pid;
+}
+
 /* Sent the agent a command to close it.  */
 
 void
@@ -3937,19 +3980,12 @@ gdb_agent_about_to_close (int pid)
   if (!maybe_write_ipa_not_loaded (buf))
     {
       struct thread_info *save_inferior;
-      struct inferior_list_entry *inf = all_threads.head;
 
       save_inferior = current_inferior;
 
-      /* Find a certain thread which belongs to process PID.  */
-      while (inf != NULL)
-       {
-         if (ptid_get_pid (inf->id) == pid)
-           break;
-         inf = inf->next;
-       }
-
-      current_inferior = (struct thread_info *) inf;
+      /* Find any thread which belongs to process PID.  */
+      current_inferior = (struct thread_info *)
+       find_inferior (&all_threads, same_process_p, &pid);
 
       strcpy (buf, "close");
 
@@ -4025,7 +4061,7 @@ cmd_qtbuffer (char *own_buf)
   if (num >= (PBUFSIZ - 16) / 2 )
     num = (PBUFSIZ - 16) / 2;
 
-  convert_int_to_ascii (tbp, own_buf, num);
+  bin2hex (tbp, own_buf, num);
 }
 
 static void
@@ -4092,7 +4128,7 @@ cmd_qtnotes (char *own_buf)
          packet = strchr (packet, ';');
          nbytes = (packet - saved) / 2;
          user = xmalloc (nbytes + 1);
-         nbytes = unhexify (user, saved, nbytes);
+         nbytes = hex2bin (saved, (gdb_byte *) user, nbytes);
          user[nbytes] = '\0';
          ++packet; /* skip the semicolon */
          trace_debug ("User is '%s'", user);
@@ -4106,7 +4142,7 @@ cmd_qtnotes (char *own_buf)
          packet = strchr (packet, ';');
          nbytes = (packet - saved) / 2;
          notes = xmalloc (nbytes + 1);
-         nbytes = unhexify (notes, saved, nbytes);
+         nbytes = hex2bin (saved, (gdb_byte *) notes, nbytes);
          notes[nbytes] = '\0';
          ++packet; /* skip the semicolon */
          trace_debug ("Notes is '%s'", notes);
@@ -4120,7 +4156,7 @@ cmd_qtnotes (char *own_buf)
          packet = strchr (packet, ';');
          nbytes = (packet - saved) / 2;
          stopnote = xmalloc (nbytes + 1);
-         nbytes = unhexify (stopnote, saved, nbytes);
+         nbytes = hex2bin (saved, (gdb_byte *) stopnote, nbytes);
          stopnote[nbytes] = '\0';
          ++packet; /* skip the semicolon */
          trace_debug ("tstop note is '%s'", stopnote);
@@ -5588,17 +5624,29 @@ fast_tracepoint_collecting (CORE_ADDR thread_area,
 
   if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_jump_pad_buffer,
                                  &ipa_gdb_jump_pad_buffer))
-    fatal ("error extracting `gdb_jump_pad_buffer'");
+    {
+      internal_error (__FILE__, __LINE__,
+                     "error extracting `gdb_jump_pad_buffer'");
+    }
   if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_jump_pad_buffer_end,
                                  &ipa_gdb_jump_pad_buffer_end))
-    fatal ("error extracting `gdb_jump_pad_buffer_end'");
+    {
+      internal_error (__FILE__, __LINE__,
+                     "error extracting `gdb_jump_pad_buffer_end'");
+    }
 
   if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer,
                                  &ipa_gdb_trampoline_buffer))
-    fatal ("error extracting `gdb_trampoline_buffer'");
+    {
+      internal_error (__FILE__, __LINE__,
+                     "error extracting `gdb_trampoline_buffer'");
+    }
   if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_trampoline_buffer_end,
                                  &ipa_gdb_trampoline_buffer_end))
-    fatal ("error extracting `gdb_trampoline_buffer_end'");
+    {
+      internal_error (__FILE__, __LINE__,
+                     "error extracting `gdb_trampoline_buffer_end'");
+    }
 
   if (ipa_gdb_jump_pad_buffer <= stop_pc
       && stop_pc < ipa_gdb_jump_pad_buffer_end)
@@ -5918,7 +5966,10 @@ target_malloc (ULONGEST size)
       /* We have the pointer *address*, need what it points to.  */
       if (read_inferior_data_pointer (ipa_sym_addrs.addr_gdb_tp_heap_buffer,
                                      &target_tp_heap))
-       fatal ("could get target heap head pointer");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "couldn't get target heap head pointer");
+       }
     }
 
   ptr = target_tp_heap;
@@ -6142,7 +6193,10 @@ download_tracepoint (struct tracepoint *tpoint)
       if (read_inferior_data_pointer (tp_prev->obj_addr_on_target
                                      + offsetof (struct tracepoint, next),
                                      &tp_prev_target_next_addr))
-       fatal ("error reading `tp_prev->next'");
+       {
+         internal_error (__FILE__, __LINE__,
+                         "error reading `tp_prev->next'");
+       }
 
       /* tpoint->next = tp_prev->next */
       write_inferior_data_ptr (tpoint->obj_addr_on_target
@@ -6219,10 +6273,7 @@ download_trace_state_variables (void)
                                   name_addr);
        }
 
-      if (tsv->getter != NULL)
-       {
-         fatal ("what to do with these?");
-       }
+      gdb_assert (tsv->getter == NULL);
     }
 
   if (prev_ptr != 0)
@@ -6395,9 +6446,13 @@ upload_fast_traceframes (void)
        error ("Uploading: couldn't read traceframe at %s\n", paddress (tf));
 
       if (ipa_tframe.tpnum == 0)
-       fatal ("Uploading: No (more) fast traceframes, but "
-              "ipa_traceframe_count == %u??\n",
-              ipa_traceframe_write_count - ipa_traceframe_read_count);
+       {
+         internal_error (__FILE__, __LINE__,
+                         "Uploading: No (more) fast traceframes, but"
+                         " ipa_traceframe_count == %u??\n",
+                         ipa_traceframe_write_count
+                         - ipa_traceframe_read_count);
+       }
 
       /* Note that this will be incorrect for multi-location
         tracepoints...  */
@@ -6914,7 +6969,7 @@ cstr_to_hexstr (const char *str)
 {
   int len = strlen (str);
   char *hexstr = xmalloc (len * 2 + 1);
-  convert_int_to_ascii ((gdb_byte *) str, hexstr, len);
+  bin2hex ((gdb_byte *) str, hexstr, len);
   return hexstr;
 }
 
@@ -7090,7 +7145,6 @@ gdb_ust_init (void)
 #endif /* HAVE_UST */
 
 #include <sys/syscall.h>
-#include <stdlib.h>
 
 static void
 gdb_agent_remove_socket (void)
@@ -7236,7 +7290,7 @@ gdb_agent_init (void)
   sigfillset (&new_mask);
   res = pthread_sigmask (SIG_SETMASK, &new_mask, &orig_mask);
   if (res)
-    fatal ("pthread_sigmask (1) failed: %s", strerror (res));
+    perror_with_name ("pthread_sigmask (1)");
 
   res = pthread_create (&thread,
                        NULL,
@@ -7245,7 +7299,7 @@ gdb_agent_init (void)
 
   res = pthread_sigmask (SIG_SETMASK, &orig_mask, NULL);
   if (res)
-    fatal ("pthread_sigmask (2) failed: %s", strerror (res));
+    perror_with_name ("pthread_sigmask (2)");
 
   while (helper_thread_id == 0)
     usleep (1);
@@ -7326,7 +7380,7 @@ initialize_tracepoint (void)
 
     pagesize = sysconf (_SC_PAGE_SIZE);
     if (pagesize == -1)
-      fatal ("sysconf");
+      perror_with_name ("sysconf");
 
     gdb_tp_heap_buffer = xmalloc (5 * 1024 * 1024);
 
@@ -7345,9 +7399,7 @@ initialize_tracepoint (void)
       }
 
     if (addr == 0)
-      fatal ("\
-initialize_tracepoint: mmap'ing jump pad buffer failed with %s",
-            strerror (errno));
+      perror_with_name ("mmap");
 
     gdb_jump_pad_buffer_end = gdb_jump_pad_buffer + pagesize * SCRATCH_BUFFER_NPAGES;
   }
This page took 0.030375 seconds and 4 git commands to generate.