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