153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Main code for remote server for GDB.
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003,
353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   2004, 2005, 2006, 2011
453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Free Software Foundation, Inc.
553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   This file is part of GDB.
753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   It has been modified to integrate it in valgrind
853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   This program is free software; you can redistribute it and/or modify
1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   it under the terms of the GNU General Public License as published by
1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   the Free Software Foundation; either version 2 of the License, or
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   (at your option) any later version.
1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   This program is distributed in the hope that it will be useful,
1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   but WITHOUT ANY WARRANTY; without even the implied warranty of
1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   GNU General Public License for more details.
1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   You should have received a copy of the GNU General Public License
2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   along with this program; if not, write to the Free Software
2153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Foundation, Inc., 51 Franklin Street, Fifth Floor,
2253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Boston, MA 02110-1301, USA.  */
2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "server.h"
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "regdef.h"
2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_options.h"
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_translate.h"
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_mallocfree.h"
2953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_initimg.h"
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_execontext.h"
3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_syswrap.h"      // VG_(show_open_fds)
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_scheduler.h"
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_transtab.h"
3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_debuginfo.h"
3553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "pub_core_addrinfo.h"
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long cont_thread;
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long general_thread;
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long step_thread;
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long thread_from_wait;
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrallunsigned long old_thread_from_wait;
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint pass_signals[TARGET_SIGNAL_LAST]; /* indexed by gdb signal nr */
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* for a gdbserver integrated in valgrind, resuming the process consists
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   in returning the control to valgrind.
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   The guess process resumes its execution.
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Then at the next error or break or ..., valgrind calls gdbserver again.
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   A resume reply packet must then be built to inform GDB that the
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   resume request is finished.
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   resume_reply_packet_needed records the fact that the next call to gdbserver
5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   must send a resume packet to gdb. */
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool resume_reply_packet_needed = False;
5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5553f17a9db278d33517d9888dd77848f554522a38JP AbgrallVG_MINIMAL_JMP_BUF(toplevel);
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Decode a qXfer read request.  Return 0 if everything looks OK,
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   or -1 otherwise.  */
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic
6153f17a9db278d33517d9888dd77848f554522a38JP Abgrallint decode_xfer_read (char *buf, const char **annex, CORE_ADDR *ofs, unsigned int *len)
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   /* Extract and NUL-terminate the annex.  */
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   *annex = buf;
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   while (*buf && *buf != ':')
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      buf++;
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   if (*buf == '\0')
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      return -1;
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   *buf++ = 0;
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   /* After the read/write marker and annex, qXfer looks like a
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      traditional 'm' packet.  */
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   decode_m_packet (buf, ofs, len);
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   return 0;
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* Write the response to a successful qXfer read.  Returns the
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   length of the (binary) data stored in BUF, corresponding
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   to as much of DATA/LEN as we could fit.  IS_MORE controls
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   the first character of the response.  */
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrallint write_qxfer_response (char *buf, unsigned char *data, int len, int is_more)
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   int out_len;
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   if (is_more)
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      buf[0] = 'm';
8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   else
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      buf[0] = 'l';
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len,
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                PBUFSIZ - POVERHSIZ - 1) + 1;
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool initial_valgrind_sink_saved = False;
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* True <=> valgrind log sink saved in initial_valgrind_sink */
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic OutputSink initial_valgrind_sink;
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic Bool command_output_to_log = False;
10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* True <=> command output goes to log instead of gdb */
10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid reset_valgrind_sink(const char *info)
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   if (VG_(log_output_sink).fd != initial_valgrind_sink.fd
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall       && initial_valgrind_sink_saved) {
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(log_output_sink).fd = initial_valgrind_sink.fd;
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(umsg) ("Reset valgrind output to log (%s)\n",
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 (info = NULL ? "" : info));
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   }
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid print_to_initial_valgrind_sink (const char *msg)
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   vg_assert (initial_valgrind_sink_saved);
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(write) (initial_valgrind_sink.fd, msg, strlen(msg));
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid kill_request (const char *msg)
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(umsg) ("%s", msg);
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(exit) (0);
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall// s is a NULL terminated string made of O or more words (separated by spaces).
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall// Returns a pointer to the Nth word in s.
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall// If Nth word does not exist, return a pointer to the last (0) byte of s.
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst char *wordn (const char *s, int n)
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   int word_seen = 0;
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Bool searching_word = True;
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   while (*s) {
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall      if (*s == ' ')
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         searching_word = True;
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall      else {
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         if (searching_word) {
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            searching_word = False;
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            word_seen++;
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            if (word_seen == n)
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall               return s;
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         }
14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      }
14753f17a9db278d33517d9888dd77848f554522a38JP Abgrall      s++;
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   }
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   return s;
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid VG_(print_all_stats) (Bool memory_stats, Bool tool_stats)
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   if (memory_stats) {
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(message)(Vg_DebugMsg, "\n");
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(message)(Vg_DebugMsg,
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         "------ Valgrind's internal memory use stats follow ------\n" );
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(sanity_check_malloc_all)();
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(message)(Vg_DebugMsg, "------\n" );
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(print_all_arena_stats)();
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall      if (VG_(clo_profile_heap))
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(print_arena_cc_analysis) ();
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(message)(Vg_DebugMsg, "\n");
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   }
16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(print_translation_stats)();
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(print_tt_tc_stats)();
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(print_scheduler_stats)();
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(print_ExeContext_stats)( False /* with_stacktraces */ );
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   VG_(print_errormgr_stats)();
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   if (tool_stats && VG_(needs).print_stats) {
17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_TDICT_CALL(tool_print_stats);
17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall   }
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* handle_gdb_valgrind_command handles the provided mon string command.
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   If command is recognised, return 1 else return 0.
17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   Note that in case of ambiguous command, 1 is returned.
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   *sink_wanted_at_return is modified if one of the commands
18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   'v.set *_output' is handled.
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall*/
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrallint handle_gdb_valgrind_command (char *mon, OutputSink *sink_wanted_at_return)
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   UWord ret = 0;
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   char s[strlen(mon)+1]; /* copy for strtok_r */
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   char *wcmd;
18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   HChar *ssaveptr;
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall   const char *endptr;
19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   int   kwdid;
19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   int int_value;
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   vg_assert (initial_valgrind_sink_saved);
19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall   strcpy (s, mon);
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   wcmd = strtok_r (s, " ", &ssaveptr);
19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall   /* NB: if possible, avoid introducing a new command below which
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall      starts with the same 3 first letters as an already existing
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      command. This ensures a shorter abbreviation for the user. */
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall   switch (VG_(keyword_id) ("help v.set v.info v.wait v.kill v.translate"
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                            " v.do",
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                            wcmd, kwd_report_duplicated_matches)) {
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall   case -2:
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall      ret = 1;
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      break;
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall   case -1:
20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      break;
20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall   case  0: /* help */
21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      ret = 1;
21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall      wcmd = strtok_r (NULL, " ", &ssaveptr);
21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      if (wcmd == NULL) {
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         int_value = 0;
21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall      } else {
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         switch (VG_(keyword_id) ("debug", wcmd, kwd_report_all)) {
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall         case -2: int_value = 0; break;
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         case -1: int_value = 0; break;
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         case  0: int_value = 1; break;
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         default: tl_assert (0);
22053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         }
22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall      }
22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      VG_(gdb_printf) (
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"general valgrind monitor commands:\n"
22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  help [debug]            : monitor command help. With debug: + debugging commands\n"
22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.wait [<ms>]           : sleep <ms> (default 0) then continue\n"
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info all_errors       : show all errors found so far\n"
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info last_error       : show last error found\n"
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info location <addr>  : show information about location <addr>\n"
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info n_errs_found [msg] : show the nr of errors found so far and the given msg\n"
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info open_fds         : show open file descriptors (only if --track-fds=yes)\n"
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.kill                  : kill the Valgrind process\n"
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set gdb_output        : set valgrind output to gdb\n"
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set log_output        : set valgrind output to log\n"
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set mixed_output      : set valgrind output to log, interactive output to gdb\n"
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set merge-recursive-frames <num> : merge recursive calls in max <num> frames\n"
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set vgdb-error <errornr> : debug me at error >= <errornr> \n");
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      if (int_value) { VG_(gdb_printf) (
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall"debugging valgrind internals monitor commands:\n"
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.do   expensive_sanity_check_general : do an expensive sanity check now\n"
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info gdbserver_status : show gdbserver status\n"
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info memory [aspacemgr] : show valgrind heap memory stats\n"
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall"     (with aspacemgr arg, also shows valgrind segments on log ouput)\n"
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info exectxt          : show stacktraces and stats of all execontexts\n"
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info scheduler        : show valgrind thread state and stacktrace\n"
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.info stats            : show various valgrind and tool stats\n"
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set debuglog <level>  : set valgrind debug log level to <level>\n"
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.set hostvisibility [yes*|no] : (en/dis)ables access by gdb/gdbserver to\n"
24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall"    Valgrind internal host status/memory\n"
25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall"  v.translate <addr> [<traceflags>]  : debug translation of <addr> with <traceflags>\n"
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall"    (default traceflags 0b00100000 : show after instrumentation)\n"
25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"   An additional flag  0b100000000 allows to show gdbserver instrumentation\n");
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      }
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall      break;
25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall   case  1: /* v.set */
25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      ret = 1;
25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall      wcmd = strtok_r (NULL, " ", &ssaveptr);
25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      switch (kwdid = VG_(keyword_id)
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall              ("vgdb-error debuglog merge-recursive-frames"
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall               " gdb_output log_output mixed_output hostvisibility ",
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall               wcmd, kwd_report_all)) {
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case -2:
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case -1:
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 0: /* vgdb-error */
26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 1: /* debuglog */
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 2: /* merge-recursive-frames */
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         wcmd = strtok_r (NULL, " ", &ssaveptr);
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         if (wcmd == NULL) {
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            int_value = 0;
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            endptr = "empty"; /* to report an error below */
27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else {
27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            HChar *the_end;
27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            int_value = strtol (wcmd, &the_end, 10);
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            endptr = the_end;
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall         }
27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         if (*endptr != '\0') {
27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(gdb_printf) ("missing or malformed integer value\n");
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else if (kwdid == 0) {
28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(printf) ("vgdb-error value changed from %d to %d\n",
28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                             VG_(dyn_vgdb_error), int_value);
28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(dyn_vgdb_error) = int_value;
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else if (kwdid == 1) {
28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(printf) ("debuglog value changed from %d to %d\n",
28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                             VG_(debugLog_getLevel)(), int_value);
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(debugLog_startup) (int_value, "gdbsrv");
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else if (kwdid == 2) {
28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(printf)
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ("merge-recursive-frames value changed from %d to %d\n",
29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                VG_(clo_merge_recursive_frames), int_value);
29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(clo_merge_recursive_frames) = int_value;
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else {
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall            vg_assert (0);
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         }
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 3: /* gdb_output */
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         (*sink_wanted_at_return).fd = -2;
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         command_output_to_log = False;
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(gdb_printf) ("valgrind output will go to gdb\n");
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 4: /* log_output */
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         (*sink_wanted_at_return).fd = initial_valgrind_sink.fd;
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         command_output_to_log = True;
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(gdb_printf) ("valgrind output will go to log\n");
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 5: /* mixed output */
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         (*sink_wanted_at_return).fd = initial_valgrind_sink.fd;
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         command_output_to_log = False;
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(gdb_printf)
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            ("valgrind output will go to log, interactive output will go to gdb\n");
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 6: /* hostvisibility */
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         wcmd = strtok_r (NULL, " ", &ssaveptr);
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         if (wcmd != NULL) {
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            switch (VG_(keyword_id) ("yes no", wcmd, kwd_report_all)) {
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall            case -2:
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            case -1: break;
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall            case  0:
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall               hostvisibility = True;
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall               break;
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall            case 1:
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall               hostvisibility = False;
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall               break;
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall            default: tl_assert (0);
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            }
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall         } else {
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            hostvisibility = True;
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         }
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         if (hostvisibility)
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(gdb_printf)
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ("Enabled access to Valgrind memory/status by GDB\n"
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                "If not yet done, tell GDB which valgrind file(s) to use:\n"
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                "add-symbol-file <tool or preloaded file> <loadaddr>\n");
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         else
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall            VG_(gdb_printf)
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall               ("Disabled access to Valgrind memory/status by GDB\n");
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall      default:
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         vg_assert (0);
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      }
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall      break;
34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall   case  2: /* v.info */ {
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      ret = 1;
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall      wcmd = strtok_r (NULL, " ", &ssaveptr);
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall      switch (kwdid = VG_(keyword_id)
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall              ("all_errors n_errs_found last_error gdbserver_status memory"
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall               " scheduler stats open_fds exectxt location",
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall               wcmd, kwd_report_all)) {
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case -2:
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case -1:
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 0: // all_errors
35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         // A verbosity of minimum 2 is needed to show the errors.
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(show_all_errors)(/* verbosity */ 2, /* xml */ False);
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case  1: // n_errs_found
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(printf) ("n_errs_found %d n_errs_shown %d (vgdb-error %d) %s\n",
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                      VG_(get_n_errs_found) (),
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                      VG_(get_n_errs_shown) (),
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                      VG_(dyn_vgdb_error),
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                      wordn (mon, 3));
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case 2: // last_error
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(show_last_error)();
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall      case  3: // gdbserver_status
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         VG_(gdbserver_status_output)();
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         break;
369      case  4: /* memory */
370         VG_(printf) ("%llu bytes have already been allocated.\n",
371                      VG_(am_get_anonsize_total)());
372         VG_(print_all_arena_stats) ();
373         if (VG_(clo_profile_heap))
374            VG_(print_arena_cc_analysis) ();
375         wcmd = strtok_r (NULL, " ", &ssaveptr);
376         if (wcmd != NULL) {
377            switch (VG_(keyword_id) ("aspacemgr", wcmd, kwd_report_all)) {
378            case -2:
379            case -1: break;
380            case  0:
381               VG_(am_show_nsegments) (0, "gdbserver v.info memory aspacemgr");
382               break;
383            default: tl_assert (0);
384            }
385         }
386
387         ret = 1;
388         break;
389      case  5: /* scheduler */
390         VG_(show_sched_status) (True,  // host_stacktrace
391                                 True,  // valgrind_stack_usage
392                                 True); // exited_threads
393         ret = 1;
394         break;
395      case  6: /* stats */
396         VG_(print_all_stats)(False, /* Memory stats */
397                              True   /* Tool stats */);
398         ret = 1;
399         break;
400      case  7: /* open_fds */
401         if (VG_(clo_track_fds))
402            VG_(show_open_fds) ("");
403         else
404            VG_(gdb_printf)
405               ("Valgrind must be started with --track-fds=yes"
406                " to show open fds\n");
407         ret = 1;
408         break;
409      case  8: /* exectxt */
410         VG_(print_ExeContext_stats) (True /* with_stacktraces */);
411         ret = 1;
412         break;
413      case  9: { /* location */
414         /* Note: we prefer 'v.info location' and not 'v.info address' as
415            v.info address is inconsistent with the GDB (native)
416            command 'info address' which gives the address for a symbol.
417            GDB equivalent command of 'v.info location' is 'info symbol'. */
418         Addr address;
419         SizeT dummy_sz = 0x1234;
420         if (VG_(strtok_get_address_and_size) (&address, &dummy_sz, &ssaveptr)) {
421            // If tool provides location information, use that.
422            if (VG_(needs).info_location) {
423               VG_TDICT_CALL(tool_info_location, address);
424            }
425            // If tool does not provide location information, use the common one.
426            // Also use the common to compare with tool when debug log is set.
427            if (!VG_(needs).info_location || VG_(debugLog_getLevel)() > 0 ) {
428               AddrInfo ai;
429               ai.tag = Addr_Undescribed;
430               VG_(describe_addr) (address, &ai);
431               VG_(pp_addrinfo) (address, &ai);
432               VG_(clear_addrinfo) (&ai);
433            }
434         }
435         ret = 1;
436         break;
437      }
438      default:
439         vg_assert(0);
440      }
441      break;
442   }
443   case  3: /* v.wait */
444      wcmd = strtok_r (NULL, " ", &ssaveptr);
445      if (wcmd != NULL) {
446         int_value = strtol (wcmd, NULL, 10);
447         VG_(printf) ("gdbserver: continuing in %d ms ...\n", int_value);
448         VG_(poll)(NULL, 0, int_value);
449      }
450      VG_(printf) ("gdbserver: continuing after wait ...\n");
451      ret = 1;
452      break;
453   case  4: /* v.kill */
454      kill_request ("monitor command request to kill this process\n");
455      break;
456   case  5: { /* v.translate */
457      Addr address;
458      SizeT verbosity = 0x20;
459
460      ret = 1;
461
462      if (VG_(strtok_get_address_and_size) (&address, &verbosity, &ssaveptr)) {
463         /* we need to force the output to log for the translation trace,
464            as low level VEX tracing cannot be redirected to gdb. */
465         int saved_command_output_to_log = command_output_to_log;
466         int saved_fd = VG_(log_output_sink).fd;
467         Bool single_stepping_on_entry = valgrind_single_stepping();
468         int vex_verbosity = verbosity & 0xff;
469         VG_(log_output_sink).fd = initial_valgrind_sink.fd;
470         if ((verbosity & 0x100) && !single_stepping_on_entry) {
471            valgrind_set_single_stepping(True);
472            // to force gdbserver instrumentation.
473         }
474#        if defined(VGA_arm)
475         // on arm, we need to (potentially) convert this address
476         // to the thumb form.
477         address = thumb_pc (address);
478#        endif
479
480         VG_(translate) ( 0 /* dummy ThreadId; irrelevant due to debugging*/,
481                          address,
482                          /*debugging*/True,
483                          (Int) vex_verbosity,
484                          /*bbs_done*/0,
485                          /*allow redir?*/True);
486         if ((verbosity & 0x100) && !single_stepping_on_entry) {
487            valgrind_set_single_stepping(False);
488            // reset single stepping.
489         }
490         command_output_to_log = saved_command_output_to_log;
491         VG_(log_output_sink).fd = saved_fd;
492      }
493      break;
494   }
495
496   case  6: /* v.do */
497      ret = 1;
498      wcmd = strtok_r (NULL, " ", &ssaveptr);
499      switch (VG_(keyword_id) ("expensive_sanity_check_general",
500                               wcmd, kwd_report_all)) {
501         case -2:
502         case -1: break;
503         case  0: { /* expensive_sanity_check_general */
504            // Temporarily bump up sanity level to check e.g. the malloc arenas.
505            const Int save_clo_sanity_level = VG_(clo_sanity_level);
506            if (VG_(clo_sanity_level) < 4) VG_(clo_sanity_level) = 4;
507            VG_(sanity_check_general) (/* force_expensive */ True);
508            VG_(clo_sanity_level) = save_clo_sanity_level;
509            break;
510         }
511         default: tl_assert (0);
512      }
513      break;
514
515   default:
516      vg_assert (0);
517   }
518   return ret;
519}
520
521/* handle_gdb_monitor_command handles the provided mon string command,
522   which can be either a "standard" valgrind monitor command
523   or a tool specific monitor command.
524   If command recognised, return 1 else return 0.
525   Note that in case of ambiguous command, 1 is returned.
526*/
527static
528int handle_gdb_monitor_command (char *mon)
529{
530   UWord ret = 0;
531   UWord tool_ret = 0;
532   // initially, we assume that when returning, the desired sink is the
533   // one we have when entering. It can however be changed by the standard
534   // valgrind command handling.
535   OutputSink sink_wanted_at_return = VG_(log_output_sink);
536
537   if (!initial_valgrind_sink_saved) {
538      /* first time we enter here, we save the valgrind default log sink */
539      initial_valgrind_sink = sink_wanted_at_return;
540      initial_valgrind_sink_saved = True;
541   }
542
543   if (!command_output_to_log)
544      VG_(log_output_sink).fd = -2; /* redirect to monitor_output */
545
546   ret = handle_gdb_valgrind_command (mon, &sink_wanted_at_return);
547
548   /* Even if command was recognised by valgrind core, we call the
549      tool command handler : this is needed to handle help command
550      and/or to let the tool do some additional processing of a
551      valgrind standard command. Note however that if valgrind
552      recognised the command, we will always return success. */
553   if (VG_(needs).client_requests) {
554      /* If the tool reports an error when handling a monitor command,
555         we need to avoid calling gdbserver during this command
556         handling. So, we temporarily set VG_(dyn_vgdb_error) to
557         a huge value to ensure m_errormgr.c does not call gdbserver. */
558      Int save_dyn_vgdb_error = VG_(dyn_vgdb_error);
559      UWord arg[2];
560      VG_(dyn_vgdb_error) = 999999999;
561      arg[0] = (UWord) VG_USERREQ__GDB_MONITOR_COMMAND;
562      arg[1] = (UWord) mon;
563      VG_TDICT_CALL(tool_handle_client_request, VG_(running_tid), arg,
564                    &tool_ret);
565      VG_(dyn_vgdb_error) = save_dyn_vgdb_error;
566   }
567
568   VG_(message_flush) ();
569
570   /* restore or set the desired output */
571   VG_(log_output_sink).fd = sink_wanted_at_return.fd;
572   if (ret | tool_ret)
573      return 1;
574   else
575      return 0;
576}
577
578
579/* Handle all of the extended 'Q' packets.  */
580static
581void handle_set (char *arg_own_buf, int *new_packet_len_p)
582{
583   if (strcmp ("QStartNoAckMode", arg_own_buf) == 0) {
584      noack_mode = True;
585      write_ok (arg_own_buf);
586      return;
587   }
588
589   if (strncmp ("QPassSignals:", arg_own_buf, 13) == 0) {
590      int i;
591      char *from, *to;
592      char *end = arg_own_buf + strlen(arg_own_buf);
593      CORE_ADDR sig;
594      for (i = 0; i < TARGET_SIGNAL_LAST; i++)
595         pass_signals[i] = 0;
596
597      from = arg_own_buf + 13;
598      while (from < end) {
599         to = strchr(from, ';');
600         if (to == NULL) to = end;
601         decode_address (&sig, from, to - from);
602         pass_signals[(int)sig] = 1;
603         dlog(1, "pass_signal gdb_nr %d %s\n",
604              (int)sig, target_signal_to_name(sig));
605         from = to;
606         if (*from == ';') from++;
607      }
608      write_ok (arg_own_buf);
609      return;
610   }
611   /* Otherwise we didn't know what packet it was.  Say we didn't
612      understand it.  */
613   arg_own_buf[0] = 0;
614}
615
616Bool VG_(client_monitor_command) (HChar *cmd)
617{
618   const Bool connected = remote_connected();
619   const int saved_command_output_to_log = command_output_to_log;
620   Bool handled;
621
622   if (!connected)
623      command_output_to_log = True;
624   handled = handle_gdb_monitor_command (cmd);
625   if (!connected) {
626      // reset the log output unless cmd changed it.
627      if (command_output_to_log)
628         command_output_to_log = saved_command_output_to_log;
629   }
630   if (handled)
631      return False; // recognised
632   else
633      return True; // not recognised
634}
635
636/* Handle all of the extended 'q' packets.  */
637static
638void handle_query (char *arg_own_buf, int *new_packet_len_p)
639{
640   static struct inferior_list_entry *thread_ptr;
641
642   /* qRcmd, monitor command handling.  */
643   if (strncmp ("qRcmd,", arg_own_buf, 6) == 0) {
644      char *p = arg_own_buf + 6;
645      int cmdlen = strlen(p)/2;
646      char cmd[cmdlen+1];
647
648      if (unhexify (cmd, p, cmdlen) != cmdlen) {
649         write_enn (arg_own_buf);
650         return;
651      }
652      cmd[cmdlen] = '\0';
653
654      if (handle_gdb_monitor_command (cmd)) {
655         write_ok (arg_own_buf);
656         return;
657      } else {
658         /* cmd not recognised */
659         VG_(gdb_printf)
660            ("command '%s' not recognised\n"
661             "In gdb,     try 'monitor help'\n"
662             "In a shell, try 'vgdb help'\n",
663             cmd);
664         write_ok (arg_own_buf);
665         return;
666      }
667   }
668
669   /* provide some valgrind specific info in return to qThreadExtraInfo. */
670   if (strncmp ("qThreadExtraInfo,", arg_own_buf, 17) == 0) {
671      unsigned long gdb_id;
672      struct thread_info *ti;
673      ThreadState *tst;
674      char status[100];
675
676      gdb_id = strtoul (&arg_own_buf[17], NULL, 16);
677      ti = gdb_id_to_thread (gdb_id);
678      if (ti != NULL) {
679         tst = (ThreadState *) inferior_target_data (ti);
680         /* Additional info is the tid, the thread status and the thread's
681            name, if any. */
682         if (tst->thread_name) {
683            VG_(snprintf) (status, sizeof(status), "tid %d %s %s",
684                           tst->tid,
685                           VG_(name_of_ThreadStatus)(tst->status),
686                           tst->thread_name);
687         } else {
688            VG_(snprintf) (status, sizeof(status), "tid %d %s",
689                           tst->tid,
690                           VG_(name_of_ThreadStatus)(tst->status));
691         }
692         hexify (arg_own_buf, status, strlen(status));
693         return;
694      } else {
695         write_enn (arg_own_buf);
696         return;
697      }
698   }
699
700   if (strcmp ("qAttached", arg_own_buf) == 0) {
701      /* tell gdb to always detach, never kill the process */
702      arg_own_buf[0] = '1';
703      arg_own_buf[1] = 0;
704      return;
705   }
706
707   if (strcmp ("qSymbol::", arg_own_buf) == 0) {
708      /* We have no symbol to read. */
709      write_ok (arg_own_buf);
710      return;
711   }
712
713   if (strcmp ("qfThreadInfo", arg_own_buf) == 0) {
714      thread_ptr = all_threads.head;
715      VG_(sprintf) (arg_own_buf, "m%x",
716                    thread_to_gdb_id ((struct thread_info *)thread_ptr));
717      thread_ptr = thread_ptr->next;
718      return;
719   }
720
721   if (strcmp ("qsThreadInfo", arg_own_buf) == 0) {
722      if (thread_ptr != NULL) {
723         VG_(sprintf) (arg_own_buf, "m%x",
724                       thread_to_gdb_id ((struct thread_info *)thread_ptr));
725         thread_ptr = thread_ptr->next;
726         return;
727      } else {
728         VG_(sprintf) (arg_own_buf, "l");
729         return;
730      }
731   }
732
733   if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL
734        && strncmp ("qXfer:features:read:", arg_own_buf, 20) == 0) {
735      CORE_ADDR ofs;
736      unsigned int len, doc_len;
737      const char *annex = NULL;
738      // First, the annex is extracted from the packet received.
739      // Then, it is replaced by the corresponding file name.
740      int fd;
741
742      /* Grab the annex, offset, and length.  */
743      if (decode_xfer_read (arg_own_buf + 20, &annex, &ofs, &len) < 0) {
744         strcpy (arg_own_buf, "E00");
745         return;
746      }
747
748      if (strcmp (annex, "target.xml") == 0) {
749         annex = valgrind_target_xml(VG_(clo_vgdb_shadow_registers));
750         if (annex != NULL && VG_(clo_vgdb_shadow_registers)) {
751            /* Ensure the shadow registers are initialized. */
752            initialize_shadow_low(True);
753         }
754         if (annex == NULL) {
755            strcpy (arg_own_buf, "E00");
756            return;
757         }
758      }
759
760      {
761         char doc[VG_(strlen)(VG_(libdir)) + 1 + VG_(strlen)(annex) + 1];
762         struct vg_stat stat_doc;
763         char toread[len];
764         int len_read;
765
766         VG_(sprintf)(doc, "%s/%s", VG_(libdir), annex);
767         fd = VG_(fd_open) (doc, VKI_O_RDONLY, 0);
768         if (fd == -1) {
769            strcpy (arg_own_buf, "E00");
770            return;
771         }
772         if (VG_(fstat) (fd, &stat_doc) != 0) {
773            VG_(close) (fd);
774            strcpy (arg_own_buf, "E00");
775            return;
776         }
777         doc_len = stat_doc.size;
778
779         if (len > PBUFSIZ - POVERHSIZ)
780            len = PBUFSIZ - POVERHSIZ;
781
782         if (ofs > doc_len) {
783            write_enn (arg_own_buf);
784            VG_(close) (fd);
785            return;
786         }
787         VG_(lseek) (fd, ofs, VKI_SEEK_SET);
788         len_read = VG_(read) (fd, toread, len);
789         *new_packet_len_p = write_qxfer_response (arg_own_buf, (unsigned char *)toread,
790                                                   len_read, ofs + len_read < doc_len);
791         VG_(close) (fd);
792         return;
793      }
794   }
795
796   if (strncmp ("qXfer:auxv:read:", arg_own_buf, 16) == 0) {
797      unsigned char *data;
798      int n;
799      CORE_ADDR ofs;
800      unsigned int len;
801      const char *annex;
802
803      /* Reject any annex; grab the offset and length.  */
804      if (decode_xfer_read (arg_own_buf + 16, &annex, &ofs, &len) < 0
805          || annex[0] != '\0') {
806         strcpy (arg_own_buf, "E00");
807         return;
808      }
809
810      if (len > PBUFSIZ - 2)
811         len = PBUFSIZ - 2;
812      data = malloc (len);
813
814      {
815         UWord *client_auxv = VG_(client_auxv);
816         unsigned int client_auxv_len = 0;
817         while (*client_auxv != 0) {
818            dlog(4, "auxv %lld %llx\n",
819                 (ULong)*client_auxv,
820                 (ULong)*(client_auxv+1));
821            client_auxv++;
822            client_auxv++;
823            client_auxv_len += 2 * sizeof(UWord);
824         }
825         client_auxv_len += 2 * sizeof(UWord);
826         dlog(4, "auxv len %d\n", client_auxv_len);
827
828         if (ofs >= client_auxv_len)
829            n = -1;
830         else {
831            n = client_auxv_len - ofs;
832            VG_(memcpy) (data, (unsigned char *) VG_(client_auxv), n);
833         }
834      }
835
836      if (n < 0)
837         write_enn (arg_own_buf);
838      else if (n > len)
839         *new_packet_len_p = write_qxfer_response (arg_own_buf, data, len, 1);
840      else
841         *new_packet_len_p = write_qxfer_response (arg_own_buf, data, n, 0);
842
843      free (data);
844
845      return;
846   }
847
848
849   /* Protocol features query.  */
850   if (strncmp ("qSupported", arg_own_buf, 10) == 0
851       && (arg_own_buf[10] == ':' || arg_own_buf[10] == '\0')) {
852      VG_(sprintf) (arg_own_buf, "PacketSize=%x", PBUFSIZ - 1);
853      /* Note: max packet size including frame and checksum, but without
854         trailing null byte, which is not sent/received. */
855
856      strcat (arg_own_buf, ";QStartNoAckMode+");
857      strcat (arg_own_buf, ";QPassSignals+");
858      if (VG_(client_auxv))
859         strcat (arg_own_buf, ";qXfer:auxv:read+");
860
861      if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL) {
862         strcat (arg_own_buf, ";qXfer:features:read+");
863         /* if a new gdb connects to us, we have to reset the register
864            set to the normal register sets to allow this new gdb to
865            decide to use or not the shadow registers.
866
867            Note that the reset is only done for gdb that are sending
868            qSupported packets. If a user first connected with a recent
869            gdb using shadow registers and then with a very old gdb
870            that does not use qSupported packet, then the old gdb will
871            not properly connect. */
872         initialize_shadow_low(False);
873      }
874      return;
875   }
876
877   /* Otherwise we didn't know what packet it was.  Say we didn't
878      understand it.  */
879   arg_own_buf[0] = 0;
880}
881
882/* Handle all of the extended 'v' packets.  */
883static
884void handle_v_requests (char *arg_own_buf, char *status, int *zignal)
885{
886   /* vcont packet code from gdb 6.6 removed */
887
888   /* Otherwise we didn't know what packet it was.  Say we didn't
889      understand it.  */
890   arg_own_buf[0] = 0;
891   return;
892}
893
894static
895void myresume (int step, int sig)
896{
897   struct thread_resume resume_info[2];
898   int n = 0;
899
900   if (step || sig) {
901      resume_info[0].step = step;
902      resume_info[0].sig = sig;
903      n++;
904   }
905   resume_info[n].step = 0;
906   resume_info[n].sig = 0;
907
908   resume_reply_packet_needed = True;
909   valgrind_resume (resume_info);
910}
911
912/* server_main global variables */
913static char *own_buf;
914static unsigned char *mem_buf;
915
916void gdbserver_init (void)
917{
918   dlog(1, "gdbserver_init gdbserver embedded in valgrind: %s\n", version);
919   noack_mode = False;
920   valgrind_initialize_target ();
921   // After a fork, gdbserver_init can be called again.
922   // We do not have to re-malloc the buffers in such a case.
923   if (own_buf == NULL)
924      own_buf = malloc (PBUFSIZ+POVERHSIZ);
925   if (mem_buf == NULL)
926      mem_buf = malloc (PBUFSIZ+POVERHSIZ);
927   // Note: normally, we should only malloc PBUFSIZ. However,
928   // GDB has a bug, and in some cases, sends e.g. 'm' packets
929   // asking for slightly more than the PacketSize given at
930   // connection initialisation. So, we bypass the GDB bug
931   // by allocating slightly more.
932}
933
934void gdbserver_terminate (void)
935{
936   /* last call to gdbserver is cleanup call */
937   if (VG_MINIMAL_SETJMP(toplevel)) {
938      dlog(0, "error caused VG_MINIMAL_LONGJMP to gdbserver_terminate\n");
939      return;
940   }
941   remote_close();
942}
943
944void server_main (void)
945{
946   static char status;
947   static int zignal;
948
949   char ch;
950   int i = 0;
951   unsigned int len;
952   CORE_ADDR mem_addr;
953
954   zignal = valgrind_wait (&status);
955   if (VG_MINIMAL_SETJMP(toplevel)) {
956      dlog(0, "error caused VG_MINIMAL_LONGJMP to server_main\n");
957   }
958   while (1) {
959      unsigned char sig;
960      int packet_len;
961      int new_packet_len = -1;
962
963      if (resume_reply_packet_needed) {
964         /* Send the resume reply to reply to last GDB resume
965            request. */
966         resume_reply_packet_needed = False;
967         prepare_resume_reply (own_buf, status, zignal);
968         putpkt (own_buf);
969      }
970
971      /* If we our status is terminal (exit or fatal signal) get out
972         as quickly as we can. We won't be able to handle any request
973         anymore.  */
974      if (status == 'W' || status == 'X') {
975         return;
976      }
977
978      packet_len = getpkt (own_buf);
979      if (packet_len <= 0)
980         break;
981
982      i = 0;
983      ch = own_buf[i++];
984      switch (ch) {
985      case 'Q':
986         handle_set (own_buf, &new_packet_len);
987         break;
988      case 'q':
989         handle_query (own_buf, &new_packet_len);
990         break;
991      case 'd':
992         /* set/unset debugging is done through valgrind debug level. */
993         own_buf[0] = '\0';
994         break;
995      case 'D':
996         reset_valgrind_sink("gdb detaching from process");
997
998         /* When detaching or kill the process, gdb expects to get
999            an packet OK back.  Any other output will make gdb
1000            believes detach did not work. */
1001         write_ok (own_buf);
1002         putpkt (own_buf);
1003         remote_finish (reset_after_error);
1004         remote_open (VG_(clo_vgdb_prefix));
1005         myresume (0, 0);
1006         resume_reply_packet_needed = False;
1007         return;
1008      case '!':
1009         /* We can not use the extended protocol with valgrind,
1010            because we can not restart the running
1011            program.  So return unrecognized.  */
1012         own_buf[0] = '\0';
1013         break;
1014      case '?':
1015         prepare_resume_reply (own_buf, status, zignal);
1016         break;
1017      case 'H':
1018         if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') {
1019            unsigned long gdb_id, thread_id;
1020
1021            gdb_id = strtoul (&own_buf[2], NULL, 16);
1022            thread_id = gdb_id_to_thread_id (gdb_id);
1023            if (thread_id == 0) {
1024               write_enn (own_buf);
1025               break;
1026            }
1027
1028            if (own_buf[1] == 'g') {
1029               general_thread = thread_id;
1030               set_desired_inferior (1);
1031            } else if (own_buf[1] == 'c') {
1032               cont_thread = thread_id;
1033            } else if (own_buf[1] == 's') {
1034               step_thread = thread_id;
1035            }
1036
1037            write_ok (own_buf);
1038         } else {
1039            /* Silently ignore it so that gdb can extend the protocol
1040               without compatibility headaches.  */
1041            own_buf[0] = '\0';
1042         }
1043         break;
1044      case 'g':
1045         set_desired_inferior (1);
1046         registers_to_string (own_buf);
1047         break;
1048      case 'G':
1049         set_desired_inferior (1);
1050         registers_from_string (&own_buf[1]);
1051         write_ok (own_buf);
1052         break;
1053      case 'P': {
1054         int regno;
1055         char *regbytes;
1056         Bool mod;
1057         ThreadState *tst;
1058         regno = strtol(&own_buf[1], NULL, 16);
1059         regbytes = strchr(&own_buf[0], '=') + 1;
1060         set_desired_inferior (1);
1061         tst = (ThreadState *) inferior_target_data (current_inferior);
1062         /* Only accept changing registers in "runnable state3.
1063            In fact, it would be ok to change most of the registers
1064            except a few "sensitive" registers such as the PC, SP, BP.
1065            We assume we do not need to very specific here, and that we
1066            can just refuse all of these. */
1067         if (tst->status == VgTs_Runnable || tst->status == VgTs_Yielding) {
1068            supply_register_from_string (regno, regbytes, &mod);
1069            write_ok (own_buf);
1070         } else {
1071            /* at least from gdb 6.6 onwards, an E. error
1072               reply is shown to the user. So, we do an error
1073               msg which both is accepted by gdb as an error msg
1074               and is readable by the user. */
1075            VG_(sprintf)
1076               (own_buf,
1077"E.\n"
1078"ERROR changing register %s regno %d\n"
1079"gdb commands changing registers (pc, sp, ...) (e.g. 'jump',\n"
1080"set pc, calling from gdb a function in the debugged process, ...)\n"
1081"can only be accepted if the thread is VgTs_Runnable or VgTs_Yielding state\n"
1082"Thread status is %s\n",
1083                find_register_by_number (regno)->name, regno,
1084                VG_(name_of_ThreadStatus)(tst->status));
1085            if (VG_(clo_verbosity) > 1)
1086               VG_(umsg) ("%s\n", own_buf);
1087         }
1088         break;
1089      }
1090      case 'm':
1091         decode_m_packet (&own_buf[1], &mem_addr, &len);
1092         if (valgrind_read_memory (mem_addr, mem_buf, len) == 0)
1093            convert_int_to_ascii (mem_buf, own_buf, len);
1094         else
1095            write_enn (own_buf);
1096         break;
1097      case 'M':
1098         decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
1099         if (valgrind_write_memory (mem_addr, mem_buf, len) == 0)
1100            write_ok (own_buf);
1101         else
1102            write_enn (own_buf);
1103         break;
1104      case 'X':
1105         if (decode_X_packet (&own_buf[1], packet_len - 1,
1106                              &mem_addr, &len, mem_buf) < 0
1107             || valgrind_write_memory (mem_addr, mem_buf, len) != 0)
1108            write_enn (own_buf);
1109         else
1110            write_ok (own_buf);
1111         break;
1112      case 'C':
1113         convert_ascii_to_int (own_buf + 1, &sig, 1);
1114         if (target_signal_to_host_p (sig))
1115            zignal = target_signal_to_host (sig);
1116         else
1117            zignal = 0;
1118         set_desired_inferior (0);
1119         myresume (0, zignal);
1120         return; // return control to valgrind
1121      case 'S':
1122         convert_ascii_to_int (own_buf + 1, &sig, 1);
1123         if (target_signal_to_host_p (sig))
1124            zignal = target_signal_to_host (sig);
1125         else
1126            zignal = 0;
1127         set_desired_inferior (0);
1128         myresume (1, zignal);
1129         return; // return control to valgrind
1130      case 'c':
1131         set_desired_inferior (0);
1132         myresume (0, 0);
1133         return; // return control to valgrind
1134      case 's':
1135         set_desired_inferior (0);
1136         myresume (1, 0);
1137         return; // return control to valgrind
1138      case 'Z': {
1139         char *lenptr;
1140         char *dataptr;
1141         CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1142         int zlen = strtol (lenptr + 1, &dataptr, 16);
1143         char type = own_buf[1];
1144
1145         if (type < '0' || type > '4') {
1146            /* Watchpoint command type unrecognized. */
1147            own_buf[0] = '\0';
1148         } else {
1149            int res;
1150
1151            res = valgrind_insert_watchpoint (type, addr, zlen);
1152            if (res == 0)
1153               write_ok (own_buf);
1154            else if (res == 1)
1155               /* Unsupported.  */
1156               own_buf[0] = '\0';
1157            else
1158               write_enn (own_buf);
1159         }
1160         break;
1161      }
1162      case 'z': {
1163         char *lenptr;
1164         char *dataptr;
1165         CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1166         int zlen = strtol (lenptr + 1, &dataptr, 16);
1167         char type = own_buf[1];
1168
1169         if (type < '0' || type > '4') {
1170            /* Watchpoint command type unrecognized. */
1171            own_buf[0] = '\0';
1172         } else {
1173            int res;
1174
1175            res = valgrind_remove_watchpoint (type, addr, zlen);
1176            if (res == 0)
1177               write_ok (own_buf);
1178            else if (res == 1)
1179               /* Unsupported.  */
1180               own_buf[0] = '\0';
1181            else
1182               write_enn (own_buf);
1183         }
1184         break;
1185      }
1186      case 'k':
1187         kill_request("Gdb request to kill this process\n");
1188         break;
1189      case 'T': {
1190         unsigned long gdb_id, thread_id;
1191
1192         gdb_id = strtoul (&own_buf[1], NULL, 16);
1193         thread_id = gdb_id_to_thread_id (gdb_id);
1194         if (thread_id == 0) {
1195            write_enn (own_buf);
1196            break;
1197         }
1198
1199         if (valgrind_thread_alive (thread_id))
1200            write_ok (own_buf);
1201         else
1202            write_enn (own_buf);
1203         break;
1204      }
1205      case 'R':
1206         /* Restarting the inferior is only supported in the
1207            extended protocol.
1208            => It is a request we don't understand.  Respond with an
1209            empty packet so that gdb knows that we don't support this
1210            request.  */
1211         own_buf[0] = '\0';
1212         break;
1213      case 'v':
1214         /* Extended (long) request.  */
1215         handle_v_requests (own_buf, &status, &zignal);
1216         break;
1217      default:
1218         /* It is a request we don't understand.  Respond with an
1219            empty packet so that gdb knows that we don't support this
1220            request.  */
1221         own_buf[0] = '\0';
1222         break;
1223      }
1224
1225      if (new_packet_len != -1)
1226         putpkt_binary (own_buf, new_packet_len);
1227      else
1228         putpkt (own_buf);
1229
1230      if (status == 'W')
1231         VG_(umsg) ("\nChild exited with status %d\n", zignal);
1232      if (status == 'X')
1233         VG_(umsg) ("\nChild terminated with signal = 0x%x (%s)\n",
1234                    target_signal_to_host (zignal),
1235                    target_signal_to_name (zignal));
1236      if (status == 'W' || status == 'X') {
1237         VG_(umsg) ("Process exiting\n");
1238         VG_(exit) (0);
1239      }
1240   }
1241
1242   /* We come here when getpkt fails => close the connection,
1243      and re-open. Then return control to valgrind.
1244      We return the control to valgrind as we assume that
1245      the connection was closed due to vgdb having finished
1246      to execute a command. */
1247   if (VG_(clo_verbosity) > 1)
1248      VG_(umsg) ("Remote side has terminated connection.  "
1249                 "GDBserver will reopen the connection.\n");
1250   remote_finish (reset_after_error);
1251   remote_open (VG_(clo_vgdb_prefix));
1252   myresume (0, 0);
1253   resume_reply_packet_needed = False;
1254   return;
1255}
1256