1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Main code for remote server for GDB.
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003,
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   2004, 2005, 2006, 2011
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Free Software Foundation, Inc.
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This file is part of GDB.
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   It has been modified to integrate it in valgrind
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is free software; you can redistribute it and/or modify
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   it under the terms of the GNU General Public License as published by
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the Free Software Foundation; either version 2 of the License, or
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   (at your option) any later version.
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   This program is distributed in the hope that it will be useful,
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   but WITHOUT ANY WARRANTY; without even the implied warranty of
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   GNU General Public License for more details.
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   You should have received a copy of the GNU General Public License
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   along with this program; if not, write to the Free Software
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Foundation, Inc., 51 Franklin Street, Fifth Floor,
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Boston, MA 02110-1301, USA.  */
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "server.h"
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "regdef.h"
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_options.h"
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_translate.h"
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_mallocfree.h"
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "pub_core_initimg.h"
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_execontext.h"
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_syswrap.h"      // VG_(show_open_fds)
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_scheduler.h"
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_core_transtab.h"
34eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_debuginfo.h"
35eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_addrinfo.h"
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long cont_thread;
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long general_thread;
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long step_thread;
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long thread_from_wait;
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovunsigned long old_thread_from_wait;
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint pass_signals[TARGET_SIGNAL_LAST]; /* indexed by gdb signal nr */
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* for a gdbserver integrated in valgrind, resuming the process consists
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   in returning the control to valgrind.
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The guess process resumes its execution.
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Then at the next error or break or ..., valgrind calls gdbserver again.
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   A resume reply packet must then be built to inform GDB that the
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   resume request is finished.
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   resume_reply_packet_needed records the fact that the next call to gdbserver
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   must send a resume packet to gdb. */
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool resume_reply_packet_needed = False;
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovVG_MINIMAL_JMP_BUF(toplevel);
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Decode a qXfer read request.  Return 0 if everything looks OK,
58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   or -1 otherwise.  */
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint decode_xfer_read (char *buf, const char **annex, CORE_ADDR *ofs, unsigned int *len)
62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Extract and NUL-terminate the annex.  */
64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *annex = buf;
65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (*buf && *buf != ':')
66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      buf++;
67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (*buf == '\0')
68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return -1;
69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *buf++ = 0;
70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* After the read/write marker and annex, qXfer looks like a
72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      traditional 'm' packet.  */
73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   decode_m_packet (buf, ofs, len);
74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return 0;
76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Write the response to a successful qXfer read.  Returns the
79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   length of the (binary) data stored in BUF, corresponding
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   to as much of DATA/LEN as we could fit.  IS_MORE controls
81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   the first character of the response.  */
82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint write_qxfer_response (char *buf, unsigned char *data, int len, int is_more)
84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int out_len;
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (is_more)
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      buf[0] = 'm';
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      buf[0] = 'l';
91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len,
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                PBUFSIZ - POVERHSIZ - 1) + 1;
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Bool initial_valgrind_sink_saved = False;
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* True <=> valgrind log sink saved in initial_valgrind_sink */
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic OutputSink initial_valgrind_sink;
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic Bool command_output_to_log = False;
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* True <=> command output goes to log instead of gdb */
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid reset_valgrind_sink(const char *info)
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_(log_output_sink).fd != initial_valgrind_sink.fd
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       && initial_valgrind_sink_saved) {
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(log_output_sink).fd = initial_valgrind_sink.fd;
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg) ("Reset valgrind output to log (%s)\n",
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 (info = NULL ? "" : info));
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid print_to_initial_valgrind_sink (const char *msg)
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vg_assert (initial_valgrind_sink_saved);
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(write) (initial_valgrind_sink.fd, msg, strlen(msg));
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid kill_request (const char *msg)
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(umsg) ("%s", msg);
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(exit) (0);
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// s is a NULL terminated string made of O or more words (separated by spaces).
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// Returns a pointer to the Nth word in s.
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// If Nth word does not exist, return a pointer to the last (0) byte of s.
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovconst char *wordn (const char *s, int n)
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   int word_seen = 0;
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Bool searching_word = True;
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   while (*s) {
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (*s == ' ')
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         searching_word = True;
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else {
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (searching_word) {
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            searching_word = False;
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            word_seen++;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (word_seen == n)
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               return s;
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      s++;
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return s;
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
152eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovvoid VG_(print_all_stats) (Bool memory_stats, Bool tool_stats)
153eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
154eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (memory_stats) {
155eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(message)(Vg_DebugMsg, "\n");
156eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(message)(Vg_DebugMsg,
157eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         "------ Valgrind's internal memory use stats follow ------\n" );
158eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(sanity_check_malloc_all)();
159eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(message)(Vg_DebugMsg, "------\n" );
160eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(print_all_arena_stats)();
161eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (VG_(clo_profile_heap))
162eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         VG_(print_arena_cc_analysis) ();
163eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(message)(Vg_DebugMsg, "\n");
164eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
165eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
166eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(print_translation_stats)();
167eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(print_tt_tc_stats)();
168eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(print_scheduler_stats)();
169eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(print_ExeContext_stats)( False /* with_stacktraces */ );
170eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(print_errormgr_stats)();
171eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (tool_stats && VG_(needs).print_stats) {
172eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_TDICT_CALL(tool_print_stats);
173eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
174eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
175eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* handle_gdb_valgrind_command handles the provided mon string command.
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   If command is recognised, return 1 else return 0.
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Note that in case of ambiguous command, 1 is returned.
179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   *sink_wanted_at_return is modified if one of the commands
181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   'v.set *_output' is handled.
182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint handle_gdb_valgrind_command (char *mon, OutputSink *sink_wanted_at_return)
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord ret = 0;
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char s[strlen(mon)+1]; /* copy for strtok_r */
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   char *wcmd;
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   HChar *ssaveptr;
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const char *endptr;
191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int   kwdid;
192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int int_value;
193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   vg_assert (initial_valgrind_sink_saved);
195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   strcpy (s, mon);
197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   wcmd = strtok_r (s, " ", &ssaveptr);
198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* NB: if possible, avoid introducing a new command below which
199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      starts with the same 3 first letters as an already existing
200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      command. This ensures a shorter abbreviation for the user. */
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (VG_(keyword_id) ("help v.set v.info v.wait v.kill v.translate"
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            " v.do",
203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                            wcmd, kwd_report_duplicated_matches)) {
204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case -2:
205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case -1:
208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  0: /* help */
210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      wcmd = strtok_r (NULL, " ", &ssaveptr);
212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (wcmd == NULL) {
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int_value = 0;
214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         switch (VG_(keyword_id) ("debug", wcmd, kwd_report_all)) {
216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case -2: int_value = 0; break;
217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case -1: int_value = 0; break;
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         case  0: int_value = 1; break;
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         default: tl_assert (0);
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(gdb_printf) (
224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"general valgrind monitor commands:\n"
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  help [debug]            : monitor command help. With debug: + debugging commands\n"
226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.wait [<ms>]           : sleep <ms> (default 0) then continue\n"
227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.info all_errors       : show all errors found so far\n"
228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.info last_error       : show last error found\n"
229eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov"  v.info location <addr>  : show information about location <addr>\n"
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.info n_errs_found [msg] : show the nr of errors found so far and the given msg\n"
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.info open_fds         : show open file descriptors (only if --track-fds=yes)\n"
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.kill                  : kill the Valgrind process\n"
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.set gdb_output        : set valgrind output to gdb\n"
234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.set log_output        : set valgrind output to log\n"
235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.set mixed_output      : set valgrind output to log, interactive output to gdb\n"
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.set merge-recursive-frames <num> : merge recursive calls in max <num> frames\n"
237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.set vgdb-error <errornr> : debug me at error >= <errornr> \n");
238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (int_value) { VG_(gdb_printf) (
239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"debugging valgrind internals monitor commands:\n"
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.do   expensive_sanity_check_general : do an expensive sanity check now\n"
241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.info gdbserver_status : show gdbserver status\n"
242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng"  v.info memory [aspacemgr] : show valgrind heap memory stats\n"
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng"     (with aspacemgr arg, also shows valgrind segments on log ouput)\n"
244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.info exectxt          : show stacktraces and stats of all execontexts\n"
245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.info scheduler        : show valgrind thread state and stacktrace\n"
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov"  v.info stats            : show various valgrind and tool stats\n"
247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.set debuglog <level>  : set valgrind debug log level to <level>\n"
248eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov"  v.set hostvisibility [yes*|no] : (en/dis)ables access by gdb/gdbserver to\n"
249eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov"    Valgrind internal host status/memory\n"
250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"  v.translate <addr> [<traceflags>]  : debug translation of <addr> with <traceflags>\n"
251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"    (default traceflags 0b00100000 : show after instrumentation)\n"
252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"   An additional flag  0b100000000 allows to show gdbserver instrumentation\n");
253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  1: /* v.set */
256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      wcmd = strtok_r (NULL, " ", &ssaveptr);
258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (kwdid = VG_(keyword_id)
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              ("vgdb-error debuglog merge-recursive-frames"
260eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               " gdb_output log_output mixed_output hostvisibility ",
261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               wcmd, kwd_report_all)) {
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case -2:
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case -1:
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 0: /* vgdb-error */
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 1: /* debuglog */
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 2: /* merge-recursive-frames */
268b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         wcmd = strtok_r (NULL, " ", &ssaveptr);
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (wcmd == NULL) {
270b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int_value = 0;
271b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            endptr = "empty"; /* to report an error below */
272b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            HChar *the_end;
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            int_value = strtol (wcmd, &the_end, 10);
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            endptr = the_end;
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (*endptr != '\0') {
278b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(gdb_printf) ("missing or malformed integer value\n");
279b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else if (kwdid == 0) {
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(printf) ("vgdb-error value changed from %d to %d\n",
281b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             VG_(dyn_vgdb_error), int_value);
282b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(dyn_vgdb_error) = int_value;
283b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else if (kwdid == 1) {
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(printf) ("debuglog value changed from %d to %d\n",
285b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                             VG_(debugLog_getLevel)(), int_value);
286b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(debugLog_startup) (int_value, "gdbsrv");
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (kwdid == 2) {
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(printf)
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               ("merge-recursive-frames value changed from %d to %d\n",
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                VG_(clo_merge_recursive_frames), int_value);
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(clo_merge_recursive_frames) = int_value;
292b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
293b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            vg_assert (0);
294b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
295b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 3: /* gdb_output */
297b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         (*sink_wanted_at_return).fd = -2;
298b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         command_output_to_log = False;
299b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(gdb_printf) ("valgrind output will go to gdb\n");
300b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 4: /* log_output */
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         (*sink_wanted_at_return).fd = initial_valgrind_sink.fd;
303b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         command_output_to_log = True;
304b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(gdb_printf) ("valgrind output will go to log\n");
305b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 5: /* mixed output */
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         (*sink_wanted_at_return).fd = initial_valgrind_sink.fd;
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         command_output_to_log = False;
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(gdb_printf)
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ("valgrind output will go to log, interactive output will go to gdb\n");
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
312eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case 6: /* hostvisibility */
313eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         wcmd = strtok_r (NULL, " ", &ssaveptr);
314eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         if (wcmd != NULL) {
315eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            switch (VG_(keyword_id) ("yes no", wcmd, kwd_report_all)) {
316eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case -2:
317eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case -1: break;
318eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case  0:
319eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               hostvisibility = True;
320eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
321eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            case 1:
322eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               hostvisibility = False;
323eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               break;
324eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            default: tl_assert (0);
325eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            }
326eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         } else {
327eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            hostvisibility = True;
328eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         }
329eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         if (hostvisibility)
330eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            VG_(gdb_printf)
331eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               ("Enabled access to Valgrind memory/status by GDB\n"
332eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                "If not yet done, tell GDB which valgrind file(s) to use:\n"
333eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                "add-symbol-file <tool or preloaded file> <loadaddr>\n");
334eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         else
335eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            VG_(gdb_printf)
336eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               ("Disabled access to Valgrind memory/status by GDB\n");
337eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         break;
338b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
339b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vg_assert (0);
340b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
341b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
342b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  2: /* v.info */ {
343b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
344b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      wcmd = strtok_r (NULL, " ", &ssaveptr);
345b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (kwdid = VG_(keyword_id)
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov              ("all_errors n_errs_found last_error gdbserver_status memory"
347eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               " scheduler stats open_fds exectxt location",
348b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               wcmd, kwd_report_all)) {
349b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case -2:
350b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case -1:
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 0: // all_errors
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         // A verbosity of minimum 2 is needed to show the errors.
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(show_all_errors)(/* verbosity */ 2, /* xml */ False);
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case  1: // n_errs_found
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         VG_(printf) ("n_errs_found %d n_errs_shown %d (vgdb-error %d) %s\n",
358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      VG_(get_n_errs_found) (),
359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      VG_(get_n_errs_shown) (),
360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      VG_(dyn_vgdb_error),
361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      wordn (mon, 3));
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 2: // last_error
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(show_last_error)();
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case  3: // gdbserver_status
367b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(gdbserver_status_output)();
368b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
369b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case  4: /* memory */
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         VG_(printf) ("%llu bytes have already been allocated.\n",
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      VG_(am_get_anonsize_total)());
372b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(print_all_arena_stats) ();
373b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (VG_(clo_profile_heap))
374b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(print_arena_cc_analysis) ();
375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         wcmd = strtok_r (NULL, " ", &ssaveptr);
376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (wcmd != NULL) {
377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (VG_(keyword_id) ("aspacemgr", wcmd, kwd_report_all)) {
378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case -2:
379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case -1: break;
380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            case  0:
381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               VG_(am_show_nsegments) (0, "gdbserver v.info memory aspacemgr");
382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            default: tl_assert (0);
384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
387b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ret = 1;
388b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
389b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case  5: /* scheduler */
390eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         VG_(show_sched_status) (True,  // host_stacktrace
391eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                 True,  // valgrind_stack_usage
392eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                                 True); // exited_threads
393b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ret = 1;
394b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case  6: /* stats */
396eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         VG_(print_all_stats)(False, /* Memory stats */
397eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                              True   /* Tool stats */);
398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = 1;
399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case  7: /* open_fds */
401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VG_(clo_track_fds))
402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(show_open_fds) ("");
403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(gdb_printf)
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               ("Valgrind must be started with --track-fds=yes"
406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                " to show open fds\n");
407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = 1;
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case  8: /* exectxt */
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         VG_(print_ExeContext_stats) (True /* with_stacktraces */);
411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = 1;
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
413eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      case  9: { /* location */
414eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         /* Note: we prefer 'v.info location' and not 'v.info address' as
415eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            v.info address is inconsistent with the GDB (native)
416eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            command 'info address' which gives the address for a symbol.
417eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            GDB equivalent command of 'v.info location' is 'info symbol'. */
418eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         Addr address;
419eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         SizeT dummy_sz = 0x1234;
420eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         if (VG_(strtok_get_address_and_size) (&address, &dummy_sz, &ssaveptr)) {
421eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            // If tool provides location information, use that.
422eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            if (VG_(needs).info_location) {
423eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               VG_TDICT_CALL(tool_info_location, address);
424eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            }
425eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            // If tool does not provide location information, use the common one.
426eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            // Also use the common to compare with tool when debug log is set.
427eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            if (!VG_(needs).info_location || VG_(debugLog_getLevel)() > 0 ) {
428eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               AddrInfo ai;
429eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               ai.tag = Addr_Undescribed;
430eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               VG_(describe_addr) (address, &ai);
431eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               VG_(pp_addrinfo) (address, &ai);
432eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               VG_(clear_addrinfo) (&ai);
433eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            }
434eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         }
435eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         ret = 1;
436eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         break;
437eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      }
438b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         vg_assert(0);
440b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
441b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
443b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  3: /* v.wait */
444b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      wcmd = strtok_r (NULL, " ", &ssaveptr);
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (wcmd != NULL) {
446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         int_value = strtol (wcmd, NULL, 10);
447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         VG_(printf) ("gdbserver: continuing in %d ms ...\n", int_value);
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(poll)(NULL, 0, int_value);
449b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      VG_(printf) ("gdbserver: continuing after wait ...\n");
451b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
452b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
453b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  4: /* v.kill */
454b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      kill_request ("monitor command request to kill this process\n");
455b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
456b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   case  5: { /* v.translate */
457b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Addr address;
458b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      SizeT verbosity = 0x20;
459b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ret = 1;
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
462eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (VG_(strtok_get_address_and_size) (&address, &verbosity, &ssaveptr)) {
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* we need to force the output to log for the translation trace,
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            as low level VEX tracing cannot be redirected to gdb. */
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int saved_command_output_to_log = command_output_to_log;
466b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int saved_fd = VG_(log_output_sink).fd;
467b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Bool single_stepping_on_entry = valgrind_single_stepping();
468b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int vex_verbosity = verbosity & 0xff;
469b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(log_output_sink).fd = initial_valgrind_sink.fd;
470b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if ((verbosity & 0x100) && !single_stepping_on_entry) {
471b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            valgrind_set_single_stepping(True);
472b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // to force gdbserver instrumentation.
473b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
474b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#        if defined(VGA_arm)
475b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         // on arm, we need to (potentially) convert this address
476b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         // to the thumb form.
477b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         address = thumb_pc (address);
478b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#        endif
479b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
480b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(translate) ( 0 /* dummy ThreadId; irrelevant due to debugging*/,
481b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          address,
482b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          /*debugging*/True,
483b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          (Int) vex_verbosity,
484b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          /*bbs_done*/0,
485b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                          /*allow redir?*/True);
486b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if ((verbosity & 0x100) && !single_stepping_on_entry) {
487b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            valgrind_set_single_stepping(False);
488b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            // reset single stepping.
489b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
490b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         command_output_to_log = saved_command_output_to_log;
491b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(log_output_sink).fd = saved_fd;
492b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
493b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      break;
494b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
495b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case  6: /* v.do */
497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      ret = 1;
498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      wcmd = strtok_r (NULL, " ", &ssaveptr);
499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (VG_(keyword_id) ("expensive_sanity_check_general",
500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               wcmd, kwd_report_all)) {
501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case -2:
502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case -1: break;
503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case  0: { /* expensive_sanity_check_general */
504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            // Temporarily bump up sanity level to check e.g. the malloc arenas.
505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            const Int save_clo_sanity_level = VG_(clo_sanity_level);
506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (VG_(clo_sanity_level) < 4) VG_(clo_sanity_level) = 4;
507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(sanity_check_general) (/* force_expensive */ True);
508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(clo_sanity_level) = save_clo_sanity_level;
509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default: tl_assert (0);
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
515b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   default:
516b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      vg_assert (0);
517b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
518b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return ret;
519b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
520b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
521b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* handle_gdb_monitor_command handles the provided mon string command,
522b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   which can be either a "standard" valgrind monitor command
523b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   or a tool specific monitor command.
524b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   If command recognised, return 1 else return 0.
525b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Note that in case of ambiguous command, 1 is returned.
526b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
527b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint handle_gdb_monitor_command (char *mon)
529b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
530b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord ret = 0;
531b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   UWord tool_ret = 0;
532b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // initially, we assume that when returning, the desired sink is the
533b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // one we have when entering. It can however be changed by the standard
534b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // valgrind command handling.
535b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   OutputSink sink_wanted_at_return = VG_(log_output_sink);
536b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
537b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!initial_valgrind_sink_saved) {
538b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* first time we enter here, we save the valgrind default log sink */
539b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      initial_valgrind_sink = sink_wanted_at_return;
540b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      initial_valgrind_sink_saved = True;
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (!command_output_to_log)
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(log_output_sink).fd = -2; /* redirect to monitor_output */
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   ret = handle_gdb_valgrind_command (mon, &sink_wanted_at_return);
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
548b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Even if command was recognised by valgrind core, we call the
549b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      tool command handler : this is needed to handle help command
550b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and/or to let the tool do some additional processing of a
551b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      valgrind standard command. Note however that if valgrind
552b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      recognised the command, we will always return success. */
553b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_(needs).client_requests) {
554b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* If the tool reports an error when handling a monitor command,
555b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         we need to avoid calling gdbserver during this command
556b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         handling. So, we temporarily set VG_(dyn_vgdb_error) to
557b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         a huge value to ensure m_errormgr.c does not call gdbserver. */
558b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      Int save_dyn_vgdb_error = VG_(dyn_vgdb_error);
559b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UWord arg[2];
560b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(dyn_vgdb_error) = 999999999;
561b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      arg[0] = (UWord) VG_USERREQ__GDB_MONITOR_COMMAND;
562b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      arg[1] = (UWord) mon;
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_TDICT_CALL(tool_handle_client_request, VG_(running_tid), arg,
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    &tool_ret);
565b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(dyn_vgdb_error) = save_dyn_vgdb_error;
566b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
567b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(message_flush) ();
569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
570b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* restore or set the desired output */
571b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   VG_(log_output_sink).fd = sink_wanted_at_return.fd;
572b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (ret | tool_ret)
573b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return 1;
574b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   else
575b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return 0;
576b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
577b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Handle all of the extended 'Q' packets.  */
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid handle_set (char *arg_own_buf, int *new_packet_len_p)
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strcmp ("QStartNoAckMode", arg_own_buf) == 0) {
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      noack_mode = True;
585b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      write_ok (arg_own_buf);
586b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
587b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
588b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strncmp ("QPassSignals:", arg_own_buf, 13) == 0) {
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int i;
591b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char *from, *to;
592b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char *end = arg_own_buf + strlen(arg_own_buf);
593b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      CORE_ADDR sig;
594b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      for (i = 0; i < TARGET_SIGNAL_LAST; i++)
595b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         pass_signals[i] = 0;
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      from = arg_own_buf + 13;
598b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      while (from < end) {
599b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         to = strchr(from, ';');
600b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (to == NULL) to = end;
601b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         decode_address (&sig, from, to - from);
602b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         pass_signals[(int)sig] = 1;
603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dlog(1, "pass_signal gdb_nr %d %s\n",
604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng              (int)sig, target_signal_to_name(sig));
605b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         from = to;
606b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (*from == ';') from++;
607b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
608b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      write_ok (arg_own_buf);
609b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
610b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
611b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Otherwise we didn't know what packet it was.  Say we didn't
612b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      understand it.  */
613b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   arg_own_buf[0] = 0;
614b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
615b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovBool VG_(client_monitor_command) (HChar *cmd)
617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const Bool connected = remote_connected();
619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const int saved_command_output_to_log = command_output_to_log;
620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Bool handled;
621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!connected)
623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      command_output_to_log = True;
624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   handled = handle_gdb_monitor_command (cmd);
625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!connected) {
626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      // reset the log output unless cmd changed it.
627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (command_output_to_log)
628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         command_output_to_log = saved_command_output_to_log;
629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (handled)
631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return False; // recognised
632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return True; // not recognised
634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
636b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Handle all of the extended 'q' packets.  */
637b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
638b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid handle_query (char *arg_own_buf, int *new_packet_len_p)
639b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
640b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static struct inferior_list_entry *thread_ptr;
641b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
642b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* qRcmd, monitor command handling.  */
643b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strncmp ("qRcmd,", arg_own_buf, 6) == 0) {
644b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char *p = arg_own_buf + 6;
645b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int cmdlen = strlen(p)/2;
646b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char cmd[cmdlen+1];
647b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
648b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (unhexify (cmd, p, cmdlen) != cmdlen) {
649b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_enn (arg_own_buf);
650b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
651b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
652b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      cmd[cmdlen] = '\0';
653b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
654b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (handle_gdb_monitor_command (cmd)) {
655b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_ok (arg_own_buf);
656b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
657b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
658b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* cmd not recognised */
659b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(gdb_printf)
660b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            ("command '%s' not recognised\n"
661b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             "In gdb,     try 'monitor help'\n"
662b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             "In a shell, try 'vgdb help'\n",
663b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             cmd);
664b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_ok (arg_own_buf);
665b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
666b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
667b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
668b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
669b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* provide some valgrind specific info in return to qThreadExtraInfo. */
670b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strncmp ("qThreadExtraInfo,", arg_own_buf, 17) == 0) {
671b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned long gdb_id;
672b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      struct thread_info *ti;
673b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ThreadState *tst;
674b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      char status[100];
675b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
676b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      gdb_id = strtoul (&arg_own_buf[17], NULL, 16);
677b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ti = gdb_id_to_thread (gdb_id);
678b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (ti != NULL) {
679b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         tst = (ThreadState *) inferior_target_data (ti);
680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Additional info is the tid, the thread status and the thread's
681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            name, if any. */
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (tst->thread_name) {
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(snprintf) (status, sizeof(status), "tid %d %s %s",
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           tst->tid,
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           VG_(name_of_ThreadStatus)(tst->status),
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           tst->thread_name);
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            VG_(snprintf) (status, sizeof(status), "tid %d %s",
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           tst->tid,
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           VG_(name_of_ThreadStatus)(tst->status));
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
692b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         hexify (arg_own_buf, status, strlen(status));
693b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
694b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
695b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_enn (arg_own_buf);
696b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
697b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
698b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
699b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
700b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strcmp ("qAttached", arg_own_buf) == 0) {
701b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* tell gdb to always detach, never kill the process */
702b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      arg_own_buf[0] = '1';
703b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      arg_own_buf[1] = 0;
704b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
705b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
706b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
707b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strcmp ("qSymbol::", arg_own_buf) == 0) {
708b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* We have no symbol to read. */
709b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      write_ok (arg_own_buf);
710b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
711b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
712b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
713b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strcmp ("qfThreadInfo", arg_own_buf) == 0) {
714b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      thread_ptr = all_threads.head;
715b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(sprintf) (arg_own_buf, "m%x",
716b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    thread_to_gdb_id ((struct thread_info *)thread_ptr));
717b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      thread_ptr = thread_ptr->next;
718b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
719b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
720b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
721b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strcmp ("qsThreadInfo", arg_own_buf) == 0) {
722b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (thread_ptr != NULL) {
723b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(sprintf) (arg_own_buf, "m%x",
724b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                       thread_to_gdb_id ((struct thread_info *)thread_ptr));
725b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         thread_ptr = thread_ptr->next;
726b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
727b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      } else {
728b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(sprintf) (arg_own_buf, "l");
729b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
730b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
731b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
732b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL
734b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        && strncmp ("qXfer:features:read:", arg_own_buf, 20) == 0) {
735b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      CORE_ADDR ofs;
736b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int len, doc_len;
737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const char *annex = NULL;
738b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      // First, the annex is extracted from the packet received.
739b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      // Then, it is replaced by the corresponding file name.
740b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int fd;
741b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
742b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Grab the annex, offset, and length.  */
743b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (decode_xfer_read (arg_own_buf + 20, &annex, &ofs, &len) < 0) {
744b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         strcpy (arg_own_buf, "E00");
745b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
746b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
747b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
748b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (strcmp (annex, "target.xml") == 0) {
749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         annex = valgrind_target_xml(VG_(clo_vgdb_shadow_registers));
750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (annex != NULL && VG_(clo_vgdb_shadow_registers)) {
751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* Ensure the shadow registers are initialized. */
752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            initialize_shadow_low(True);
753b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
754b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (annex == NULL) {
755b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            strcpy (arg_own_buf, "E00");
756b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return;
757b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
758b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
759b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
760b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         char doc[VG_(strlen)(VG_(libdir)) + 1 + VG_(strlen)(annex) + 1];
762b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         struct vg_stat stat_doc;
763b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char toread[len];
764b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int len_read;
765b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
766b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(sprintf)(doc, "%s/%s", VG_(libdir), annex);
767b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         fd = VG_(fd_open) (doc, VKI_O_RDONLY, 0);
768b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (fd == -1) {
769b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            strcpy (arg_own_buf, "E00");
770b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return;
771b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
772b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (VG_(fstat) (fd, &stat_doc) != 0) {
773b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(close) (fd);
774b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            strcpy (arg_own_buf, "E00");
775b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return;
776b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
777b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         doc_len = stat_doc.size;
778b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
779b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (len > PBUFSIZ - POVERHSIZ)
780b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            len = PBUFSIZ - POVERHSIZ;
781b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
782b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (ofs > doc_len) {
783b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (arg_own_buf);
784b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(close) (fd);
785b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            return;
786b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
787b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(lseek) (fd, ofs, VKI_SEEK_SET);
788b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         len_read = VG_(read) (fd, toread, len);
789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         *new_packet_len_p = write_qxfer_response (arg_own_buf, (unsigned char *)toread,
790b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                                   len_read, ofs + len_read < doc_len);
791b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(close) (fd);
792b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
793b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
794b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
795b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
796b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strncmp ("qXfer:auxv:read:", arg_own_buf, 16) == 0) {
797b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned char *data;
798b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int n;
799b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      CORE_ADDR ofs;
800b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned int len;
801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      const char *annex;
802b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
803b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Reject any annex; grab the offset and length.  */
804b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (decode_xfer_read (arg_own_buf + 16, &annex, &ofs, &len) < 0
805b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov          || annex[0] != '\0') {
806b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         strcpy (arg_own_buf, "E00");
807b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
808b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
809b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
810b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (len > PBUFSIZ - 2)
811b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         len = PBUFSIZ - 2;
812b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      data = malloc (len);
813b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
814b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      {
815b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         UWord *client_auxv = VG_(client_auxv);
816b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned int client_auxv_len = 0;
817b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         while (*client_auxv != 0) {
818b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            dlog(4, "auxv %lld %llx\n",
819b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 (ULong)*client_auxv,
820b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 (ULong)*(client_auxv+1));
821b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            client_auxv++;
822b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            client_auxv++;
823b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            client_auxv_len += 2 * sizeof(UWord);
824b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
825b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         client_auxv_len += 2 * sizeof(UWord);
826b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         dlog(4, "auxv len %d\n", client_auxv_len);
827b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
828b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (ofs >= client_auxv_len)
829b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            n = -1;
830b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else {
831b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            n = client_auxv_len - ofs;
832b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(memcpy) (data, (unsigned char *) VG_(client_auxv), n);
833b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
834b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
835b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
836b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (n < 0)
837b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_enn (arg_own_buf);
838b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else if (n > len)
839b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         *new_packet_len_p = write_qxfer_response (arg_own_buf, data, len, 1);
840b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
841b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         *new_packet_len_p = write_qxfer_response (arg_own_buf, data, n, 0);
842b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
843b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      free (data);
844b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
845b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
846b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
847b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
848b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
849b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Protocol features query.  */
850b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (strncmp ("qSupported", arg_own_buf, 10) == 0
851b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov       && (arg_own_buf[10] == ':' || arg_own_buf[10] == '\0')) {
852b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(sprintf) (arg_own_buf, "PacketSize=%x", PBUFSIZ - 1);
853b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* Note: max packet size including frame and checksum, but without
854b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         trailing null byte, which is not sent/received. */
855b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
856b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      strcat (arg_own_buf, ";QStartNoAckMode+");
857b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      strcat (arg_own_buf, ";QPassSignals+");
858b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (VG_(client_auxv))
859b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         strcat (arg_own_buf, ";qXfer:auxv:read+");
860b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL) {
862b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         strcat (arg_own_buf, ";qXfer:features:read+");
863b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* if a new gdb connects to us, we have to reset the register
864b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            set to the normal register sets to allow this new gdb to
865b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            decide to use or not the shadow registers.
866b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
867b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            Note that the reset is only done for gdb that are sending
868b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            qSupported packets. If a user first connected with a recent
869b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            gdb using shadow registers and then with a very old gdb
870b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            that does not use qSupported packet, then the old gdb will
871b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            not properly connect. */
872b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         initialize_shadow_low(False);
873b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
874b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
875b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
876b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
877b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Otherwise we didn't know what packet it was.  Say we didn't
878b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      understand it.  */
879b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   arg_own_buf[0] = 0;
880b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
881b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
882b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Handle all of the extended 'v' packets.  */
883b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
884b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid handle_v_requests (char *arg_own_buf, char *status, int *zignal)
885b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
886b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* vcont packet code from gdb 6.6 removed */
887b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
888b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* Otherwise we didn't know what packet it was.  Say we didn't
889b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      understand it.  */
890b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   arg_own_buf[0] = 0;
891b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return;
892b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
893b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
894b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic
895b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid myresume (int step, int sig)
896b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
897b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct thread_resume resume_info[2];
898b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int n = 0;
899b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (step || sig) {
901b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      resume_info[0].step = step;
902b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      resume_info[0].sig = sig;
903b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      n++;
904b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
905b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resume_info[n].step = 0;
906b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   resume_info[n].sig = 0;
907b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   resume_reply_packet_needed = True;
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_resume (resume_info);
910b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
911b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
912b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* server_main global variables */
913b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic char *own_buf;
914b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic unsigned char *mem_buf;
915b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
916b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid gdbserver_init (void)
917b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
918b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   dlog(1, "gdbserver_init gdbserver embedded in valgrind: %s\n", version);
919b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   noack_mode = False;
920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   valgrind_initialize_target ();
921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // After a fork, gdbserver_init can be called again.
922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // We do not have to re-malloc the buffers in such a case.
923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (own_buf == NULL)
924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      own_buf = malloc (PBUFSIZ+POVERHSIZ);
925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (mem_buf == NULL)
926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      mem_buf = malloc (PBUFSIZ+POVERHSIZ);
927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // Note: normally, we should only malloc PBUFSIZ. However,
928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // GDB has a bug, and in some cases, sends e.g. 'm' packets
929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // asking for slightly more than the PacketSize given at
930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // connection initialisation. So, we bypass the GDB bug
931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   // by allocating slightly more.
932b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
933b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
934b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid gdbserver_terminate (void)
935b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
936b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* last call to gdbserver is cleanup call */
937b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_MINIMAL_SETJMP(toplevel)) {
938b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dlog(0, "error caused VG_MINIMAL_LONGJMP to gdbserver_terminate\n");
939b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      return;
940b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
941b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   remote_close();
942b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
943b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
944b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid server_main (void)
945b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
946b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static char status;
947b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   static int zignal;
948b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
949b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   char ch;
950b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int i = 0;
951b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   unsigned int len;
952b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   CORE_ADDR mem_addr;
953b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   zignal = valgrind_wait (&status);
955b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_MINIMAL_SETJMP(toplevel)) {
956b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      dlog(0, "error caused VG_MINIMAL_LONGJMP to server_main\n");
957b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
958b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   while (1) {
959b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      unsigned char sig;
960b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int packet_len;
961b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      int new_packet_len = -1;
962b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (resume_reply_packet_needed) {
964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Send the resume reply to reply to last GDB resume
965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            request. */
966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         resume_reply_packet_needed = False;
967b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         prepare_resume_reply (own_buf, status, zignal);
968b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         putpkt (own_buf);
969b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
970b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* If we our status is terminal (exit or fatal signal) get out
972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         as quickly as we can. We won't be able to handle any request
973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         anymore.  */
974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (status == 'W' || status == 'X') {
975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return;
976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
978b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      packet_len = getpkt (own_buf);
979b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (packet_len <= 0)
980b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
981b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
982b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      i = 0;
983b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      ch = own_buf[i++];
984b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      switch (ch) {
985b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'Q':
986b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         handle_set (own_buf, &new_packet_len);
987b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
988b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'q':
989b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         handle_query (own_buf, &new_packet_len);
990b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
991b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'd':
992b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* set/unset debugging is done through valgrind debug level. */
993b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         own_buf[0] = '\0';
994b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
995b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'D':
996b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         reset_valgrind_sink("gdb detaching from process");
997b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
998b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* When detaching or kill the process, gdb expects to get
999b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            an packet OK back.  Any other output will make gdb
1000b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            believes detach did not work. */
1001b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_ok (own_buf);
1002b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         putpkt (own_buf);
1003b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         remote_finish (reset_after_error);
1004b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         remote_open (VG_(clo_vgdb_prefix));
1005b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         myresume (0, 0);
1006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         resume_reply_packet_needed = False;
1007b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return;
1008b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case '!':
1009b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* We can not use the extended protocol with valgrind,
1010b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            because we can not restart the running
1011b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            program.  So return unrecognized.  */
1012b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         own_buf[0] = '\0';
1013b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1014b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case '?':
1015b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         prepare_resume_reply (own_buf, status, zignal);
1016b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1017b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'H':
1018b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (own_buf[1] == 'c' || own_buf[1] == 'g' || own_buf[1] == 's') {
1019b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            unsigned long gdb_id, thread_id;
1020b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1021b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            gdb_id = strtoul (&own_buf[2], NULL, 16);
1022b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            thread_id = gdb_id_to_thread_id (gdb_id);
1023b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (thread_id == 0) {
1024b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               write_enn (own_buf);
1025b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               break;
1026b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            }
1027b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1028b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (own_buf[1] == 'g') {
1029b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               general_thread = thread_id;
1030b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               set_desired_inferior (1);
1031b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            } else if (own_buf[1] == 'c') {
1032b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               cont_thread = thread_id;
1033b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            } else if (own_buf[1] == 's') {
1034b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               step_thread = thread_id;
1035b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            }
1036b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1037b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_ok (own_buf);
1038b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1039b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            /* Silently ignore it so that gdb can extend the protocol
1040b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               without compatibility headaches.  */
1041b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            own_buf[0] = '\0';
1042b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1043b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1044b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'g':
1045b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (1);
1046b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         registers_to_string (own_buf);
1047b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1048b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'G':
1049b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (1);
1050b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         registers_from_string (&own_buf[1]);
1051b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         write_ok (own_buf);
1052b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1053b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'P': {
1054b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int regno;
1055b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char *regbytes;
1056b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         Bool mod;
1057b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         ThreadState *tst;
1058b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         regno = strtol(&own_buf[1], NULL, 16);
1059b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         regbytes = strchr(&own_buf[0], '=') + 1;
1060b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (1);
1061b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         tst = (ThreadState *) inferior_target_data (current_inferior);
1062b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* Only accept changing registers in "runnable state3.
1063b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            In fact, it would be ok to change most of the registers
1064b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            except a few "sensitive" registers such as the PC, SP, BP.
1065b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            We assume we do not need to very specific here, and that we
1066b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            can just refuse all of these. */
1067b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (tst->status == VgTs_Runnable || tst->status == VgTs_Yielding) {
1068b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            supply_register_from_string (regno, regbytes, &mod);
1069b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_ok (own_buf);
1070b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1071b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            /* at least from gdb 6.6 onwards, an E. error
1072b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               reply is shown to the user. So, we do an error
1073b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               msg which both is accepted by gdb as an error msg
1074b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               and is readable by the user. */
1075b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            VG_(sprintf)
1076b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               (own_buf,
1077b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"E.\n"
1078b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"ERROR changing register %s regno %d\n"
1079b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"gdb commands changing registers (pc, sp, ...) (e.g. 'jump',\n"
1080b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"set pc, calling from gdb a function in the debugged process, ...)\n"
1081b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"can only be accepted if the thread is VgTs_Runnable or VgTs_Yielding state\n"
1082b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov"Thread status is %s\n",
1083b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                find_register_by_number (regno)->name, regno,
1084b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                VG_(name_of_ThreadStatus)(tst->status));
1085b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (VG_(clo_verbosity) > 1)
1086b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               VG_(umsg) ("%s\n", own_buf);
1087b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1088b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1089b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1090b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'm':
1091b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         decode_m_packet (&own_buf[1], &mem_addr, &len);
1092663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (valgrind_read_memory (mem_addr, mem_buf, len) == 0)
1093b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            convert_int_to_ascii (mem_buf, own_buf, len);
1094b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1095b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (own_buf);
1096b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1097b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'M':
1098b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (valgrind_write_memory (mem_addr, mem_buf, len) == 0)
1100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_ok (own_buf);
1101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (own_buf);
1103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'X':
1105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (decode_X_packet (&own_buf[1], packet_len - 1,
1106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                              &mem_addr, &len, mem_buf) < 0
1107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             || valgrind_write_memory (mem_addr, mem_buf, len) != 0)
1108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (own_buf);
1109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_ok (own_buf);
1111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'C':
1113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         convert_ascii_to_int (own_buf + 1, &sig, 1);
1114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (target_signal_to_host_p (sig))
1115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            zignal = target_signal_to_host (sig);
1116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            zignal = 0;
1118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (0);
1119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         myresume (0, zignal);
1120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return; // return control to valgrind
1121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'S':
1122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         convert_ascii_to_int (own_buf + 1, &sig, 1);
1123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (target_signal_to_host_p (sig))
1124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            zignal = target_signal_to_host (sig);
1125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            zignal = 0;
1127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (0);
1128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         myresume (1, zignal);
1129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return; // return control to valgrind
1130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'c':
1131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (0);
1132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         myresume (0, 0);
1133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return; // return control to valgrind
1134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 's':
1135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         set_desired_inferior (0);
1136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         myresume (1, 0);
1137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         return; // return control to valgrind
1138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'Z': {
1139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char *lenptr;
1140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char *dataptr;
1141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int zlen = strtol (lenptr + 1, &dataptr, 16);
1143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char type = own_buf[1];
1144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (type < '0' || type > '4') {
1146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* Watchpoint command type unrecognized. */
1147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            own_buf[0] = '\0';
1148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int res;
1150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            res = valgrind_insert_watchpoint (type, addr, zlen);
1152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (res == 0)
1153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               write_ok (own_buf);
1154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else if (res == 1)
1155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               /* Unsupported.  */
1156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               own_buf[0] = '\0';
1157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
1158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               write_enn (own_buf);
1159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'z': {
1163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char *lenptr;
1164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char *dataptr;
1165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
1166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         int zlen = strtol (lenptr + 1, &dataptr, 16);
1167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         char type = own_buf[1];
1168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (type < '0' || type > '4') {
1170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            /* Watchpoint command type unrecognized. */
1171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            own_buf[0] = '\0';
1172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         } else {
1173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            int res;
1174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            res = valgrind_remove_watchpoint (type, addr, zlen);
1176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            if (res == 0)
1177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               write_ok (own_buf);
1178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else if (res == 1)
1179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               /* Unsupported.  */
1180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               own_buf[0] = '\0';
1181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            else
1182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov               write_enn (own_buf);
1183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'k':
1187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         kill_request("Gdb request to kill this process\n");
1188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'T': {
1190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         unsigned long gdb_id, thread_id;
1191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         gdb_id = strtoul (&own_buf[1], NULL, 16);
1193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         thread_id = gdb_id_to_thread_id (gdb_id);
1194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if (thread_id == 0) {
1195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (own_buf);
1196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            break;
1197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         }
1198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (valgrind_thread_alive (thread_id))
1200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_ok (own_buf);
1201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         else
1202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            write_enn (own_buf);
1203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'R':
1206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* Restarting the inferior is only supported in the
1207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            extended protocol.
1208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            => It is a request we don't understand.  Respond with an
1209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            empty packet so that gdb knows that we don't support this
1210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            request.  */
1211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         own_buf[0] = '\0';
1212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      case 'v':
1214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* Extended (long) request.  */
1215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         handle_v_requests (own_buf, &status, &zignal);
1216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      default:
1218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         /* It is a request we don't understand.  Respond with an
1219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            empty packet so that gdb knows that we don't support this
1220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov            request.  */
1221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         own_buf[0] = '\0';
1222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         break;
1223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (new_packet_len != -1)
1226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         putpkt_binary (own_buf, new_packet_len);
1227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      else
1228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         putpkt (own_buf);
1229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (status == 'W')
1231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(umsg) ("\nChild exited with status %d\n", zignal);
1232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (status == 'X')
1233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(umsg) ("\nChild terminated with signal = 0x%x (%s)\n",
1234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    target_signal_to_host (zignal),
1235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                    target_signal_to_name (zignal));
1236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      if (status == 'W' || status == 'X') {
1237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(umsg) ("Process exiting\n");
1238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         VG_(exit) (0);
1239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      }
1240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
1241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
1242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* We come here when getpkt fails => close the connection,
1243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      and re-open. Then return control to valgrind.
1244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      We return the control to valgrind as we assume that
1245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      the connection was closed due to vgdb having finished
1246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      to execute a command. */
1247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (VG_(clo_verbosity) > 1)
1248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VG_(umsg) ("Remote side has terminated connection.  "
1249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                 "GDBserver will reopen the connection.\n");
1250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   remote_finish (reset_after_error);
1251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   remote_open (VG_(clo_vgdb_prefix));
1252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   myresume (0, 0);
1253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   resume_reply_packet_needed = False;
1254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return;
1255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
1256