• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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