1
2 /*--------------------------------------------------------------------*/
3 /*--- Handle remote gdb protocol. m_gdbserver.c ---*/
4 /*--------------------------------------------------------------------*/
5
6 /*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
10 Copyright (C) 2011-2012 Philippe Waroquiers
11
12 This program is free software; you can redistribute it and/or
13 modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation; either version 2 of the
15 License, or (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful, but
18 WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25 02111-1307, USA.
26
27 The GNU General Public License is contained in the file COPYING.
28 */
29
30 #include "pub_core_basics.h"
31 #include "pub_core_vki.h"
32 #include "pub_core_debuglog.h"
33 #include "pub_core_libcproc.h"
34 #include "pub_core_libcprint.h"
35 #include "pub_core_mallocfree.h"
36 #include "pub_core_gdbserver.h"
37 #include "pub_core_options.h"
38 #include "pub_core_libcsetjmp.h"
39 #include "pub_core_threadstate.h"
40 #include "pub_core_transtab.h"
41 #include "pub_tool_hashtable.h"
42 #include "pub_tool_xarray.h"
43 #include "pub_core_libcassert.h"
44 #include "pub_tool_libcbase.h"
45 #include "pub_core_libcsignal.h"
46 #include "pub_core_signals.h"
47 #include "pub_tool_machine.h" // VG_(fnptr_to_fnentry)
48 #include "pub_tool_debuginfo.h"
49 #include "pub_core_scheduler.h"
50 #include "pub_core_syswrap.h"
51
52 #include "server.h"
53
54 Int VG_(dyn_vgdb_error);
55
56 /* forward declarations */
57 VG_REGPARM(1)
58 void VG_(helperc_CallDebugger) ( HWord iaddr );
59 VG_REGPARM(1)
60 void VG_(helperc_invalidate_if_not_gdbserved) ( Addr addr );
61 static void invalidate_current_ip (ThreadId tid, char *who);
62
63 /* reasons of call to call_gdbserver. */
64 typedef
65 enum {
66 init_reason, // initialises gdbserver resources
67 vgdb_reason, // gdbserver invocation by vgdb doing ptrace
68 core_reason, // gdbserver invocation by core (e.g. error encountered)
69 break_reason, // break encountered
70 watch_reason, // watchpoint detected by tool
71 signal_reason} // signal encountered
72 CallReason;
73
ppCallReason(CallReason reason)74 static char* ppCallReason(CallReason reason)
75 {
76 switch (reason) {
77 case init_reason: return "init_reason";
78 case vgdb_reason: return "vgdb_reason";
79 case core_reason: return "core_reason";
80 case break_reason: return "break_reason";
81 case watch_reason: return "watch_reason";
82 case signal_reason: return "signal_reason";
83 default: vg_assert (0);
84 }
85 }
86
87 /* An instruction instrumented for gdbserver looks like this:
88 1. Ist_Mark (0x1234)
89 2. Put (IP, 0x1234)
90 3. helperc_CallDebugger (0x1234)
91 This will give control to gdb if there is a break at 0x1234
92 or if we are single stepping
93 4. ... here the real IR for the instruction at 0x1234
94
95 When there is a break at 0x1234:
96 if user does "continue" or "step" or similar,
97 then - the call to debugger returns
98 - valgrind executes at 3. the real IR(s) for 0x1234
99
100 if as part of helperc_CallDebugger, the user calls
101 some code in gdb e.g print hello_world()
102 then - gdb prepares a dummy stack frame with a specific
103 return address (typically it uses _start) and
104 inserts a break at this address
105 - gdb then puts in EIP the address of hello_world()
106 - gdb then continues (so the helperc_CallDebugger
107 returns)
108 - call_gdbserver() function will then return the
109 control to the scheduler (using VG_MINIMAL_LONGJMP)
110 to allow the block of the new EIP
111 to be executed.
112 - hello_world code is executed.
113 - when hello_world() returns, it returns to
114 _start and encounters the break at _start.
115 - gdb then removes this break, put 0x1234 in EIP
116 and does a "step". This causes to jump from
117 _start to 0x1234, where the call to
118 helperc_CallDebugger is redone.
119 - This is all ok, the user can then give new gdb
120 commands.
121
122 However, when continue is given, address 0x1234 is to
123 be executed: gdb gives a single step, which must not
124 report again the break at 0x1234. To avoid a 2nd report
125 of the same break, the below tells that the next
126 helperc_CallDebugger call must ignore a break/stop at
127 this address.
128 */
129 static Addr ignore_this_break_once = 0;
130
131
132 static void call_gdbserver ( ThreadId tid , CallReason reason);
133
134 /* Describes the address addr (for debugging/printing purposes).
135 Last two results are kept. A third call will replace the
136 oldest result. */
sym(Addr addr,Bool is_code)137 static char* sym (Addr addr, Bool is_code)
138 {
139 static char buf[2][200];
140 static int w = 0;
141 PtrdiffT offset;
142 if (w == 2) w = 0;
143 buf[w][0] = '\0';
144 if (is_code) {
145 VG_(describe_IP) (addr, buf[w], 200);
146 } else {
147 VG_(get_datasym_and_offset) (addr, buf[w], 200, &offset);
148 }
149 return buf[w++];
150 }
151
152 /* Each time gdbserver is called, gdbserver_called is incremented
153 gdbserver_exited is incremented when gdbserver is asked to exit */
154 static int gdbserver_called = 0;
155 static int gdbserver_exited = 0;
156
157 /* alloc and free functions for xarray and similar. */
gs_alloc(HChar * cc,SizeT sz)158 static void* gs_alloc (HChar* cc, SizeT sz)
159 {
160 void* res = VG_(arena_malloc)(VG_AR_CORE, cc, sz);
161 vg_assert (res);
162 return res;
163 }
gs_free(void * ptr)164 static void gs_free (void* ptr)
165 {
166 VG_(arena_free)(VG_AR_CORE, ptr);
167 }
168
169 typedef
170 enum {
171 GS_break,
172 GS_jump
173 }
174 GS_Kind;
175
176 typedef
177 struct _GS_Address {
178 struct _GS_Address* next;
179 Addr addr;
180 GS_Kind kind;
181 }
182 GS_Address;
183
184 /* gs_addresses contains a list of all addresses that have been invalidated
185 because they have been (or must be) instrumented for gdbserver.
186 An entry is added in this table when there is a break at this
187 address (kind == GS_break) or if this address is the jump target of an
188 exit of a block that has been instrumented for gdbserver while
189 single stepping (kind == GS_jump).
190 When gdbserver is not single stepping anymore, all GS_jump entries
191 are removed, their translations are invalidated.
192
193 Note for ARM: addr in GS_Address is the value without the thumb bit set.
194 */
195 static VgHashTable gs_addresses = NULL;
196
197 // Transform addr in the form stored in the list of addresses.
198 // For the ARM architecture, we store it with the thumb bit set to 0.
HT_addr(Addr addr)199 static Addr HT_addr ( Addr addr )
200 {
201 #if defined(VGA_arm)
202 return addr & ~(Addr)1;
203 #else
204 return addr;
205 #endif
206 }
207
add_gs_address(Addr addr,GS_Kind kind,char * from)208 static void add_gs_address (Addr addr, GS_Kind kind, char* from)
209 {
210 GS_Address *p;
211
212 p = VG_(arena_malloc)(VG_AR_CORE, from, sizeof(GS_Address));
213 p->addr = HT_addr (addr);
214 p->kind = kind;
215 VG_(HT_add_node)(gs_addresses, p);
216 /* It should be sufficient to discard a range of 1.
217 We use 2 to ensure the below is not sensitive to the presence
218 of thumb bit in the range of addresses to discard. */
219 VG_(discard_translations) (addr, 2, from);
220 }
221
remove_gs_address(GS_Address * g,char * from)222 static void remove_gs_address (GS_Address* g, char* from)
223 {
224 VG_(HT_remove) (gs_addresses, g->addr);
225 // See add_gs_address for the explanation for the range 2 below.
226 VG_(discard_translations) (g->addr, 2, from);
227 VG_(arena_free) (VG_AR_CORE, g);
228 }
229
VG_(ppPointKind)230 char* VG_(ppPointKind) (PointKind kind)
231 {
232 switch(kind) {
233 case software_breakpoint: return "software_breakpoint";
234 case hardware_breakpoint: return "hardware_breakpoint";
235 case write_watchpoint: return "write_watchpoint";
236 case read_watchpoint: return "read_watchpoint";
237 case access_watchpoint: return "access_watchpoint";
238 default: return "???wrong PointKind";
239 }
240 }
241
242 typedef
243 struct _GS_Watch {
244 Addr addr;
245 SizeT len;
246 PointKind kind;
247 }
248 GS_Watch;
249
250 /* gs_watches contains a list of all addresses+len+kind that are being
251 watched. */
252 static XArray* gs_watches = NULL;
253
index_gs_watches(Word i)254 static inline GS_Watch* index_gs_watches(Word i)
255 {
256 return *(GS_Watch **) VG_(indexXA) (gs_watches, i);
257 }
258
259 /* Returns the GS_Watch matching addr/len/kind and sets *g_ix to its
260 position in gs_watches.
261 If no matching GS_Watch is found, returns NULL and sets g_ix to -1. */
lookup_gs_watch(Addr addr,SizeT len,PointKind kind,Word * g_ix)262 static GS_Watch* lookup_gs_watch (Addr addr, SizeT len, PointKind kind,
263 Word* g_ix)
264 {
265 const Word n_elems = VG_(sizeXA) (gs_watches);
266 Word i;
267 GS_Watch *g;
268
269 /* Linear search. If we have many watches, this might be optimised
270 by having the array sorted and using VG_(lookupXA) */
271 for (i = 0; i < n_elems; i++) {
272 g = index_gs_watches(i);
273 if (g->addr == addr && g->len == len && g->kind == kind) {
274 // Found.
275 *g_ix = i;
276 return g;
277 }
278 }
279
280 // Not found.
281 *g_ix = -1;
282 return NULL;
283 }
284
285
286 /* protocol spec tells the below must be idempotent. */
breakpoint(Bool insert,CORE_ADDR addr)287 static void breakpoint (Bool insert, CORE_ADDR addr)
288 {
289 GS_Address *g;
290
291 g = VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(addr));
292 if (insert) {
293 /* insert a breakpoint at addr or upgrade its kind */
294 if (g == NULL) {
295 add_gs_address (addr, GS_break, "m_gdbserver breakpoint insert");
296 } else {
297 /* already gdbserved. Normally, it must be because of a jump.
298 However, due to idempotent or if connection with gdb was
299 lost (kept breaks from the previous gdb), if already existing,
300 we just upgrade its kind. */
301 g->kind = GS_break;
302 }
303 } else {
304 /* delete a breakpoint at addr or downgrade its kind */
305 if (g != NULL && g->kind == GS_break) {
306 if (valgrind_single_stepping()) {
307 /* keep gdbserved instrumentation while single stepping */
308 g->kind = GS_jump;
309 } else {
310 remove_gs_address (g, "m_gdbserver breakpoint remove");
311 }
312 } else {
313 dlog (1, "remove break addr %p %s\n",
314 C2v(addr), (g == NULL ?
315 "NULL" :
316 (g->kind == GS_jump ? "GS_jump" : "GS_break")));
317 }
318 }
319 }
320
321 static Bool (*tool_watchpoint) (PointKind kind,
322 Bool insert,
323 Addr addr,
324 SizeT len) = NULL;
VG_(needs_watchpoint)325 void VG_(needs_watchpoint) (Bool (*watchpoint) (PointKind kind,
326 Bool insert,
327 Addr addr,
328 SizeT len))
329 {
330 tool_watchpoint = watchpoint;
331 }
332
VG_(gdbserver_point)333 Bool VG_(gdbserver_point) (PointKind kind, Bool insert,
334 CORE_ADDR addr, int len)
335 {
336 Bool res;
337 GS_Watch *g;
338 Word g_ix;
339 Bool is_code = kind == software_breakpoint || kind == hardware_breakpoint;
340
341 dlog(1, "%s %s at addr %p %s\n",
342 (insert ? "insert" : "remove"),
343 VG_(ppPointKind) (kind),
344 C2v(addr),
345 sym(addr, is_code));
346
347 if (is_code) {
348 breakpoint (insert, addr);
349 return True;
350 }
351
352 vg_assert (kind == access_watchpoint
353 || kind == read_watchpoint
354 || kind == write_watchpoint);
355
356 if (tool_watchpoint == NULL)
357 return False;
358
359 res = (*tool_watchpoint) (kind, insert, addr, len);
360 if (!res)
361 return False; /* error or unsupported */
362
363 // Protocol says insert/remove must be idempotent.
364 // So, we just ignore double insert or (supposed) double delete.
365
366 g = lookup_gs_watch (addr, len, kind, &g_ix);
367 if (insert) {
368 if (g == NULL) {
369 g = VG_(arena_malloc)(VG_AR_CORE, "gdbserver_point watchpoint",
370 sizeof(GS_Watch));
371 g->addr = addr;
372 g->len = len;
373 g->kind = kind;
374 VG_(addToXA)(gs_watches, &g);
375 } else {
376 dlog(1,
377 "VG_(gdbserver_point) addr %p len %d kind %s already inserted\n",
378 C2v(addr), len, VG_(ppPointKind) (kind));
379 }
380 } else {
381 if (g != NULL) {
382 VG_(removeIndexXA) (gs_watches, g_ix);
383 VG_(arena_free) (VG_AR_CORE, g);
384 } else {
385 dlog(1,
386 "VG_(gdbserver_point) addr %p len %d kind %s already deleted?\n",
387 C2v(addr), len, VG_(ppPointKind) (kind));
388 }
389 }
390 return True;
391 }
392
VG_(is_watched)393 Bool VG_(is_watched)(PointKind kind, Addr addr, Int szB)
394 {
395 Word n_elems;
396 GS_Watch* g;
397 Word i;
398 Bool watched = False;
399 const ThreadId tid = VG_(running_tid);
400
401 if (!gdbserver_called)
402 return False;
403
404 n_elems = VG_(sizeXA) (gs_watches);
405
406 Addr to = addr + szB; // semi-open interval [addr, to[
407
408 vg_assert (kind == access_watchpoint
409 || kind == read_watchpoint
410 || kind == write_watchpoint);
411 dlog(1, "tid %d VG_(is_watched) %s addr %p szB %d\n",
412 tid, VG_(ppPointKind) (kind), C2v(addr), szB);
413
414 for (i = 0; i < n_elems; i++) {
415 g = index_gs_watches(i);
416 switch (g->kind) {
417 case software_breakpoint:
418 case hardware_breakpoint:
419 break;
420 case access_watchpoint:
421 case read_watchpoint:
422 case write_watchpoint:
423 if (to <= g->addr || addr >= (g->addr + g->len))
424 /* If no overlap, examine next watchpoint: */
425 continue;
426
427 watched = True; /* We have an overlap */
428
429 /* call gdbserver if access kind reported by the tool
430 matches the watchpoint kind. */
431 if (kind == access_watchpoint
432 || g->kind == access_watchpoint
433 || g->kind == kind) {
434 /* Watchpoint encountered.
435 If this is a read watchpoint, we directly call gdbserver
436 to report it to gdb.
437 Otherwise, for a write watchpoint, we have to finish
438 the instruction so as to modify the value.
439 If we do not finish the instruction, then gdb sees no
440 value change and continues.
441 For a read watchpoint, we better call gdbserver directly:
442 in case the current block is not gdbserved, Valgrind
443 will execute instructions till the next block. */
444
445 /* set the watchpoint stop address to the first read or written. */
446 if (g->addr <= addr) {
447 VG_(set_watchpoint_stop_address) (addr);
448 } else {
449 VG_(set_watchpoint_stop_address) (g->addr);
450 }
451
452 if (kind == write_watchpoint) {
453 /* Let Valgrind stop as early as possible after this instruction
454 by switching to Single Stepping mode. */
455 valgrind_set_single_stepping (True);
456 invalidate_current_ip (tid, "m_gdbserver write watchpoint");
457 } else {
458 call_gdbserver (tid, watch_reason);
459 VG_(set_watchpoint_stop_address) ((Addr) 0);
460 }
461 return True; // we are watched here.
462 }
463 break;
464 default:
465 vg_assert (0);
466 }
467 }
468 return watched;
469 }
470
471 /* Returns the reason for which gdbserver instrumentation is needed */
VG_(gdbserver_instrumentation_needed)472 static VgVgdb VG_(gdbserver_instrumentation_needed) (VexGuestExtents* vge)
473 {
474 GS_Address* g;
475 int e;
476
477 if (!gdbserver_called)
478 return Vg_VgdbNo;
479
480 if (valgrind_single_stepping()) {
481 dlog(2, "gdbserver_instrumentation_needed due to single stepping\n");
482 return Vg_VgdbYes;
483 }
484
485 if (VG_(clo_vgdb) == Vg_VgdbYes && VG_(HT_count_nodes) (gs_addresses) == 0)
486 return Vg_VgdbNo;
487
488 /* We assume we do not have a huge nr of breakpoints.
489 Otherwise, we need something more efficient e.g.
490 a sorted list of breakpoints or associate extents to it or ...
491 */
492 VG_(HT_ResetIter) (gs_addresses);
493 while ((g = VG_(HT_Next) (gs_addresses))) {
494 for (e = 0; e < vge->n_used; e++) {
495 if (g->addr >= HT_addr(vge->base[e])
496 && g->addr < HT_addr(vge->base[e]) + vge->len[e]) {
497 dlog(2,
498 "gdbserver_instrumentation_needed %p %s reason %s\n",
499 C2v(g->addr), sym(g->addr, /* is_code */ True),
500 (g->kind == GS_jump ? "GS_jump" : "GS_break"));
501 return Vg_VgdbYes;
502 }
503 }
504 }
505
506 if (VG_(clo_vgdb) == Vg_VgdbFull) {
507 dlog(4, "gdbserver_instrumentation_needed"
508 " due to VG_(clo_vgdb) == Vg_VgdbFull\n");
509 return Vg_VgdbFull;
510 }
511
512
513 return Vg_VgdbNo;
514 }
515
516 // Clear gdbserved_addresses in gs_addresses.
517 // If clear_only_jumps, clears only the addresses that are served
518 // for jump reasons.
519 // Otherwise, clear all the addresses.
520 // Cleared addresses are invalidated so as to have them re-translated.
clear_gdbserved_addresses(Bool clear_only_jumps)521 static void clear_gdbserved_addresses(Bool clear_only_jumps)
522 {
523 GS_Address** ag;
524 UInt n_elems;
525 int i;
526
527 dlog(1,
528 "clear_gdbserved_addresses: scanning hash table nodes %d\n",
529 VG_(HT_count_nodes) (gs_addresses));
530 ag = (GS_Address**) VG_(HT_to_array) (gs_addresses, &n_elems);
531 for (i = 0; i < n_elems; i++)
532 if (!clear_only_jumps || ag[i]->kind == GS_jump)
533 remove_gs_address (ag[i], "clear_gdbserved_addresses");
534 VG_(free) (ag);
535 }
536
537 // Clear watched addressed in gs_watches, delete gs_watches.
clear_watched_addresses(void)538 static void clear_watched_addresses(void)
539 {
540 GS_Watch* g;
541 const Word n_elems = VG_(sizeXA) (gs_watches);
542 Word i;
543
544 dlog(1,
545 "clear_watched_addresses: %ld elements\n",
546 n_elems);
547
548 for (i = 0; i < n_elems; i++) {
549 g = index_gs_watches(i);
550 if (!VG_(gdbserver_point) (g->kind,
551 /* insert */ False,
552 g->addr,
553 g->len)) {
554 vg_assert (0);
555 }
556 }
557
558 VG_(deleteXA) (gs_watches);
559 gs_watches = NULL;
560 }
561
invalidate_if_jump_not_yet_gdbserved(Addr addr,char * from)562 static void invalidate_if_jump_not_yet_gdbserved (Addr addr, char* from)
563 {
564 if (VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(addr)))
565 return;
566 add_gs_address (addr, GS_jump, from);
567 }
568
invalidate_current_ip(ThreadId tid,char * who)569 static void invalidate_current_ip (ThreadId tid, char *who)
570 {
571 invalidate_if_jump_not_yet_gdbserved (VG_(get_IP) (tid), who);
572 }
573
VG_(gdbserver_prerun_action)574 void VG_(gdbserver_prerun_action) (ThreadId tid)
575 {
576 // Using VG_(dyn_vgdb_error) allows the user to control if gdbserver
577 // stops after a fork.
578 if (VG_(dyn_vgdb_error) == 0) {
579 /* The below call allows gdb to attach at startup
580 before the first guest instruction is executed. */
581 VG_(umsg)("(action at startup) vgdb me ... \n");
582 VG_(gdbserver)(tid);
583 } else {
584 /* User has activated gdbserver => initialize now the FIFOs
585 to let vgdb/gdb contact us either via the scheduler poll
586 mechanism or via vgdb ptrace-ing valgrind. */
587 if (VG_(gdbserver_activity) (tid))
588 VG_(gdbserver) (tid);
589 }
590 }
591
592 /* when fork is done, various cleanup is needed in the child process.
593 In particular, child must have its own connection to avoid stealing
594 data from its parent */
gdbserver_cleanup_in_child_after_fork(ThreadId me)595 static void gdbserver_cleanup_in_child_after_fork(ThreadId me)
596 {
597 dlog(1, "thread %d gdbserver_cleanup_in_child_after_fork pid %d\n",
598 me, VG_(getpid) ());
599
600 /* finish connection inheritated from parent */
601 remote_finish(reset_after_fork);
602
603 /* ensure next call to gdbserver will be considered as a brand
604 new call that will initialize a fresh gdbserver. */
605 if (gdbserver_called) {
606 gdbserver_called = 0;
607 vg_assert (gs_addresses != NULL);
608 vg_assert (gs_watches != NULL);
609 clear_gdbserved_addresses(/* clear only jumps */ False);
610 VG_(HT_destruct) (gs_addresses, VG_(free));
611 gs_addresses = NULL;
612 clear_watched_addresses();
613 } else {
614 vg_assert (gs_addresses == NULL);
615 vg_assert (gs_watches == NULL);
616 }
617
618
619 if (VG_(clo_trace_children)) {
620 VG_(gdbserver_prerun_action) (me);
621 }
622 }
623
624 /* If reason is init_reason, creates the connection resources (e.g.
625 the FIFOs) to allow a gdb connection to be detected by polling
626 using remote_desc_activity.
627 Otherwise (other reasons):
628 If connection with gdb not yet opened, opens the connection with gdb.
629 reads gdb remote protocol packets and executes the requested commands.
630 */
call_gdbserver(ThreadId tid,CallReason reason)631 static void call_gdbserver ( ThreadId tid , CallReason reason)
632 {
633 ThreadState* tst = VG_(get_ThreadState)(tid);
634 int stepping;
635 Addr saved_pc;
636
637 dlog(1,
638 "entering call_gdbserver %s ... pid %d tid %d status %s "
639 "sched_jmpbuf_valid %d\n",
640 ppCallReason (reason),
641 VG_(getpid) (), tid, VG_(name_of_ThreadStatus)(tst->status),
642 tst->sched_jmpbuf_valid);
643
644 vg_assert(VG_(is_valid_tid)(tid));
645 saved_pc = VG_(get_IP) (tid);
646
647 if (gdbserver_exited) {
648 dlog(0, "call_gdbserver called when gdbserver_exited %d\n",
649 gdbserver_exited);
650 return;
651 }
652
653 if (gdbserver_called == 0) {
654 vg_assert (gs_addresses == NULL);
655 vg_assert (gs_watches == NULL);
656 gs_addresses = VG_(HT_construct)( "gdbserved_addresses" );
657 gs_watches = VG_(newXA)(gs_alloc,
658 "gdbserved_watches",
659 gs_free,
660 sizeof(GS_Watch*));
661 VG_(atfork)(NULL, NULL, gdbserver_cleanup_in_child_after_fork);
662 }
663 vg_assert (gs_addresses != NULL);
664 vg_assert (gs_watches != NULL);
665
666 gdbserver_called++;
667
668 /* call gdbserver_init if this is the first call to gdbserver. */
669 if (gdbserver_called == 1)
670 gdbserver_init();
671
672 if (reason == init_reason || gdbserver_called == 1)
673 remote_open(VG_(clo_vgdb_prefix));
674
675 /* if the call reason is to initialize, then return control to
676 valgrind. After this initialization, gdbserver will be called
677 again either if there is an error detected by valgrind or
678 if vgdb sends data to the valgrind process. */
679 if (reason == init_reason) {
680 return;
681 }
682
683 stepping = valgrind_single_stepping();
684
685 server_main();
686
687 ignore_this_break_once = valgrind_get_ignore_break_once();
688 if (ignore_this_break_once)
689 dlog(1, "!!! will ignore_this_break_once %s\n",
690 sym(ignore_this_break_once, /* is_code */ True));
691
692
693 if (valgrind_single_stepping()) {
694 /* we are single stepping. If we were not stepping on entry,
695 then invalidate the current program counter so as to properly
696 do single step. In case the program counter was changed by
697 gdb, this will also invalidate the target address we will
698 jump to. */
699 if (!stepping && tid != 0) {
700 invalidate_current_ip (tid, "m_gdbserver single step");
701 }
702 } else {
703 /* We are not single stepping. If we were stepping on entry,
704 then clear the gdbserved addresses. This will cause all
705 these gdbserved blocks to be invalidated so that they can be
706 re-translated without being gdbserved. */
707 if (stepping)
708 clear_gdbserved_addresses(/* clear only jumps */ True);
709 }
710
711 /* can't do sanity check at beginning. At least the stack
712 check is not yet possible. */
713 if (gdbserver_called > 1)
714 VG_(sanity_check_general) (/* force_expensive */ False);
715
716 /* If the PC has been changed by gdb, then we VG_MINIMAL_LONGJMP to
717 the scheduler to execute the block of the new PC.
718 Otherwise we just return to continue executing the
719 current block. */
720 if (VG_(get_IP) (tid) != saved_pc) {
721 dlog(1, "tid %d %s PC changed from %s to %s\n",
722 tid, VG_(name_of_ThreadStatus) (tst->status),
723 sym(saved_pc, /* is_code */ True),
724 sym(VG_(get_IP) (tid), /* is_code */ True));
725 if (tst->status == VgTs_Yielding) {
726 SysRes sres;
727 VG_(memset)(&sres, 0, sizeof(SysRes));
728 VG_(acquire_BigLock)(tid, "gdbsrv VG_MINIMAL_LONGJMP");
729 }
730 if (tst->sched_jmpbuf_valid) {
731 /* resume scheduler */
732 VG_MINIMAL_LONGJMP(tst->sched_jmpbuf);
733 }
734 /* else continue to run */
735 }
736 /* continue to run */
737 }
738
739 /* busy > 0 when gdbserver is currently being called.
740 busy is used to to avoid vgdb invoking gdbserver
741 while gdbserver by Valgrind. */
742 static volatile int busy = 0;
743
VG_(gdbserver)744 void VG_(gdbserver) ( ThreadId tid )
745 {
746 busy++;
747 /* called by the rest of valgrind for
748 --vgdb-error=0 reason
749 or by scheduler "poll/debug/interrupt" reason
750 or to terminate. */
751 if (tid != 0) {
752 call_gdbserver (tid, core_reason);
753 } else {
754 if (gdbserver_called == 0) {
755 dlog(1, "VG_(gdbserver) called to terminate, nothing to terminate\n");
756 } else if (gdbserver_exited) {
757 dlog(0, "VG_(gdbserver) called to terminate again %d\n",
758 gdbserver_exited);
759 } else {
760 gdbserver_terminate();
761 gdbserver_exited++;
762 }
763 }
764 busy--;
765 }
766
767 // nr of invoke_gdbserver while gdbserver is already executing.
768 static int interrupts_while_busy = 0;
769
770 // nr of invoke_gdbserver while gdbserver is not executing.
771 static int interrupts_non_busy = 0;
772
773 // nr of invoke_gdbserver when some threads are not interruptible.
774 static int interrupts_non_interruptible = 0;
775
776 /* When all threads are blocked in a system call, the Valgrind
777 scheduler cannot poll the shared memory for gdbserver activity. In
778 such a case, vgdb will force the invokation of gdbserver using
779 ptrace. To do that, vgdb 'pushes' a call to invoke_gdbserver
780 on the stack using ptrace. invoke_gdbserver must not return.
781 Instead, it must call give_control_back_to_vgdb.
782 vgdb expects to receive a SIGSTOP, which this function generates.
783 When vgdb gets this SIGSTOP, it knows invoke_gdbserver call
784 is finished and can reset the Valgrind process in the state prior to
785 the 'pushed call' (using ptrace again).
786 This all works well. However, the user must avoid
787 'kill-9ing' vgdb during such a pushed call, otherwise
788 the SIGSTOP generated below will be seen by the Valgrind core,
789 instead of being handled by vgdb. The OS will then handle the SIGSTOP
790 by stopping the Valgrind process.
791 We use SIGSTOP as this process cannot be masked. */
792
give_control_back_to_vgdb(void)793 static void give_control_back_to_vgdb(void)
794 {
795 /* cause a SIGSTOP to be sent to ourself, so that vgdb takes control.
796 vgdb will then restore the stack so as to resume the activity
797 before the ptrace (typically do_syscall_WRK). */
798 if (VG_(kill)(VG_(getpid)(), VKI_SIGSTOP) != 0)
799 vg_assert2(0, "SIGSTOP for vgdb could not be generated\n");
800
801 /* If we arrive here, it means a call was pushed on the stack
802 by vgdb, but during this call, vgdb and/or connection
803 died. Alternatively, it is a bug in the vgdb<=>Valgrind gdbserver
804 ptrace handling. */
805 vg_assert2(0,
806 "vgdb did not took control. Did you kill vgdb ?\n"
807 "busy %d vgdb_interrupted_tid %d\n",
808 busy, vgdb_interrupted_tid);
809 }
810
811 /* Using ptrace calls, vgdb will force an invocation of gdbserver.
812 VG_(invoke_gdbserver) is the entry point called through the
813 vgdb ptrace technique. */
VG_(invoke_gdbserver)814 void VG_(invoke_gdbserver) ( int check )
815 {
816 /* ******* Avoid non-reentrant function call from here .....
817 till the ".... till here" below. */
818
819 /* We need to determine the state of the various threads to decide
820 if we directly invoke gdbserver or if we rather indicate to the
821 scheduler to invoke the gdbserver. To decide that, it is
822 critical to avoid any "coregrind" function call as the ptrace
823 might have stopped the process in the middle of this (possibly)
824 non-rentrant function. So, it is only when all threads are in
825 an "interruptible" state that we can safely invoke
826 gdbserver. Otherwise, we let the valgrind scheduler invoke
827 gdbserver at the next poll. This poll will be made very soon
828 thanks to a call to VG_(force_vgdb_poll). */
829 int n_tid;
830
831 vg_assert (check == 0x8BADF00D);
832
833 if (busy) {
834 interrupts_while_busy++;
835 give_control_back_to_vgdb();
836 }
837 interrupts_non_busy++;
838
839 /* check if all threads are in an "interruptible" state. If yes,
840 we invoke gdbserver. Otherwise, we tell the scheduler to wake up
841 asap. */
842 for (n_tid = 1; n_tid < VG_N_THREADS; n_tid++) {
843 switch (VG_(threads)[n_tid].status) {
844 /* interruptible states. */
845 case VgTs_WaitSys:
846 case VgTs_Yielding:
847 if (vgdb_interrupted_tid == 0) vgdb_interrupted_tid = n_tid;
848 break;
849
850 case VgTs_Empty:
851 case VgTs_Zombie:
852 break;
853
854 /* non interruptible states. */
855 case VgTs_Init:
856 case VgTs_Runnable:
857 interrupts_non_interruptible++;
858 VG_(force_vgdb_poll) ();
859 give_control_back_to_vgdb();
860
861 default: vg_assert(0);
862 }
863 }
864
865 /* .... till here.
866 From here onwards, function calls are ok: it is
867 safe to call valgrind core functions: all threads are blocked in
868 a system call or are yielding or ... */
869 dlog(1, "invoke_gdbserver running_tid %d vgdb_interrupted_tid %d\n",
870 VG_(running_tid), vgdb_interrupted_tid);
871 call_gdbserver (vgdb_interrupted_tid, vgdb_reason);
872 vgdb_interrupted_tid = 0;
873 dlog(1,
874 "exit invoke_gdbserver running_tid %d\n", VG_(running_tid));
875 give_control_back_to_vgdb();
876
877 vg_assert2(0, "end of invoke_gdbserver reached");
878
879 }
880
VG_(gdbserver_activity)881 Bool VG_(gdbserver_activity) (ThreadId tid)
882 {
883 Bool ret;
884 busy++;
885 if (!gdbserver_called)
886 call_gdbserver (tid, init_reason);
887 switch (remote_desc_activity("VG_(gdbserver_activity)")) {
888 case 0: ret = False; break;
889 case 1: ret = True; break;
890 case 2: call_gdbserver (tid, init_reason); ret = False; break;
891 default: vg_assert (0);
892 }
893 busy--;
894 return ret;
895 }
896
VG_(gdbserver_report_signal)897 Bool VG_(gdbserver_report_signal) (Int vki_sigNo, ThreadId tid)
898 {
899 dlog(1, "VG core calling VG_(gdbserver_report_signal) "
900 "vki_nr %d %s gdb_nr %d %s tid %d\n",
901 vki_sigNo, VG_(signame)(vki_sigNo),
902 target_signal_from_host (vki_sigNo),
903 target_signal_to_name(target_signal_from_host (vki_sigNo)),
904 tid);
905
906 /* if gdbserver is currently not connected, then signal
907 is to be given to the process */
908 if (!remote_connected()) {
909 dlog(1, "not connected => pass\n");
910 return True;
911 }
912 /* if gdb has informed gdbserver that this signal can be
913 passed directly without informing gdb, then signal is
914 to be given to the process. */
915 if (pass_signals[target_signal_from_host(vki_sigNo)]) {
916 dlog(1, "pass_signals => pass\n");
917 return True;
918 }
919
920 /* indicate to gdbserver that there is a signal */
921 gdbserver_signal_encountered (vki_sigNo);
922
923 /* let gdbserver do some work, e.g. show the signal to the user */
924 call_gdbserver (tid, signal_reason);
925
926 /* ask gdbserver what is the final decision */
927 if (gdbserver_deliver_signal (vki_sigNo)) {
928 dlog(1, "gdbserver deliver signal\n");
929 return True;
930 } else {
931 dlog(1, "gdbserver ignore signal\n");
932 return False;
933 }
934 }
935
936 // Check if single_stepping or if there is a break requested at iaddr.
937 // If yes, call debugger
938 VG_REGPARM(1)
VG_(helperc_CallDebugger)939 void VG_(helperc_CallDebugger) ( HWord iaddr )
940 {
941 GS_Address* g;
942
943 // For Vg_VgdbFull, after a fork, we might have calls to this helper
944 // while gdbserver is not yet initialized.
945 if (!gdbserver_called)
946 return;
947
948 if (valgrind_single_stepping() ||
949 ((g = VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(iaddr))) &&
950 (g->kind == GS_break))) {
951 if (iaddr == HT_addr(ignore_this_break_once)) {
952 dlog(1, "ignoring ignore_this_break_once %s\n",
953 sym(ignore_this_break_once, /* is_code */ True));
954 ignore_this_break_once = 0;
955 } else {
956 call_gdbserver (VG_(get_running_tid)(), break_reason);
957 }
958 }
959 }
960
961 /* software_breakpoint support --------------------------------------*/
962 /* When a block is instrumented for gdbserver, single step and breaks
963 will be obeyed in this block. However, if a jump to another block
964 is executed while single_stepping is active, we must ensure that
965 this block is also instrumented. For this, when a block is
966 instrumented for gdbserver while single_stepping, the target of all
967 the Jump instructions in this block will be checked to verify if
968 the block is already instrumented for gdbserver. The below will
969 ensure that if not already instrumented for gdbserver, the target
970 block translation containing addr will be invalidated. The list of
971 gdbserved Addr will also be kept so that translations can be
972 dropped automatically by gdbserver when going out of single step
973 mode.
974
975 Call the below at translation time if the jump target is a constant.
976 Otherwise, rather use VG_(add_stmt_call_invalidate_if_not_gdbserved).
977
978 To instrument the target exit statement, you can call
979 VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved) rather
980 than check the kind of target exit. */
VG_(invalidate_if_not_gdbserved)981 static void VG_(invalidate_if_not_gdbserved) (Addr addr)
982 {
983 if (valgrind_single_stepping())
984 invalidate_if_jump_not_yet_gdbserved
985 (addr, "gdbserver target jump (instrument)");
986 }
987
988 // same as VG_(invalidate_if_not_gdbserved) but is intended to be called
989 // at runtime (only difference is the invalidate reason which traces
990 // it is at runtime)
991 VG_REGPARM(1)
VG_(helperc_invalidate_if_not_gdbserved)992 void VG_(helperc_invalidate_if_not_gdbserved) ( Addr addr )
993 {
994 if (valgrind_single_stepping())
995 invalidate_if_jump_not_yet_gdbserved
996 (addr, "gdbserver target jump (runtime)");
997 }
998
VG_(add_stmt_call_invalidate_if_not_gdbserved)999 static void VG_(add_stmt_call_invalidate_if_not_gdbserved)
1000 ( IRSB* sb_in,
1001 VexGuestLayout* layout,
1002 VexGuestExtents* vge,
1003 IRTemp jmp,
1004 IRSB* irsb)
1005 {
1006
1007 void* fn;
1008 HChar* nm;
1009 IRExpr** args;
1010 Int nargs;
1011 IRDirty* di;
1012
1013 fn = &VG_(helperc_invalidate_if_not_gdbserved);
1014 nm = "VG_(helperc_invalidate_if_not_gdbserved)";
1015 args = mkIRExprVec_1(IRExpr_RdTmp (jmp));
1016 nargs = 1;
1017
1018 di = unsafeIRDirty_0_N( nargs/*regparms*/, nm,
1019 VG_(fnptr_to_fnentry)( fn ), args );
1020
1021 di->nFxState = 0;
1022
1023 addStmtToIRSB(irsb, IRStmt_Dirty(di));
1024 }
1025
1026 /* software_breakpoint support --------------------------------------*/
1027 /* If a tool wants to allow gdbserver to do something at Addr, then
1028 VG_(add_stmt_call_gdbserver) will add in IRSB a call to a helper
1029 function. This helper function will check if the process must be
1030 stopped at the instruction Addr: either there is a break at Addr or
1031 the process is being single-stepped. Typical usage of the below is to
1032 instrument an Ist_IMark to allow the debugger to interact at any
1033 instruction being executed. As soon as there is one break in a block,
1034 then to allow single stepping in this block (and possible insertions
1035 of other breaks in the same sb_in while the process is stopped), a
1036 debugger statement will be inserted for all instructions of a block. */
VG_(add_stmt_call_gdbserver)1037 static void VG_(add_stmt_call_gdbserver)
1038 (IRSB* sb_in, /* block being translated */
1039 VexGuestLayout* layout,
1040 VexGuestExtents* vge,
1041 IRType gWordTy, IRType hWordTy,
1042 Addr iaddr, /* Addr of instruction being instrumented */
1043 UChar delta, /* delta to add to iaddr to obtain IP */
1044 IRSB* irsb) /* irsb block to which call is added */
1045 {
1046 void* fn;
1047 HChar* nm;
1048 IRExpr** args;
1049 Int nargs;
1050 IRDirty* di;
1051
1052 /* first store the address in the program counter so that the check
1053 done by VG_(helperc_CallDebugger) will be based on the correct
1054 program counter. We might make this more efficient by rather
1055 searching for assignement to program counter and instrumenting
1056 that but the below is easier and I guess that the optimiser will
1057 remove the redundant store. And in any case, when debugging a
1058 piece of code, the efficiency requirement is not critical: very
1059 few blocks will be instrumented for debugging. */
1060
1061 /* For platforms on which the IP can differ from the addr of the instruction
1062 being executed, we need to add the delta to obtain the IP.
1063 This IP will be given to gdb (e.g. if a breakpoint is put at iaddr).
1064
1065 For ARM, this delta will ensure that the thumb bit is set in the
1066 IP when executing thumb code. gdb uses this thumb bit a.o.
1067 to properly guess the next IP for the 'step' and 'stepi' commands. */
1068 vg_assert(delta <= 1);
1069 addStmtToIRSB(irsb, IRStmt_Put(layout->offset_IP ,
1070 mkIRExpr_HWord(iaddr + (Addr)delta)));
1071
1072 fn = &VG_(helperc_CallDebugger);
1073 nm = "VG_(helperc_CallDebugger)";
1074 args = mkIRExprVec_1(mkIRExpr_HWord (iaddr));
1075 nargs = 1;
1076
1077 di = unsafeIRDirty_0_N( nargs/*regparms*/, nm,
1078 VG_(fnptr_to_fnentry)( fn ), args );
1079
1080 /* Note: in fact, a debugger call can read whatever register
1081 or memory. It can also write whatever register or memory.
1082 So, in theory, we have to indicate the whole universe
1083 can be read and modified. It is however not critical
1084 to indicate precisely what is being read/written
1085 as such indications are needed for tool error detection
1086 and we do not want to have errors being detected for
1087 gdb interactions. */
1088
1089 di->nFxState = 2;
1090 di->fxState[0].fx = Ifx_Read;
1091 di->fxState[0].offset = layout->offset_SP;
1092 di->fxState[0].size = layout->sizeof_SP;
1093 di->fxState[0].nRepeats = 0;
1094 di->fxState[0].repeatLen = 0;
1095 di->fxState[1].fx = Ifx_Modify;
1096 di->fxState[1].offset = layout->offset_IP;
1097 di->fxState[1].size = layout->sizeof_IP;
1098 di->fxState[1].nRepeats = 0;
1099 di->fxState[1].repeatLen = 0;
1100
1101 addStmtToIRSB(irsb, IRStmt_Dirty(di));
1102
1103 }
1104
1105
1106 /* Invalidate the target of the exit if needed:
1107 If target is constant, it is invalidated at translation time.
1108 Otherwise, a call to a helper function is generated to invalidate
1109 the translation at run time.
1110 The below is thus calling either VG_(invalidate_if_not_gdbserved)
1111 or VG_(add_stmt_call_invalidate_if_not_gdbserved). */
VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved)1112 static void VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved)
1113 (IRSB* sb_in,
1114 VexGuestLayout* layout,
1115 VexGuestExtents* vge,
1116 IRType gWordTy,
1117 IRSB* irsb)
1118 {
1119 if (sb_in->next->tag == Iex_Const) {
1120 VG_(invalidate_if_not_gdbserved) (gWordTy == Ity_I64 ?
1121 sb_in->next->Iex.Const.con->Ico.U64
1122 : sb_in->next->Iex.Const.con->Ico.U32);
1123 } else if (sb_in->next->tag == Iex_RdTmp) {
1124 VG_(add_stmt_call_invalidate_if_not_gdbserved)
1125 (sb_in, layout, vge, sb_in->next->Iex.RdTmp.tmp, irsb);
1126 } else {
1127 vg_assert (0); /* unexpected expression tag in exit. */
1128 }
1129 }
1130
VG_(instrument_for_gdbserver_if_needed)1131 IRSB* VG_(instrument_for_gdbserver_if_needed)
1132 (IRSB* sb_in,
1133 VexGuestLayout* layout,
1134 VexGuestExtents* vge,
1135 IRType gWordTy, IRType hWordTy)
1136 {
1137 IRSB* sb_out;
1138 Int i;
1139 const VgVgdb instr_needed = VG_(gdbserver_instrumentation_needed) (vge);
1140
1141 if (instr_needed == Vg_VgdbNo)
1142 return sb_in;
1143
1144
1145 /* here, we need to instrument for gdbserver */
1146 sb_out = deepCopyIRSBExceptStmts(sb_in);
1147
1148 for (i = 0; i < sb_in->stmts_used; i++) {
1149 IRStmt* st = sb_in->stmts[i];
1150
1151 if (!st || st->tag == Ist_NoOp) continue;
1152
1153 if (st->tag == Ist_Exit && instr_needed == Vg_VgdbYes) {
1154 VG_(invalidate_if_not_gdbserved)
1155 (hWordTy == Ity_I64 ?
1156 st->Ist.Exit.dst->Ico.U64 :
1157 st->Ist.Exit.dst->Ico.U32);
1158 }
1159 addStmtToIRSB( sb_out, st );
1160 if (st->tag == Ist_IMark) {
1161 /* For an Ist_Mark, add a call to debugger. */
1162 switch (instr_needed) {
1163 case Vg_VgdbNo: vg_assert (0);
1164 case Vg_VgdbYes:
1165 case Vg_VgdbFull:
1166 VG_(add_stmt_call_gdbserver) ( sb_in, layout, vge,
1167 gWordTy, hWordTy,
1168 st->Ist.IMark.addr,
1169 st->Ist.IMark.delta,
1170 sb_out);
1171 /* There is an optimisation possible here for Vg_VgdbFull:
1172 Put a guard ensuring we only call gdbserver if 'FullCallNeeded'.
1173 FullCallNeeded would be set to 1 we have just switched on
1174 Single Stepping or have just encountered a watchpoint
1175 or have just inserted a breakpoint.
1176 (as gdb by default removes and re-insert breakpoints), we would
1177 need to also implement the notion of 'breakpoint pending removal'
1178 to remove at the next 'continue/step' packet. */
1179 break;
1180 default: vg_assert (0);
1181 }
1182 }
1183 }
1184
1185 if (instr_needed == Vg_VgdbYes) {
1186 VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved) (sb_in,
1187 layout, vge,
1188 gWordTy,
1189 sb_out);
1190 }
1191
1192 return sb_out;
1193 }
1194
1195 struct mon_out_buf {
1196 char buf[DATASIZ+1];
1197 int next;
1198 UInt ret;
1199 };
1200
mon_out(HChar c,void * opaque)1201 static void mon_out (HChar c, void *opaque)
1202 {
1203 struct mon_out_buf *b = (struct mon_out_buf *) opaque;
1204 b->ret++;
1205 b->buf[b->next] = c;
1206 b->next++;
1207 if (b->next == DATASIZ) {
1208 b->buf[b->next] = '\0';
1209 monitor_output(b->buf);
1210 b->next = 0;
1211 }
1212 }
VG_(gdb_printf)1213 UInt VG_(gdb_printf) ( const HChar *format, ... )
1214 {
1215 struct mon_out_buf b;
1216
1217 b.next = 0;
1218 b.ret = 0;
1219
1220 va_list vargs;
1221 va_start(vargs, format);
1222 VG_(vcbprintf) (mon_out, &b, format, vargs);
1223 va_end(vargs);
1224
1225 if (b.next > 0) {
1226 b.buf[b.next] = '\0';
1227 monitor_output(b.buf);
1228 }
1229 return b.ret;
1230 }
1231
VG_(keyword_id)1232 Int VG_(keyword_id) (Char* keywords, Char* input_word, kwd_report_error report)
1233 {
1234 const Int il = (input_word == NULL ? 0 : VG_(strlen) (input_word));
1235 Char iw[il+1];
1236 Char kwds[VG_(strlen)(keywords)+1];
1237 Char *kwdssaveptr;
1238
1239 Char* kw; /* current keyword, its length, its position */
1240 Int kwl;
1241 Int kpos = -1;
1242
1243 Int pass;
1244 /* pass 0 = search, optional pass 1 = output message multiple matches */
1245
1246 Int pass1needed = 0;
1247
1248 Int partial_match = -1;
1249 Int full_match = -1;
1250
1251 if (input_word == NULL) {
1252 iw[0] = 0;
1253 partial_match = 0; /* to force an empty string to cause an error */
1254 } else {
1255 VG_(strcpy) (iw, input_word);
1256 }
1257
1258 for (pass = 0; pass < 2; pass++) {
1259 VG_(strcpy) (kwds, keywords);
1260 if (pass == 1)
1261 VG_(gdb_printf) ("%s can match",
1262 (il == 0 ? "<empty string>" : (char *) iw));
1263 for (kw = VG_(strtok_r) (kwds, " ", &kwdssaveptr);
1264 kw != NULL;
1265 kw = VG_(strtok_r) (NULL, " ", &kwdssaveptr)) {
1266 kwl = VG_(strlen) (kw);
1267 kpos++;
1268
1269 if (il > kwl) {
1270 ; /* ishtar !~ is */
1271 } else if (il == kwl) {
1272 if (VG_(strcmp) (kw, iw) == 0) {
1273 /* exact match */
1274 if (pass == 1)
1275 VG_(gdb_printf) (" %s", kw);
1276 if (full_match != -1)
1277 pass1needed++;
1278 full_match = kpos;
1279 }
1280 } else {
1281 /* il < kwl */
1282 if (VG_(strncmp) (iw, kw, il) == 0) {
1283 /* partial match */
1284 if (pass == 1)
1285 VG_(gdb_printf) (" %s", kw);
1286 if (partial_match != -1)
1287 pass1needed++;
1288 partial_match = kpos;
1289 }
1290 }
1291 }
1292 /* check for success or for no match at all */
1293 if (pass1needed == 0) {
1294 if (full_match != -1) {
1295 return full_match;
1296 } else {
1297 if (report == kwd_report_all && partial_match == -1) {
1298 VG_(gdb_printf) ("%s does not match any of '%s'\n",
1299 iw, keywords);
1300 }
1301 return partial_match;
1302 }
1303 }
1304
1305 /* here we have duplicated match error */
1306 if (pass == 1 || report == kwd_report_none) {
1307 if (report != kwd_report_none) {
1308 VG_(gdb_printf) ("\n");
1309 }
1310 if (partial_match != -1 || full_match != -1)
1311 return -2;
1312 else
1313 return -1;
1314 }
1315 }
1316 /* UNREACHED */
1317 vg_assert (0);
1318 }
1319
1320 /* True if string can be a 0x number */
is_zero_x(Char * s)1321 static Bool is_zero_x (Char *s)
1322 {
1323 if (strlen (s) >= 3 && s[0] == '0' && s[1] == 'x')
1324 return True;
1325 else
1326 return False;
1327 }
1328
1329 /* True if string can be a 0b number */
is_zero_b(Char * s)1330 static Bool is_zero_b (Char *s)
1331 {
1332 if (strlen (s) >= 3 && s[0] == '0' && s[1] == 'b')
1333 return True;
1334 else
1335 return False;
1336 }
1337
VG_(strtok_get_address_and_size)1338 void VG_(strtok_get_address_and_size) (Addr* address,
1339 SizeT* szB,
1340 Char **ssaveptr)
1341 {
1342 Char* wa;
1343 Char* ws;
1344 Char* endptr;
1345 UChar *ppc;
1346
1347 wa = VG_(strtok_r) (NULL, " ", ssaveptr);
1348 ppc = wa;
1349 if (ppc == NULL || !VG_(parse_Addr) (&ppc, address)) {
1350 VG_(gdb_printf) ("missing or malformed address\n");
1351 *address = (Addr) 0;
1352 *szB = 0;
1353 return;
1354 }
1355 ws = VG_(strtok_r) (NULL, " ", ssaveptr);
1356 if (ws == NULL) {
1357 /* Do nothing, i.e. keep current value of szB. */ ;
1358 } else if (is_zero_x (ws)) {
1359 *szB = VG_(strtoull16) (ws, &endptr);
1360 } else if (is_zero_b (ws)) {
1361 Int j;
1362 Char *parsews = ws;
1363 Int n_bits = VG_(strlen) (ws) - 2;
1364 *szB = 0;
1365 ws = NULL; // assume the below loop gives a correct nr.
1366 for (j = 0; j < n_bits; j++) {
1367 if ('0' == parsews[j+2]) { /* do nothing */ }
1368 else if ('1' == parsews[j+2]) *szB |= (1 << (n_bits-j-1));
1369 else {
1370 /* report malformed binary integer */
1371 ws = parsews;
1372 endptr = ws + j + 2;
1373 break;
1374 }
1375 }
1376 } else {
1377 *szB = VG_(strtoull10) (ws, &endptr);
1378 }
1379
1380 if (ws != NULL && *endptr != '\0') {
1381 VG_(gdb_printf) ("malformed integer, expecting "
1382 "hex 0x..... or dec ...... or binary .....b\n");
1383 *address = (Addr) 0;
1384 *szB = 0;
1385 return;
1386 }
1387 }
1388
VG_(gdbserver_status_output)1389 void VG_(gdbserver_status_output)(void)
1390 {
1391 const int nr_gdbserved_addresses
1392 = (gs_addresses == NULL ? -1 : VG_(HT_count_nodes) (gs_addresses));
1393 const int nr_watchpoints
1394 = (gs_watches == NULL ? -1 : (int) VG_(sizeXA) (gs_watches));
1395 remote_utils_output_status();
1396 VG_(umsg)
1397 ("nr of calls to gdbserver: %d\n"
1398 "single stepping %d\n"
1399 "interrupts intr_tid %d gs_non_busy %d gs_busy %d tid_non_intr %d\n"
1400 "gdbserved addresses %d (-1 = not initialized)\n"
1401 "watchpoints %d (-1 = not initialized)\n"
1402 "vgdb-error %d\n",
1403 gdbserver_called,
1404 valgrind_single_stepping(),
1405
1406 vgdb_interrupted_tid,
1407 interrupts_non_busy,
1408 interrupts_while_busy,
1409 interrupts_non_interruptible,
1410
1411 nr_gdbserved_addresses,
1412 nr_watchpoints,
1413 VG_(dyn_vgdb_error));
1414 }
1415