13b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
23b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/*--------------------------------------------------------------------*/
33b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/*--- Handle remote gdb protocol.                    m_gdbserver.c ---*/
43b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/*--------------------------------------------------------------------*/
53b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
63b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/*
73b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   This file is part of Valgrind, a dynamic binary instrumentation
83b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   framework.
93b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
100f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj   Copyright (C) 2011-2013 Philippe Waroquiers
113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   This program is free software; you can redistribute it and/or
133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   modify it under the terms of the GNU General Public License as
143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   published by the Free Software Foundation; either version 2 of the
153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   License, or (at your option) any later version.
163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   This program is distributed in the hope that it will be useful, but
183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   General Public License for more details.
213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   You should have received a copy of the GNU General Public License
233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   along with this program; if not, write to the Free Software
243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   02111-1307, USA.
263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   The GNU General Public License is contained in the file COPYING.
283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj*/
293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_basics.h"
313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_vki.h"
323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_debuglog.h"
333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_libcproc.h"
343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_libcprint.h"
353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_mallocfree.h"
360447bbd096d5b08db6e4483b8138888a9fa0802aphilippe#include "pub_core_threadstate.h"
373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_gdbserver.h"
383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_options.h"
393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_transtab.h"
40c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_hashtable.h"
41c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_xarray.h"
423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_libcassert.h"
43c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_libcbase.h"
443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_libcsignal.h"
45886fde3e9a960156989a1153ec03b637ab49888ephilippe#include "pub_core_signals.h"
46c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_machine.h"     // VG_(fnptr_to_fnentry)
47c91f58449e6fc2a4ce0851639a342c4277612fbbflorian#include "pub_core_debuginfo.h"
483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_scheduler.h"
493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_syswrap.h"
503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "server.h"
523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
533b290486cd4cd601b20e04340e593c9ed9717e5fsewardjInt VG_(dyn_vgdb_error);
543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* forward declarations */
563b290486cd4cd601b20e04340e593c9ed9717e5fsewardjVG_REGPARM(1)
573b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(helperc_CallDebugger) ( HWord iaddr );
583b290486cd4cd601b20e04340e593c9ed9717e5fsewardjVG_REGPARM(1)
593b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(helperc_invalidate_if_not_gdbserved) ( Addr addr );
601636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic void invalidate_current_ip (ThreadId tid, const HChar *who);
613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* reasons of call to call_gdbserver. */
633b290486cd4cd601b20e04340e593c9ed9717e5fsewardjtypedef
643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   enum {
653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      init_reason,    // initialises gdbserver resources
663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vgdb_reason,    // gdbserver invocation by vgdb doing ptrace
673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      core_reason,    // gdbserver invocation by core (e.g. error encountered)
683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      break_reason,   // break encountered
693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      watch_reason,   // watchpoint detected by tool
700447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      signal_reason,  // signal encountered
710447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      exit_reason}    // process terminated
723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    CallReason;
733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
741636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic const HChar* ppCallReason(CallReason reason)
753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   switch (reason) {
773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case init_reason:    return "init_reason";
783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case vgdb_reason:    return "vgdb_reason";
793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case core_reason:    return "core_reason";
803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case break_reason:   return "break_reason";
813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case watch_reason:   return "watch_reason";
823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case signal_reason:  return "signal_reason";
830447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   case exit_reason:    return "exit_reason";
843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   default: vg_assert (0);
853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* An instruction instrumented for gdbserver looks like this:
893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    1. Ist_Mark (0x1234)
906b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj    2. Put (IP, 0x1234)
916b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj    3. helperc_CallDebugger (0x1234)
923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         This will give control to gdb if there is a break at 0x1234
933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         or if we are single stepping
946b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj    4. ... here the real IR for the instruction at 0x1234
953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    When there is a break at 0x1234:
973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if user does "continue" or "step" or similar,
983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        then - the call to debugger returns
993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - valgrind executes at 3. the real IR(s) for 0x1234
1003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if as part of helperc_CallDebugger, the user calls
1023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      some code in gdb e.g print hello_world()
1033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        then - gdb prepares a dummy stack frame with a specific
1043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               return address (typically it uses _start) and
1053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               inserts a break at this address
1063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - gdb then puts in EIP the address of hello_world()
1073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - gdb then continues (so the helperc_CallDebugger
1083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               returns)
1093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - call_gdbserver() function will then return the
1103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               control to the scheduler (using VG_MINIMAL_LONGJMP)
1113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               to allow the block of the new EIP
1123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               to be executed.
1133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - hello_world code is executed.
1143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - when hello_world() returns, it returns to
1153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               _start and encounters the break at _start.
1163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - gdb then removes this break, put 0x1234 in EIP
1173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               and does a "step". This causes to jump from
1183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               _start to 0x1234, where the call to
1193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                helperc_CallDebugger is redone.
1203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             - This is all ok, the user can then give new gdb
1213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               commands.
1223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    However, when continue is given, address 0x1234 is to
1243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    be executed: gdb gives a single step, which must not
1253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    report again the break at 0x1234. To avoid a 2nd report
1263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    of the same break, the below tells that the next
1273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    helperc_CallDebugger call must ignore a break/stop at
1283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    this address.
1293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj*/
1303b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic Addr ignore_this_break_once = 0;
1313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1333b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void call_gdbserver ( ThreadId tid , CallReason reason);
1343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Describes the address addr (for debugging/printing purposes).
1363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Last two results are kept. A third call will replace the
1373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   oldest result. */
1381636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic HChar* sym (Addr addr, Bool is_code)
1393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
14046cc04521acf2827eb33310fadc119bf2dc039e4florian   static HChar *buf[2];
1413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   static int w = 0;
1423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   PtrdiffT offset;
1433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (w == 2) w = 0;
14446cc04521acf2827eb33310fadc119bf2dc039e4florian
1453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (is_code) {
146770a8d23e40b980b5745e59ecb8e4037d81af357florian      const HChar *name;
147770a8d23e40b980b5745e59ecb8e4037d81af357florian      name = VG_(describe_IP) (addr, NULL);
14846cc04521acf2827eb33310fadc119bf2dc039e4florian      if (buf[w]) VG_(free)(buf[w]);
14946cc04521acf2827eb33310fadc119bf2dc039e4florian      buf[w] = VG_(strdup)("gdbserver sym", name);
1503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
15146cc04521acf2827eb33310fadc119bf2dc039e4florian      const HChar *name;
15246cc04521acf2827eb33310fadc119bf2dc039e4florian      VG_(get_datasym_and_offset) (addr, &name, &offset);
15346cc04521acf2827eb33310fadc119bf2dc039e4florian      if (buf[w]) VG_(free)(buf[w]);
15446cc04521acf2827eb33310fadc119bf2dc039e4florian      buf[w] = VG_(strdup)("gdbserver sym", name);
1553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
1563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return buf[w++];
1573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
1583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Each time gdbserver is called, gdbserver_called is incremented
1603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   gdbserver_exited is incremented when gdbserver is asked to exit */
1613b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int gdbserver_called = 0;
1623b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int gdbserver_exited = 0;
1633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1640972443298eca5e7370f165981b456c6d8e37a19philippe/* alloc and free functions for xarray and similar. */
16554fe2021b87b9e5edb8ec8070f47b86d5cafb8aaflorianstatic void* gs_alloc (const HChar* cc, SizeT sz)
1660972443298eca5e7370f165981b456c6d8e37a19philippe{
16777eb20b3865e7b17c7695c7e7a526b52935f593eflorian   return VG_(malloc)(cc, sz);
1680972443298eca5e7370f165981b456c6d8e37a19philippe}
1690972443298eca5e7370f165981b456c6d8e37a19philippestatic void gs_free (void* ptr)
1700972443298eca5e7370f165981b456c6d8e37a19philippe{
17177eb20b3865e7b17c7695c7e7a526b52935f593eflorian   VG_(free)(ptr);
1720972443298eca5e7370f165981b456c6d8e37a19philippe}
1730972443298eca5e7370f165981b456c6d8e37a19philippe
1743b290486cd4cd601b20e04340e593c9ed9717e5fsewardjtypedef
1753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   enum {
1763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     GS_break,
1773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     GS_jump
1783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
1793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Kind;
1803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1813b290486cd4cd601b20e04340e593c9ed9717e5fsewardjtypedef
1823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   struct _GS_Address {
1833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      struct _GS_Address* next;
1843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Addr    addr;
1853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      GS_Kind kind;
1863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
1873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address;
1883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
1893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* gs_addresses contains a list of all addresses that have been invalidated
1903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   because they have been (or must be) instrumented for gdbserver.
1913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   An entry is added in this table when there is a break at this
1923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   address (kind == GS_break) or if this address is the jump target of an
1933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   exit of a block that has been instrumented for gdbserver while
1943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   single stepping (kind == GS_jump).
1953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   When gdbserver is not single stepping anymore, all GS_jump entries
1963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   are removed, their translations are invalidated.
1976b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj
1986b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   Note for ARM: addr in GS_Address is the value without the thumb bit set.
1993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj*/
20009a4c794458cdb9dea743fa40e450150a2725257florianstatic VgHashTable *gs_addresses = NULL;
2013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2026b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj// Transform addr in the form stored in the list of addresses.
2036b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj// For the ARM architecture, we store it with the thumb bit set to 0.
2046b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardjstatic Addr HT_addr ( Addr addr )
2056b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj{
2066b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj#if defined(VGA_arm)
2076b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj  return addr & ~(Addr)1;
2086b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj#else
2096b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj  return addr;
2106b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj#endif
2116b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj}
2126b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj
2131636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic void add_gs_address (Addr addr, GS_Kind kind, const HChar* from)
2143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
2153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address *p;
2163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
21777eb20b3865e7b17c7695c7e7a526b52935f593eflorian   p = VG_(malloc)(from, sizeof(GS_Address));
2186b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   p->addr = HT_addr (addr);
2193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   p->kind = kind;
2203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(HT_add_node)(gs_addresses, p);
2216b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   /* It should be sufficient to discard a range of 1.
2226b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      We use 2 to ensure the below is not sensitive to the presence
22355663012533f310964e5dd89d1468a61df856224philippe      of thumb bit in the range of addresses to discard.
22455663012533f310964e5dd89d1468a61df856224philippe      No need to discard translations for Vg_VgdbFull as all
22555663012533f310964e5dd89d1468a61df856224philippe      instructions are in any case vgdb-instrumented. */
22655663012533f310964e5dd89d1468a61df856224philippe   if (VG_(clo_vgdb) != Vg_VgdbFull)
22755663012533f310964e5dd89d1468a61df856224philippe      VG_(discard_translations) (addr, 2, from);
2283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
2293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2301636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic void remove_gs_address (GS_Address* g, const HChar* from)
2313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
2323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(HT_remove) (gs_addresses, g->addr);
23355663012533f310964e5dd89d1468a61df856224philippe   // See add_gs_address for the explanation for condition and the range 2 below.
23455663012533f310964e5dd89d1468a61df856224philippe   if (VG_(clo_vgdb) != Vg_VgdbFull)
23555663012533f310964e5dd89d1468a61df856224philippe      VG_(discard_translations) (g->addr, 2, from);
23677eb20b3865e7b17c7695c7e7a526b52935f593eflorian   VG_(free) (g);
2373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
2383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2391636d33c13958b9c0e7d3059cdd5005746418eb2florianconst HChar* VG_(ppPointKind) (PointKind kind)
2403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
2413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   switch(kind) {
2423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case software_breakpoint: return "software_breakpoint";
2433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case hardware_breakpoint: return "hardware_breakpoint";
2443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case write_watchpoint:    return "write_watchpoint";
2453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case read_watchpoint:     return "read_watchpoint";
2463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case access_watchpoint:   return "access_watchpoint";
2470972443298eca5e7370f165981b456c6d8e37a19philippe   default:                  return "???wrong PointKind";
2483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
2493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
2503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2513b290486cd4cd601b20e04340e593c9ed9717e5fsewardjtypedef
2523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   struct _GS_Watch {
2533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Addr    addr;
2543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      SizeT   len;
2553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      PointKind kind;
2563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
2573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Watch;
2583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2590972443298eca5e7370f165981b456c6d8e37a19philippe/* gs_watches contains a list of all addresses+len+kind that are being
2600972443298eca5e7370f165981b456c6d8e37a19philippe   watched. */
2610972443298eca5e7370f165981b456c6d8e37a19philippestatic XArray* gs_watches = NULL;
2620972443298eca5e7370f165981b456c6d8e37a19philippe
2630972443298eca5e7370f165981b456c6d8e37a19philippestatic inline GS_Watch* index_gs_watches(Word i)
2640972443298eca5e7370f165981b456c6d8e37a19philippe{
2650972443298eca5e7370f165981b456c6d8e37a19philippe   return *(GS_Watch **) VG_(indexXA) (gs_watches, i);
2660972443298eca5e7370f165981b456c6d8e37a19philippe}
2670972443298eca5e7370f165981b456c6d8e37a19philippe
2680972443298eca5e7370f165981b456c6d8e37a19philippe/* Returns the GS_Watch matching addr/len/kind and sets *g_ix to its
2690972443298eca5e7370f165981b456c6d8e37a19philippe   position in gs_watches.
2700972443298eca5e7370f165981b456c6d8e37a19philippe   If no matching GS_Watch is found, returns NULL and sets g_ix to -1. */
2710972443298eca5e7370f165981b456c6d8e37a19philippestatic GS_Watch* lookup_gs_watch (Addr addr, SizeT len, PointKind kind,
2720972443298eca5e7370f165981b456c6d8e37a19philippe                                  Word* g_ix)
2730972443298eca5e7370f165981b456c6d8e37a19philippe{
2740972443298eca5e7370f165981b456c6d8e37a19philippe   const Word n_elems = VG_(sizeXA) (gs_watches);
2750972443298eca5e7370f165981b456c6d8e37a19philippe   Word i;
2760972443298eca5e7370f165981b456c6d8e37a19philippe   GS_Watch *g;
2770972443298eca5e7370f165981b456c6d8e37a19philippe
2780972443298eca5e7370f165981b456c6d8e37a19philippe   /* Linear search. If we have many watches, this might be optimised
2790972443298eca5e7370f165981b456c6d8e37a19philippe      by having the array sorted and using VG_(lookupXA) */
2800972443298eca5e7370f165981b456c6d8e37a19philippe   for (i = 0; i < n_elems; i++) {
2810972443298eca5e7370f165981b456c6d8e37a19philippe      g = index_gs_watches(i);
2820972443298eca5e7370f165981b456c6d8e37a19philippe      if (g->addr == addr && g->len == len && g->kind == kind) {
2830972443298eca5e7370f165981b456c6d8e37a19philippe         // Found.
2840972443298eca5e7370f165981b456c6d8e37a19philippe         *g_ix = i;
2850972443298eca5e7370f165981b456c6d8e37a19philippe         return g;
2860972443298eca5e7370f165981b456c6d8e37a19philippe      }
2870972443298eca5e7370f165981b456c6d8e37a19philippe   }
2880972443298eca5e7370f165981b456c6d8e37a19philippe
2890972443298eca5e7370f165981b456c6d8e37a19philippe   // Not found.
2900972443298eca5e7370f165981b456c6d8e37a19philippe   *g_ix = -1;
2910972443298eca5e7370f165981b456c6d8e37a19philippe   return NULL;
2920972443298eca5e7370f165981b456c6d8e37a19philippe}
2933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
2953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* protocol spec tells the below must be idempotent. */
2963b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void breakpoint (Bool insert, CORE_ADDR addr)
2973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
2983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address *g;
2993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3006b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   g = VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(addr));
3013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (insert) {
3023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* insert a breakpoint at addr or upgrade its kind */
3033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (g == NULL) {
3043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         add_gs_address (addr, GS_break, "m_gdbserver breakpoint insert");
3053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else {
3063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         /* already gdbserved. Normally, it must be because of a jump.
3073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            However, due to idempotent or if connection with gdb was
3083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            lost (kept breaks from the previous gdb), if already existing,
3093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            we just upgrade its kind. */
3103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         g->kind = GS_break;
3113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
3123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
3133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* delete a breakpoint at addr or downgrade its kind */
3143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (g != NULL && g->kind == GS_break) {
3153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (valgrind_single_stepping()) {
3163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* keep gdbserved instrumentation while single stepping */
3173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            g->kind = GS_jump;
3183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         } else {
3193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            remove_gs_address (g, "m_gdbserver breakpoint remove");
3203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
3213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else {
3223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         dlog (1, "remove break addr %p %s\n",
3233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               C2v(addr), (g == NULL ?
3243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                           "NULL" :
3253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                           (g->kind == GS_jump ? "GS_jump" : "GS_break")));
3263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
3273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
3283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
3293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3303b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic Bool (*tool_watchpoint) (PointKind kind,
3313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                Bool insert,
3323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                Addr addr,
3333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                SizeT len) = NULL;
3343b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(needs_watchpoint) (Bool (*watchpoint) (PointKind kind,
3353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                Bool insert,
3363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                Addr addr,
3373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                SizeT len))
3383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
3393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   tool_watchpoint = watchpoint;
3403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
3413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3423b290486cd4cd601b20e04340e593c9ed9717e5fsewardjBool VG_(gdbserver_point) (PointKind kind, Bool insert,
3433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                           CORE_ADDR addr, int len)
3443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
3453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Bool res;
3463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Watch *g;
3470972443298eca5e7370f165981b456c6d8e37a19philippe   Word g_ix;
3483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Bool is_code = kind == software_breakpoint || kind == hardware_breakpoint;
3493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1, "%s %s at addr %p %s\n",
3513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        (insert ? "insert" : "remove"),
3523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        VG_(ppPointKind) (kind),
3533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        C2v(addr),
3543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        sym(addr, is_code));
3553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (is_code) {
3573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      breakpoint (insert, addr);
3583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return True;
3593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
3603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (kind == access_watchpoint
3623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              || kind == read_watchpoint
3633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              || kind == write_watchpoint);
3643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (tool_watchpoint == NULL)
3663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False;
3673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   res = (*tool_watchpoint) (kind, insert, addr, len);
3693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!res)
3703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False; /* error or unsupported */
3713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
3720972443298eca5e7370f165981b456c6d8e37a19philippe   // Protocol says insert/remove must be idempotent.
3730972443298eca5e7370f165981b456c6d8e37a19philippe   // So, we just ignore double insert or (supposed) double delete.
3740972443298eca5e7370f165981b456c6d8e37a19philippe
3750972443298eca5e7370f165981b456c6d8e37a19philippe   g = lookup_gs_watch (addr, len, kind, &g_ix);
3763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (insert) {
3773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (g == NULL) {
37877eb20b3865e7b17c7695c7e7a526b52935f593eflorian         g = VG_(malloc)("gdbserver_point watchpoint", sizeof(GS_Watch));
3793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         g->addr = addr;
3803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         g->len  = len;
3813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         g->kind = kind;
3820972443298eca5e7370f165981b456c6d8e37a19philippe         VG_(addToXA)(gs_watches, &g);
3833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else {
3840972443298eca5e7370f165981b456c6d8e37a19philippe         dlog(1,
3850972443298eca5e7370f165981b456c6d8e37a19philippe              "VG_(gdbserver_point) addr %p len %d kind %s already inserted\n",
3860972443298eca5e7370f165981b456c6d8e37a19philippe               C2v(addr), len, VG_(ppPointKind) (kind));
3873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
3883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
3890972443298eca5e7370f165981b456c6d8e37a19philippe      if (g != NULL) {
3900972443298eca5e7370f165981b456c6d8e37a19philippe         VG_(removeIndexXA) (gs_watches, g_ix);
39177eb20b3865e7b17c7695c7e7a526b52935f593eflorian         VG_(free) (g);
3920972443298eca5e7370f165981b456c6d8e37a19philippe      } else {
3930972443298eca5e7370f165981b456c6d8e37a19philippe         dlog(1,
3940972443298eca5e7370f165981b456c6d8e37a19philippe              "VG_(gdbserver_point) addr %p len %d kind %s already deleted?\n",
3950972443298eca5e7370f165981b456c6d8e37a19philippe              C2v(addr), len, VG_(ppPointKind) (kind));
3960972443298eca5e7370f165981b456c6d8e37a19philippe      }
3973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
3983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return True;
3993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
4003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4010232098f152fc450c809742ec269de6e3495c6d5philippeBool VG_(has_gdbserver_breakpoint) (Addr addr)
4020232098f152fc450c809742ec269de6e3495c6d5philippe{
4030232098f152fc450c809742ec269de6e3495c6d5philippe   GS_Address *g;
4040232098f152fc450c809742ec269de6e3495c6d5philippe   if (!gdbserver_called)
4050232098f152fc450c809742ec269de6e3495c6d5philippe      return False;
4060232098f152fc450c809742ec269de6e3495c6d5philippe   g = VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(addr));
4070232098f152fc450c809742ec269de6e3495c6d5philippe   return (g != NULL && g->kind == GS_break);
4080232098f152fc450c809742ec269de6e3495c6d5philippe}
4090232098f152fc450c809742ec269de6e3495c6d5philippe
4103b290486cd4cd601b20e04340e593c9ed9717e5fsewardjBool VG_(is_watched)(PointKind kind, Addr addr, Int szB)
4113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
4120972443298eca5e7370f165981b456c6d8e37a19philippe   Word n_elems;
4133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Watch* g;
4140972443298eca5e7370f165981b456c6d8e37a19philippe   Word i;
4153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Bool watched = False;
4163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   const ThreadId tid = VG_(running_tid);
4173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!gdbserver_called)
4193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False;
4203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4210972443298eca5e7370f165981b456c6d8e37a19philippe   n_elems = VG_(sizeXA) (gs_watches);
4220972443298eca5e7370f165981b456c6d8e37a19philippe
4233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Addr to = addr + szB; // semi-open interval [addr, to[
4243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (kind == access_watchpoint
4263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              || kind == read_watchpoint
4273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              || kind == write_watchpoint);
4283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1, "tid %d VG_(is_watched) %s addr %p szB %d\n",
4293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        tid, VG_(ppPointKind) (kind), C2v(addr), szB);
4300972443298eca5e7370f165981b456c6d8e37a19philippe
4310972443298eca5e7370f165981b456c6d8e37a19philippe   for (i = 0; i < n_elems; i++) {
4320972443298eca5e7370f165981b456c6d8e37a19philippe      g = index_gs_watches(i);
4333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      switch (g->kind) {
4343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case software_breakpoint:
4353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case hardware_breakpoint:
4363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         break;
4373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case access_watchpoint:
4383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case read_watchpoint:
4393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case write_watchpoint:
4403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (to <= g->addr || addr >= (g->addr + g->len))
4413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* If no overlap, examine next watchpoint: */
4423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            continue;
4433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         watched = True; /* We have an overlap */
4453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         /* call gdbserver if access kind reported by the tool
4473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            matches the watchpoint kind. */
4483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (kind == access_watchpoint
4493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             || g->kind == access_watchpoint
4503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj             || g->kind == kind) {
4513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* Watchpoint encountered.
4523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               If this is a read watchpoint, we directly call gdbserver
4533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               to report it to gdb.
4543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               Otherwise, for a write watchpoint, we have to finish
4553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               the instruction so as to modify the value.
4563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               If we do not finish the instruction, then gdb sees no
4573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               value change and continues.
4583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               For a read watchpoint, we better call gdbserver directly:
4593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               in case the current block is not gdbserved, Valgrind
4603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               will execute instructions till the next block. */
4613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* set the watchpoint stop address to the first read or written. */
4633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            if (g->addr <= addr) {
4643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               VG_(set_watchpoint_stop_address) (addr);
4653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            } else {
4663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               VG_(set_watchpoint_stop_address) (g->addr);
4673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            }
4683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            if (kind == write_watchpoint) {
4703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               /* Let Valgrind stop as early as possible after this instruction
4713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                  by switching to Single Stepping mode. */
4723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               valgrind_set_single_stepping (True);
4733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               invalidate_current_ip (tid, "m_gdbserver write watchpoint");
4743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            } else {
4753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               call_gdbserver (tid, watch_reason);
4763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               VG_(set_watchpoint_stop_address) ((Addr) 0);
4773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            }
4783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return True; // we are watched here.
4793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
4803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         break;
4813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      default:
4823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         vg_assert (0);
4833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
4843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
4853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return watched;
4863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
4873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Returns the reason for which gdbserver instrumentation is needed */
4893c0c94777f547bcb5eadbe8cb4328debf0f51875florianstatic VgVgdb VG_(gdbserver_instrumentation_needed) (const VexGuestExtents* vge)
4903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
4913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address* g;
4923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   int e;
4933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!gdbserver_called)
4953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return Vg_VgdbNo;
4963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
4973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (valgrind_single_stepping()) {
4983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(2, "gdbserver_instrumentation_needed due to single stepping\n");
4993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return Vg_VgdbYes;
5003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
5013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (VG_(clo_vgdb) == Vg_VgdbYes && VG_(HT_count_nodes) (gs_addresses) == 0)
5033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return Vg_VgdbNo;
5043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* We assume we do not have a huge nr of breakpoints.
5063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Otherwise, we need something more efficient e.g.
5073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      a sorted list of breakpoints or associate extents to it or ...
5083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   */
5093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(HT_ResetIter) (gs_addresses);
5103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   while ((g = VG_(HT_Next) (gs_addresses))) {
5113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      for (e = 0; e < vge->n_used; e++) {
5126b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj         if (g->addr >= HT_addr(vge->base[e])
5136b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj             && g->addr < HT_addr(vge->base[e]) + vge->len[e]) {
5143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            dlog(2,
5153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                 "gdbserver_instrumentation_needed %p %s reason %s\n",
5163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                 C2v(g->addr), sym(g->addr, /* is_code */ True),
5173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                 (g->kind == GS_jump ? "GS_jump" : "GS_break"));
5183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return Vg_VgdbYes;
5193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
5203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
5213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
5223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (VG_(clo_vgdb) == Vg_VgdbFull) {
5243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(4, "gdbserver_instrumentation_needed"
5253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           " due to VG_(clo_vgdb) == Vg_VgdbFull\n");
5263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return Vg_VgdbFull;
5273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
5283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return Vg_VgdbNo;
5313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
5323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// Clear gdbserved_addresses in gs_addresses.
5343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// If clear_only_jumps, clears only the addresses that are served
5353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// for jump reasons.
5363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// Otherwise, clear all the addresses.
5373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// Cleared addresses are invalidated so as to have them re-translated.
5383b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void clear_gdbserved_addresses(Bool clear_only_jumps)
5393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
5403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address** ag;
5413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   UInt n_elems;
5423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   int i;
5433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1,
5453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        "clear_gdbserved_addresses: scanning hash table nodes %d\n",
5463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        VG_(HT_count_nodes) (gs_addresses));
5473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ag = (GS_Address**) VG_(HT_to_array) (gs_addresses, &n_elems);
5483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   for (i = 0; i < n_elems; i++)
5493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (!clear_only_jumps || ag[i]->kind == GS_jump)
5503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         remove_gs_address (ag[i], "clear_gdbserved_addresses");
5513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(free) (ag);
5523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
5533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5540972443298eca5e7370f165981b456c6d8e37a19philippe// Clear watched addressed in gs_watches, delete gs_watches.
5553b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void clear_watched_addresses(void)
5563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
5570972443298eca5e7370f165981b456c6d8e37a19philippe   GS_Watch* g;
5580972443298eca5e7370f165981b456c6d8e37a19philippe   const Word n_elems = VG_(sizeXA) (gs_watches);
5590972443298eca5e7370f165981b456c6d8e37a19philippe   Word i;
5603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1,
5620972443298eca5e7370f165981b456c6d8e37a19philippe        "clear_watched_addresses: %ld elements\n",
5630972443298eca5e7370f165981b456c6d8e37a19philippe        n_elems);
5640972443298eca5e7370f165981b456c6d8e37a19philippe
5653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   for (i = 0; i < n_elems; i++) {
5660972443298eca5e7370f165981b456c6d8e37a19philippe      g = index_gs_watches(i);
5670972443298eca5e7370f165981b456c6d8e37a19philippe      if (!VG_(gdbserver_point) (g->kind,
5683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                 /* insert */ False,
5690972443298eca5e7370f165981b456c6d8e37a19philippe                                 g->addr,
5700972443298eca5e7370f165981b456c6d8e37a19philippe                                 g->len)) {
5713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         vg_assert (0);
5723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
5733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
5740972443298eca5e7370f165981b456c6d8e37a19philippe
5750972443298eca5e7370f165981b456c6d8e37a19philippe   VG_(deleteXA) (gs_watches);
5760972443298eca5e7370f165981b456c6d8e37a19philippe   gs_watches = NULL;
5773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
5783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5791636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic void invalidate_if_jump_not_yet_gdbserved (Addr addr, const HChar* from)
5803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
5816b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   if (VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(addr)))
5823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return;
5833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   add_gs_address (addr, GS_jump, from);
5843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
5853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
5861636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic void invalidate_current_ip (ThreadId tid, const HChar *who)
5873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
5883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   invalidate_if_jump_not_yet_gdbserved (VG_(get_IP) (tid), who);
5893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
5903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
591180a7500bf2464d5b16cddb5618b91fb3f095998philippeBool VG_(gdbserver_init_done) (void)
592180a7500bf2464d5b16cddb5618b91fb3f095998philippe{
593180a7500bf2464d5b16cddb5618b91fb3f095998philippe   return gdbserver_called > 0;
594180a7500bf2464d5b16cddb5618b91fb3f095998philippe}
595180a7500bf2464d5b16cddb5618b91fb3f095998philippe
596180a7500bf2464d5b16cddb5618b91fb3f095998philippeBool VG_(gdbserver_stop_at) (VgdbStopAt stopat)
597180a7500bf2464d5b16cddb5618b91fb3f095998philippe{
598180a7500bf2464d5b16cddb5618b91fb3f095998philippe   return gdbserver_called > 0 && VgdbStopAtiS(stopat, VG_(clo_vgdb_stop_at));
599180a7500bf2464d5b16cddb5618b91fb3f095998philippe}
600180a7500bf2464d5b16cddb5618b91fb3f095998philippe
601997546cadb1c8240e90c6e7d316ec7850626d751sewardjvoid VG_(gdbserver_prerun_action) (ThreadId tid)
602997546cadb1c8240e90c6e7d316ec7850626d751sewardj{
603997546cadb1c8240e90c6e7d316ec7850626d751sewardj   // Using VG_(dyn_vgdb_error) allows the user to control if gdbserver
604997546cadb1c8240e90c6e7d316ec7850626d751sewardj   // stops after a fork.
605180a7500bf2464d5b16cddb5618b91fb3f095998philippe   if (VG_(dyn_vgdb_error) == 0
606180a7500bf2464d5b16cddb5618b91fb3f095998philippe       || VgdbStopAtiS(VgdbStopAt_Startup, VG_(clo_vgdb_stop_at))) {
607997546cadb1c8240e90c6e7d316ec7850626d751sewardj      /* The below call allows gdb to attach at startup
608997546cadb1c8240e90c6e7d316ec7850626d751sewardj         before the first guest instruction is executed. */
609997546cadb1c8240e90c6e7d316ec7850626d751sewardj      VG_(umsg)("(action at startup) vgdb me ... \n");
610997546cadb1c8240e90c6e7d316ec7850626d751sewardj      VG_(gdbserver)(tid);
611997546cadb1c8240e90c6e7d316ec7850626d751sewardj   } else {
612997546cadb1c8240e90c6e7d316ec7850626d751sewardj      /* User has activated gdbserver => initialize now the FIFOs
613997546cadb1c8240e90c6e7d316ec7850626d751sewardj         to let vgdb/gdb contact us either via the scheduler poll
614997546cadb1c8240e90c6e7d316ec7850626d751sewardj         mechanism or via vgdb ptrace-ing valgrind. */
615997546cadb1c8240e90c6e7d316ec7850626d751sewardj      if (VG_(gdbserver_activity) (tid))
616997546cadb1c8240e90c6e7d316ec7850626d751sewardj         VG_(gdbserver) (tid);
617997546cadb1c8240e90c6e7d316ec7850626d751sewardj   }
618997546cadb1c8240e90c6e7d316ec7850626d751sewardj}
619997546cadb1c8240e90c6e7d316ec7850626d751sewardj
6203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* when fork is done, various cleanup is needed in the child process.
6213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   In particular, child must have its own connection to avoid stealing
6223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   data from its parent */
6233b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void gdbserver_cleanup_in_child_after_fork(ThreadId me)
6243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
6253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1, "thread %d gdbserver_cleanup_in_child_after_fork pid %d\n",
6263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        me, VG_(getpid) ());
6273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* finish connection inheritated from parent */
6293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   remote_finish(reset_after_fork);
6303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* ensure next call to gdbserver will be considered as a brand
6323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      new call that will initialize a fresh gdbserver. */
6333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (gdbserver_called) {
6343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gdbserver_called = 0;
6353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_addresses != NULL);
6363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_watches != NULL);
6373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      clear_gdbserved_addresses(/* clear only jumps */ False);
6386643e96a72e8530a7c8830c02ffb2fb4aee74c88philippe      VG_(HT_destruct) (gs_addresses, VG_(free));
6393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gs_addresses = NULL;
6403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      clear_watched_addresses();
6413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
6423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_addresses == NULL);
6433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_watches == NULL);
6443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
645997546cadb1c8240e90c6e7d316ec7850626d751sewardj
646997546cadb1c8240e90c6e7d316ec7850626d751sewardj
647997546cadb1c8240e90c6e7d316ec7850626d751sewardj   if (VG_(clo_trace_children)) {
648997546cadb1c8240e90c6e7d316ec7850626d751sewardj      VG_(gdbserver_prerun_action) (me);
649997546cadb1c8240e90c6e7d316ec7850626d751sewardj   }
6503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
6513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* If reason is init_reason, creates the connection resources (e.g.
6533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      the FIFOs) to allow a gdb connection to be detected by polling
6543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      using remote_desc_activity.
6553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Otherwise (other reasons):
6563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       If connection with gdb not yet opened, opens the connection with gdb.
6573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       reads gdb remote protocol packets and executes the requested commands.
6583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj*/
6593b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void call_gdbserver ( ThreadId tid , CallReason reason)
6603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
6613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ThreadState*     tst = VG_(get_ThreadState)(tid);
6623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   int stepping;
6633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Addr saved_pc;
6643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1,
6663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        "entering call_gdbserver %s ... pid %d tid %d status %s "
6673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        "sched_jmpbuf_valid %d\n",
6683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        ppCallReason (reason),
6693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        VG_(getpid) (), tid, VG_(name_of_ThreadStatus)(tst->status),
6703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        tst->sched_jmpbuf_valid);
6713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6720447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   /* If we are about to die, then just run server_main() once to get
6730447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      the resume reply out and return immediately because most of the state
6740447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      of this tid and process is about to be torn down. */
6750447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   if (reason == exit_reason) {
6760447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      server_main();
6770447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      return;
6780447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   }
6790447bbd096d5b08db6e4483b8138888a9fa0802aphilippe
6803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert(VG_(is_valid_tid)(tid));
6813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   saved_pc = VG_(get_IP) (tid);
6823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (gdbserver_exited) {
6843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(0, "call_gdbserver called when gdbserver_exited %d\n",
6853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           gdbserver_exited);
6863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return;
6873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
6883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
6893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (gdbserver_called == 0) {
6903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_addresses == NULL);
6913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vg_assert (gs_watches == NULL);
6923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gs_addresses = VG_(HT_construct)( "gdbserved_addresses" );
6930972443298eca5e7370f165981b456c6d8e37a19philippe      gs_watches = VG_(newXA)(gs_alloc,
6940972443298eca5e7370f165981b456c6d8e37a19philippe                              "gdbserved_watches",
6950972443298eca5e7370f165981b456c6d8e37a19philippe                              gs_free,
6960972443298eca5e7370f165981b456c6d8e37a19philippe                              sizeof(GS_Watch*));
6973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(atfork)(NULL, NULL, gdbserver_cleanup_in_child_after_fork);
6983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
6993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (gs_addresses != NULL);
7003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (gs_watches != NULL);
7013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   gdbserver_called++;
7033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* call gdbserver_init if this is the first call to gdbserver. */
7053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (gdbserver_called == 1)
7063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gdbserver_init();
7073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (reason == init_reason || gdbserver_called == 1)
7093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      remote_open(VG_(clo_vgdb_prefix));
7103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* if the call reason is to initialize, then return control to
7123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      valgrind. After this initialization, gdbserver will be called
7133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      again either if there is an error detected by valgrind or
7143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if vgdb sends data to the valgrind process. */
7153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (reason == init_reason) {
7163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return;
7173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
7183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   stepping = valgrind_single_stepping();
7203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   server_main();
7223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ignore_this_break_once = valgrind_get_ignore_break_once();
7243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (ignore_this_break_once)
7253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(1, "!!! will ignore_this_break_once %s\n",
7263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           sym(ignore_this_break_once, /* is_code */ True));
7273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (valgrind_single_stepping()) {
7303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* we are single stepping. If we were not stepping on entry,
7313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         then invalidate the current program counter so as to properly
7323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         do single step. In case the program counter was changed by
7333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         gdb, this will also invalidate the target address we will
7343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         jump to. */
7353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (!stepping && tid != 0) {
7363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         invalidate_current_ip (tid, "m_gdbserver single step");
7373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
7383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
7393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* We are not single stepping.  If we were stepping on entry,
7403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         then clear the gdbserved addresses.  This will cause all
7413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         these gdbserved blocks to be invalidated so that they can be
7423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         re-translated without being gdbserved. */
7433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (stepping)
7443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         clear_gdbserved_addresses(/* clear only jumps */ True);
7453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
7463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* can't do sanity check at beginning. At least the stack
7483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      check is not yet possible. */
7493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (gdbserver_called > 1)
7503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(sanity_check_general) (/* force_expensive */ False);
7513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* If the PC has been changed by gdb, then we VG_MINIMAL_LONGJMP to
7533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      the scheduler to execute the block of the new PC.
7543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Otherwise we just return to continue executing the
7553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      current block. */
7563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (VG_(get_IP) (tid) != saved_pc) {
7573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(1, "tid %d %s PC changed from %s to %s\n",
7583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           tid, VG_(name_of_ThreadStatus) (tst->status),
7593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           sym(saved_pc, /* is_code */ True),
7603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           sym(VG_(get_IP) (tid), /* is_code */ True));
7613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (tst->status == VgTs_Yielding) {
7623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         SysRes sres;
7633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         VG_(memset)(&sres, 0, sizeof(SysRes));
7643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         VG_(acquire_BigLock)(tid, "gdbsrv VG_MINIMAL_LONGJMP");
7653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
7663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (tst->sched_jmpbuf_valid) {
7673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         /* resume scheduler */
7683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         VG_MINIMAL_LONGJMP(tst->sched_jmpbuf);
7693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
7703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* else continue to run */
7713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
7723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* continue to run */
7733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
7743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* busy > 0 when gdbserver is currently being called.
7763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   busy is used to to avoid vgdb invoking gdbserver
7773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   while gdbserver by Valgrind. */
7783b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic volatile int busy = 0;
7793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
7803b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(gdbserver) ( ThreadId tid )
7813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
7823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   busy++;
7833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* called by the rest of valgrind for
7843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         --vgdb-error=0 reason
7853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      or by scheduler "poll/debug/interrupt" reason
7863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      or to terminate. */
7873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (tid != 0) {
7883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      call_gdbserver (tid, core_reason);
7893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
7903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (gdbserver_called == 0) {
7913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         dlog(1, "VG_(gdbserver) called to terminate, nothing to terminate\n");
7923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else if (gdbserver_exited) {
7933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         dlog(0, "VG_(gdbserver) called to terminate again %d\n",
7943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              gdbserver_exited);
7953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else {
7963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         gdbserver_terminate();
7973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         gdbserver_exited++;
7983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
7993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
8003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   busy--;
8013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
8023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// nr of invoke_gdbserver while gdbserver is already executing.
8043b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int interrupts_while_busy = 0;
8053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// nr of invoke_gdbserver while gdbserver is not executing.
8073b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int interrupts_non_busy = 0;
8083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// nr of invoke_gdbserver when some threads are not interruptible.
8103b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int interrupts_non_interruptible = 0;
8113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* When all threads are blocked in a system call, the Valgrind
8133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   scheduler cannot poll the shared memory for gdbserver activity.  In
8143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   such a case, vgdb will force the invokation of gdbserver using
8153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ptrace. To do that, vgdb 'pushes' a call to invoke_gdbserver
8163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   on the stack using ptrace. invoke_gdbserver must not return.
8173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Instead, it must call give_control_back_to_vgdb.
818b2572b52b37d56d302408395f7fed9f509423af1sewardj   vgdb expects to receive a SIGSTOP, which this function generates.
819b2572b52b37d56d302408395f7fed9f509423af1sewardj   When vgdb gets this SIGSTOP, it knows invoke_gdbserver call
8203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   is finished and can reset the Valgrind process in the state prior to
8213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   the 'pushed call' (using ptrace again).
8223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   This all works well. However, the user must avoid
8233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   'kill-9ing' vgdb during such a pushed call, otherwise
824b2572b52b37d56d302408395f7fed9f509423af1sewardj   the SIGSTOP generated below will be seen by the Valgrind core,
825b2572b52b37d56d302408395f7fed9f509423af1sewardj   instead of being handled by vgdb. The OS will then handle the SIGSTOP
826b2572b52b37d56d302408395f7fed9f509423af1sewardj   by stopping the Valgrind process.
827b2572b52b37d56d302408395f7fed9f509423af1sewardj   We use SIGSTOP as this process cannot be masked. */
8283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8293b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void give_control_back_to_vgdb(void)
8303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
831b2572b52b37d56d302408395f7fed9f509423af1sewardj   /* cause a SIGSTOP to be sent to ourself, so that vgdb takes control.
8323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      vgdb will then restore the stack so as to resume the activity
8333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      before the ptrace (typically do_syscall_WRK). */
834b2572b52b37d56d302408395f7fed9f509423af1sewardj   if (VG_(kill)(VG_(getpid)(), VKI_SIGSTOP) != 0)
835b2572b52b37d56d302408395f7fed9f509423af1sewardj      vg_assert2(0, "SIGSTOP for vgdb could not be generated\n");
8363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* If we arrive here, it means a call was pushed on the stack
8383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      by vgdb, but during this call, vgdb and/or connection
8393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      died. Alternatively, it is a bug in the vgdb<=>Valgrind gdbserver
8403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      ptrace handling. */
8413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert2(0,
8423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              "vgdb did not took control. Did you kill vgdb ?\n"
8433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              "busy %d vgdb_interrupted_tid %d\n",
8443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              busy, vgdb_interrupted_tid);
8453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
8463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Using ptrace calls, vgdb will force an invocation of gdbserver.
8483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(invoke_gdbserver) is the entry point called through the
8493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vgdb ptrace technique. */
8503b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(invoke_gdbserver) ( int check )
8513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
8523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* ******* Avoid non-reentrant function call from here .....
8533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      till the ".... till here" below. */
8543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* We need to determine the state of the various threads to decide
8563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if we directly invoke gdbserver or if we rather indicate to the
8573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      scheduler to invoke the gdbserver.  To decide that, it is
8583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      critical to avoid any "coregrind" function call as the ptrace
8593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      might have stopped the process in the middle of this (possibly)
8603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      non-rentrant function.  So, it is only when all threads are in
8613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      an "interruptible" state that we can safely invoke
8623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gdbserver. Otherwise, we let the valgrind scheduler invoke
8633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gdbserver at the next poll.  This poll will be made very soon
8643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      thanks to a call to VG_(force_vgdb_poll). */
8653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   int n_tid;
8663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (check == 0x8BADF00D);
8683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (busy) {
8703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      interrupts_while_busy++;
8713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      give_control_back_to_vgdb();
8723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
8733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   interrupts_non_busy++;
8743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* check if all threads are in an "interruptible" state.  If yes,
8763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      we invoke gdbserver. Otherwise, we tell the scheduler to wake up
8773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      asap. */
8783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   for (n_tid = 1; n_tid < VG_N_THREADS; n_tid++) {
8793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      switch (VG_(threads)[n_tid].status) {
8803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* interruptible states. */
8813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_WaitSys:
8823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_Yielding:
8833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (vgdb_interrupted_tid == 0) vgdb_interrupted_tid = n_tid;
8843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         break;
8853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_Empty:
8873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_Zombie:
8883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         break;
8893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* non interruptible states. */
8913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_Init:
8923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      case VgTs_Runnable:
8933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         interrupts_non_interruptible++;
8943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         VG_(force_vgdb_poll) ();
8953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         give_control_back_to_vgdb();
8963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
8973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      default:             vg_assert(0);
8983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
8993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
9003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* .... till here.
9023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      From here onwards, function calls are ok: it is
9033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      safe to call valgrind core functions: all threads are blocked in
9043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      a system call or are yielding or ... */
9053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1, "invoke_gdbserver running_tid %d vgdb_interrupted_tid %d\n",
9063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        VG_(running_tid), vgdb_interrupted_tid);
9073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   call_gdbserver (vgdb_interrupted_tid, vgdb_reason);
9083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vgdb_interrupted_tid = 0;
9093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dlog(1,
9103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        "exit invoke_gdbserver running_tid %d\n", VG_(running_tid));
9113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   give_control_back_to_vgdb();
9123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert2(0, "end of invoke_gdbserver reached");
9143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
9163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9173b290486cd4cd601b20e04340e593c9ed9717e5fsewardjBool VG_(gdbserver_activity) (ThreadId tid)
9183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
9193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Bool ret;
9203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   busy++;
9213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!gdbserver_called)
9223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      call_gdbserver (tid, init_reason);
9233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   switch (remote_desc_activity("VG_(gdbserver_activity)")) {
9243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case 0: ret = False; break;
9253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   case 1: ret = True; break;
9260eb0d5a73655b8ed1b6c93d7032311a5d102a8f0philippe   case 2:
9270eb0d5a73655b8ed1b6c93d7032311a5d102a8f0philippe      remote_finish(reset_after_error);
9280eb0d5a73655b8ed1b6c93d7032311a5d102a8f0philippe      call_gdbserver (tid, init_reason);
9290eb0d5a73655b8ed1b6c93d7032311a5d102a8f0philippe      ret = False;
9300eb0d5a73655b8ed1b6c93d7032311a5d102a8f0philippe      break;
9313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   default: vg_assert (0);
9323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
9333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   busy--;
9343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return ret;
9353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
9363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
937b301469137f05afa7288790a67ed0628df1efb7ephilippestatic void dlog_signal (const HChar *who, const vki_siginfo_t *info,
938b301469137f05afa7288790a67ed0628df1efb7ephilippe                         ThreadId tid)
9392d1f256d8ed8ee505a794d5787334cc9b7314a48philippe{
940b301469137f05afa7288790a67ed0628df1efb7ephilippe   dlog(1, "VG core calling %s "
9412d1f256d8ed8ee505a794d5787334cc9b7314a48philippe        "vki_nr %d %s gdb_nr %d %s tid %d\n",
942b301469137f05afa7288790a67ed0628df1efb7ephilippe        who,
943b301469137f05afa7288790a67ed0628df1efb7ephilippe        info->si_signo, VG_(signame)(info->si_signo),
944b301469137f05afa7288790a67ed0628df1efb7ephilippe        target_signal_from_host (info->si_signo),
945b301469137f05afa7288790a67ed0628df1efb7ephilippe        target_signal_to_name(target_signal_from_host (info->si_signo)),
9462d1f256d8ed8ee505a794d5787334cc9b7314a48philippe        tid);
9472d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
948b301469137f05afa7288790a67ed0628df1efb7ephilippe}
949b301469137f05afa7288790a67ed0628df1efb7ephilippe
950b301469137f05afa7288790a67ed0628df1efb7ephilippevoid VG_(gdbserver_report_fatal_signal) (const vki_siginfo_t *info,
951b301469137f05afa7288790a67ed0628df1efb7ephilippe                                         ThreadId tid)
952b301469137f05afa7288790a67ed0628df1efb7ephilippe{
953b301469137f05afa7288790a67ed0628df1efb7ephilippe   dlog_signal("VG_(gdbserver_report_fatal_signal)", info, tid);
954b301469137f05afa7288790a67ed0628df1efb7ephilippe
9552d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   if (remote_connected()) {
9562d1f256d8ed8ee505a794d5787334cc9b7314a48philippe      dlog(1, "already connected, assuming already reported\n");
9572d1f256d8ed8ee505a794d5787334cc9b7314a48philippe      return;
9582d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   }
9592d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
9602d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   VG_(umsg)("(action on fatal signal) vgdb me ... \n");
9612d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
9622d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   /* indicate to gdbserver that there is a signal */
963b301469137f05afa7288790a67ed0628df1efb7ephilippe   gdbserver_signal_encountered (info);
9642d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
9652d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   /* let gdbserver do some work, e.g. show the signal to the user */
9662d1f256d8ed8ee505a794d5787334cc9b7314a48philippe   call_gdbserver (tid, signal_reason);
9672d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
9682d1f256d8ed8ee505a794d5787334cc9b7314a48philippe}
9692d1f256d8ed8ee505a794d5787334cc9b7314a48philippe
970b301469137f05afa7288790a67ed0628df1efb7ephilippeBool VG_(gdbserver_report_signal) (vki_siginfo_t *info, ThreadId tid)
9713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
972b301469137f05afa7288790a67ed0628df1efb7ephilippe   dlog_signal("VG_(gdbserver_report_signal)", info, tid);
9733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* if gdbserver is currently not connected, then signal
9753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      is to be given to the process */
9763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!remote_connected()) {
977b2572b52b37d56d302408395f7fed9f509423af1sewardj      dlog(1, "not connected => pass\n");
978b2572b52b37d56d302408395f7fed9f509423af1sewardj      return True;
9793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
980b2572b52b37d56d302408395f7fed9f509423af1sewardj   /* if gdb has informed gdbserver that this signal can be
981b2572b52b37d56d302408395f7fed9f509423af1sewardj      passed directly without informing gdb, then signal is
982b2572b52b37d56d302408395f7fed9f509423af1sewardj      to be given to the process. */
983b301469137f05afa7288790a67ed0628df1efb7ephilippe   if (pass_signals[target_signal_from_host(info->si_signo)]) {
9843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(1, "pass_signals => pass\n");
985b2572b52b37d56d302408395f7fed9f509423af1sewardj      return True;
9863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
9873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* indicate to gdbserver that there is a signal */
989b301469137f05afa7288790a67ed0628df1efb7ephilippe   gdbserver_signal_encountered (info);
9903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
991b301469137f05afa7288790a67ed0628df1efb7ephilippe   /* let gdbserver do some work, e.g. show the signal to the user.
992b301469137f05afa7288790a67ed0628df1efb7ephilippe      User can also decide to ignore the signal or change the signal. */
9933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   call_gdbserver (tid, signal_reason);
9943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
9953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* ask gdbserver what is the final decision */
996b301469137f05afa7288790a67ed0628df1efb7ephilippe   if (gdbserver_deliver_signal (info)) {
9973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(1, "gdbserver deliver signal\n");
9983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return True;
9993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
10003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      dlog(1, "gdbserver ignore signal\n");
10013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False;
10023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
10033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
10043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10050447bbd096d5b08db6e4483b8138888a9fa0802aphilippevoid VG_(gdbserver_exit) (ThreadId tid, VgSchedReturnCode tids_schedretcode)
10060447bbd096d5b08db6e4483b8138888a9fa0802aphilippe{
10070447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   dlog(1, "VG core calling VG_(gdbserver_exit) tid %d will exit\n", tid);
10080447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   if (remote_connected()) {
10090447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      /* Make sure vgdb knows we are about to die and why. */
10100447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      switch(tids_schedretcode) {
10110447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      case VgSrc_None:
10120447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         vg_assert (0);
10130447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      case VgSrc_ExitThread:
10140447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      case VgSrc_ExitProcess:
10150447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         gdbserver_process_exit_encountered ('W', VG_(threads)[tid].os_state.exitcode);
10160447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         call_gdbserver (tid, exit_reason);
10170447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         break;
10180447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      case VgSrc_FatalSig:
10190447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         gdbserver_process_exit_encountered ('X', VG_(threads)[tid].os_state.fatalsig);
10200447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         call_gdbserver (tid, exit_reason);
10210447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         break;
10220447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      default:
10230447bbd096d5b08db6e4483b8138888a9fa0802aphilippe         vg_assert(0);
10240447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      }
10250447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   } else {
10260447bbd096d5b08db6e4483b8138888a9fa0802aphilippe      dlog(1, "not connected\n");
10270447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   }
10280447bbd096d5b08db6e4483b8138888a9fa0802aphilippe
10290447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   /* Tear down the connection if it still exists. */
10300447bbd096d5b08db6e4483b8138888a9fa0802aphilippe   VG_(gdbserver) (0);
10310447bbd096d5b08db6e4483b8138888a9fa0802aphilippe}
10320447bbd096d5b08db6e4483b8138888a9fa0802aphilippe
10333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// Check if single_stepping or if there is a break requested at iaddr.
10343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// If yes, call debugger
10353b290486cd4cd601b20e04340e593c9ed9717e5fsewardjVG_REGPARM(1)
10363b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(helperc_CallDebugger) ( HWord iaddr )
10373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
10383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   GS_Address* g;
10393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   // For Vg_VgdbFull, after a fork, we might have calls to this helper
10413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   // while gdbserver is not yet initialized.
10423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (!gdbserver_called)
10433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return;
10443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (valgrind_single_stepping() ||
10466b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj       ((g = VG_(HT_lookup) (gs_addresses, (UWord)HT_addr(iaddr))) &&
10473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        (g->kind == GS_break))) {
10486b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      if (iaddr == HT_addr(ignore_this_break_once)) {
10493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         dlog(1, "ignoring ignore_this_break_once %s\n",
10503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj              sym(ignore_this_break_once, /* is_code */ True));
10513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         ignore_this_break_once = 0;
10523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      } else {
10533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         call_gdbserver (VG_(get_running_tid)(), break_reason);
10543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
10553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
10563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
10573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* software_breakpoint support --------------------------------------*/
10593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* When a block is instrumented for gdbserver, single step and breaks
10603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   will be obeyed in this block.  However, if a jump to another block
10613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   is executed while single_stepping is active, we must ensure that
10623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   this block is also instrumented. For this, when a block is
10633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   instrumented for gdbserver while single_stepping, the target of all
10643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   the Jump instructions in this block will be checked to verify if
10653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   the block is already instrumented for gdbserver.  The below will
10663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ensure that if not already instrumented for gdbserver, the target
10673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   block translation containing addr will be invalidated.  The list of
10683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   gdbserved Addr will also be kept so that translations can be
10693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   dropped automatically by gdbserver when going out of single step
10703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   mode.
10713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Call the below at translation time if the jump target is a constant.
10733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Otherwise, rather use VG_(add_stmt_call_invalidate_if_not_gdbserved).
10743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   To instrument the target exit statement, you can call
10763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved) rather
10773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   than check the kind of target exit. */
10783b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void VG_(invalidate_if_not_gdbserved) (Addr addr)
10793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
10803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (valgrind_single_stepping())
10813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      invalidate_if_jump_not_yet_gdbserved
10823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         (addr, "gdbserver target jump (instrument)");
10833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
10843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// same as VG_(invalidate_if_not_gdbserved) but is intended to be called
10863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// at runtime (only difference is the invalidate reason which traces
10873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj// it is at runtime)
10883b290486cd4cd601b20e04340e593c9ed9717e5fsewardjVG_REGPARM(1)
10893b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(helperc_invalidate_if_not_gdbserved) ( Addr addr )
10903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
10913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (valgrind_single_stepping())
10923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      invalidate_if_jump_not_yet_gdbserved
10933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         (addr, "gdbserver target jump (runtime)");
10943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
10953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
10963b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void VG_(add_stmt_call_invalidate_if_not_gdbserved)
10973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     ( IRSB* sb_in,
10983c0c94777f547bcb5eadbe8cb4328debf0f51875florian       const VexGuestLayout* layout,
10993c0c94777f547bcb5eadbe8cb4328debf0f51875florian       const VexGuestExtents* vge,
11003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       IRTemp jmp,
11013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       IRSB* irsb)
11023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
11033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   void*    fn;
11051636d33c13958b9c0e7d3059cdd5005746418eb2florian   const HChar*   nm;
11063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   IRExpr** args;
11073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int      nargs;
11083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   IRDirty* di;
11093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   fn    = &VG_(helperc_invalidate_if_not_gdbserved);
11113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   nm    = "VG_(helperc_invalidate_if_not_gdbserved)";
11123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   args  = mkIRExprVec_1(IRExpr_RdTmp (jmp));
11133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   nargs = 1;
11143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   di = unsafeIRDirty_0_N( nargs/*regparms*/, nm,
11163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                           VG_(fnptr_to_fnentry)( fn ), args );
11173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   di->nFxState = 0;
11193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   addStmtToIRSB(irsb, IRStmt_Dirty(di));
11213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
11223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* software_breakpoint support --------------------------------------*/
11243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* If a tool wants to allow gdbserver to do something at Addr, then
11253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(add_stmt_call_gdbserver) will add in IRSB a call to a helper
11263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   function.  This helper function will check if the process must be
11273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   stopped at the instruction Addr: either there is a break at Addr or
11283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   the process is being single-stepped.  Typical usage of the below is to
11293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   instrument an Ist_IMark to allow the debugger to interact at any
11303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   instruction being executed.  As soon as there is one break in a block,
11313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   then to allow single stepping in this block (and possible insertions
11323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   of other breaks in the same sb_in while the process is stopped), a
11333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   debugger statement will be inserted for all instructions of a block. */
11343b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void VG_(add_stmt_call_gdbserver)
11353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     (IRSB* sb_in,                /* block being translated */
11363c0c94777f547bcb5eadbe8cb4328debf0f51875florian      const VexGuestLayout* layout,
11373c0c94777f547bcb5eadbe8cb4328debf0f51875florian      const VexGuestExtents* vge,
11383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      IRType gWordTy, IRType hWordTy,
11396b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      Addr  iaddr,                /* Addr of instruction being instrumented */
11406b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      UChar delta,                /* delta to add to iaddr to obtain IP */
11413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      IRSB* irsb)                 /* irsb block to which call is added */
11423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
11433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   void*    fn;
11441636d33c13958b9c0e7d3059cdd5005746418eb2florian   const HChar*   nm;
11453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   IRExpr** args;
11463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int      nargs;
11473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   IRDirty* di;
11483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* first store the address in the program counter so that the check
11503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      done by VG_(helperc_CallDebugger) will be based on the correct
11513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      program counter.  We might make this more efficient by rather
11523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      searching for assignement to program counter and instrumenting
11533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      that but the below is easier and I guess that the optimiser will
11543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      remove the redundant store. And in any case, when debugging a
11553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      piece of code, the efficiency requirement is not critical: very
11563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      few blocks will be instrumented for debugging. */
11576b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj
11586b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   /* For platforms on which the IP can differ from the addr of the instruction
11596b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      being executed, we need to add the delta to obtain the IP.
11606b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      This IP will be given to gdb (e.g. if a breakpoint is put at iaddr).
11616b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj
11626b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      For ARM, this delta will ensure that the thumb bit is set in the
11636b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      IP when executing thumb code. gdb uses this thumb bit a.o.
11646b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj      to properly guess the next IP for the 'step' and 'stepi' commands. */
11656b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   vg_assert(delta <= 1);
11666b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj   addStmtToIRSB(irsb, IRStmt_Put(layout->offset_IP ,
11676b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj                                  mkIRExpr_HWord(iaddr + (Addr)delta)));
11683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   fn    = &VG_(helperc_CallDebugger);
11703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   nm    = "VG_(helperc_CallDebugger)";
11713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   args  = mkIRExprVec_1(mkIRExpr_HWord (iaddr));
11723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   nargs = 1;
11733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   di = unsafeIRDirty_0_N( nargs/*regparms*/, nm,
11753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                           VG_(fnptr_to_fnentry)( fn ), args );
11763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* Note: in fact, a debugger call can read whatever register
11783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      or memory. It can also write whatever register or memory.
11793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      So, in theory, we have to indicate the whole universe
11803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      can be read and modified. It is however not critical
11813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      to indicate precisely what is being read/written
11823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      as such indications are needed for tool error detection
11833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      and we do not want to have errors being detected for
11843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      gdb interactions. */
11853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   di->nFxState = 2;
11872eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[0].fx        = Ifx_Read;
11882eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[0].offset    = layout->offset_SP;
11892eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[0].size      = layout->sizeof_SP;
11902eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[0].nRepeats  = 0;
11912eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[0].repeatLen = 0;
11922eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[1].fx        = Ifx_Modify;
11932eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[1].offset    = layout->offset_IP;
11942eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[1].size      = layout->sizeof_IP;
11952eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[1].nRepeats  = 0;
11962eecb74d4a8816485c97ae8e535ce25511460bc8sewardj   di->fxState[1].repeatLen = 0;
11973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
11983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   addStmtToIRSB(irsb, IRStmt_Dirty(di));
11993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
12013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Invalidate the target of the exit if needed:
12043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   If target is constant, it is invalidated at translation time.
12053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Otherwise, a call to a helper function is generated to invalidate
12063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   the translation at run time.
12073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   The below is thus calling either VG_(invalidate_if_not_gdbserved)
12083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   or VG_(add_stmt_call_invalidate_if_not_gdbserved).  */
12093b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved)
12103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   (IRSB* sb_in,
12113c0c94777f547bcb5eadbe8cb4328debf0f51875florian    const VexGuestLayout* layout,
12123c0c94777f547bcb5eadbe8cb4328debf0f51875florian    const VexGuestExtents* vge,
12133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    IRType gWordTy,
12143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj    IRSB* irsb)
12153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
12163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (sb_in->next->tag == Iex_Const) {
12173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     VG_(invalidate_if_not_gdbserved) (gWordTy == Ity_I64 ?
12183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                       sb_in->next->Iex.Const.con->Ico.U64
12193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                       : sb_in->next->Iex.Const.con->Ico.U32);
12203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else if (sb_in->next->tag == Iex_RdTmp) {
12213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     VG_(add_stmt_call_invalidate_if_not_gdbserved)
12223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       (sb_in, layout, vge, sb_in->next->Iex.RdTmp.tmp, irsb);
12233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
12243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     vg_assert (0); /* unexpected expression tag in exit. */
12253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
12263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
12273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12283b290486cd4cd601b20e04340e593c9ed9717e5fsewardjIRSB* VG_(instrument_for_gdbserver_if_needed)
12293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     (IRSB* sb_in,
12303c0c94777f547bcb5eadbe8cb4328debf0f51875florian      const VexGuestLayout* layout,
12313c0c94777f547bcb5eadbe8cb4328debf0f51875florian      const VexGuestExtents* vge,
12323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      IRType gWordTy, IRType hWordTy)
12333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
12343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   IRSB* sb_out;
12353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int i;
12363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   const VgVgdb instr_needed = VG_(gdbserver_instrumentation_needed) (vge);
12373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (instr_needed == Vg_VgdbNo)
12393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj     return sb_in;
12403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* here, we need to instrument for gdbserver */
12433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   sb_out = deepCopyIRSBExceptStmts(sb_in);
12443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   for (i = 0; i < sb_in->stmts_used; i++) {
12463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      IRStmt* st = sb_in->stmts[i];
12473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (!st || st->tag == Ist_NoOp) continue;
12493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (st->tag == Ist_Exit && instr_needed == Vg_VgdbYes) {
12513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj        VG_(invalidate_if_not_gdbserved)
12523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj          (hWordTy == Ity_I64 ?
12533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           st->Ist.Exit.dst->Ico.U64 :
12543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           st->Ist.Exit.dst->Ico.U32);
12553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
12563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      addStmtToIRSB( sb_out, st );
12573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (st->tag == Ist_IMark) {
12583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         /* For an Ist_Mark, add a call to debugger. */
12593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         switch (instr_needed) {
12603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         case Vg_VgdbNo: vg_assert (0);
12613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         case Vg_VgdbYes:
12623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         case Vg_VgdbFull:
12633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            VG_(add_stmt_call_gdbserver) ( sb_in, layout, vge,
12643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                           gWordTy, hWordTy,
12653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                           st->Ist.IMark.addr,
12666b7357b5cd567648f316a1a8c70ac0fb1de9b54dsewardj                                           st->Ist.IMark.delta,
12673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                           sb_out);
12683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* There is an optimisation possible here for Vg_VgdbFull:
12693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               Put a guard ensuring we only call gdbserver if 'FullCallNeeded'.
12703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               FullCallNeeded would be set to 1 we have just switched on
12713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               Single Stepping or have just encountered a watchpoint
12723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               or have just inserted a breakpoint.
12733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               (as gdb by default removes and re-insert breakpoints), we would
12743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               need to also implement the notion of 'breakpoint pending removal'
12753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               to remove at the next 'continue/step' packet. */
12763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            break;
12773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         default: vg_assert (0);
12783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
12793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
12803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
12813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (instr_needed == Vg_VgdbYes) {
12833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(add_stmt_call_invalidate_exit_target_if_not_gdbserved) (sb_in,
12843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                                  layout, vge,
12853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                                  gWordTy,
12863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                                                  sb_out);
12873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
12883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return sb_out;
12903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
12913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12923b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstruct mon_out_buf {
12931636d33c13958b9c0e7d3059cdd5005746418eb2florian   HChar buf[DATASIZ+1];
12943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   int next;
12953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   UInt ret;
12963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj};
12973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
12983b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic void mon_out (HChar c, void *opaque)
12993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
13003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   struct mon_out_buf *b = (struct mon_out_buf *) opaque;
13013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   b->ret++;
13023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   b->buf[b->next] = c;
13033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   b->next++;
13043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (b->next == DATASIZ) {
13053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      b->buf[b->next] = '\0';
13063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      monitor_output(b->buf);
13073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      b->next = 0;
13083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
13093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
13103b290486cd4cd601b20e04340e593c9ed9717e5fsewardjUInt VG_(gdb_printf) ( const HChar *format, ... )
13113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
13123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   struct mon_out_buf b;
13133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   b.next = 0;
13153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   b.ret = 0;
13163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   va_list vargs;
13183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   va_start(vargs, format);
13193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(vcbprintf) (mon_out, &b, format, vargs);
13203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   va_end(vargs);
13213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (b.next > 0) {
13233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      b.buf[b.next] = '\0';
13243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      monitor_output(b.buf);
13253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
13263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   return b.ret;
13273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
13283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13296bd9dc18c043927c1196caba20a327238a179c42florianInt VG_(keyword_id) (const HChar* keywords, const HChar* input_word,
13306bd9dc18c043927c1196caba20a327238a179c42florian                     kwd_report_error report)
13313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
13323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   const Int il = (input_word == NULL ? 0 : VG_(strlen) (input_word));
133319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar  iw[il+1];
133419f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar  kwds[VG_(strlen)(keywords)+1];
133519f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar  *kwdssaveptr;
13363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13371636d33c13958b9c0e7d3059cdd5005746418eb2florian   HChar* kw; /* current keyword, its length, its position */
13383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int   kwl;
13393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int   kpos = -1;
13403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int pass;
13423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* pass 0 = search, optional pass 1 = output message multiple matches */
13433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int pass1needed = 0;
13453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int partial_match = -1;
13473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   Int full_match = -1;
13483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (input_word == NULL) {
13503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      iw[0] = 0;
13513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      partial_match = 0; /* to force an empty string to cause an error */
13523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
13533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(strcpy) (iw, input_word);
13543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
13553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   for (pass = 0; pass < 2; pass++) {
13573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(strcpy) (kwds, keywords);
13583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (pass == 1)
13593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         VG_(gdb_printf) ("%s can match",
13601636d33c13958b9c0e7d3059cdd5005746418eb2florian                          (il == 0 ? "<empty string>" : iw));
13613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      for (kw = VG_(strtok_r) (kwds, " ", &kwdssaveptr);
13623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           kw != NULL;
13633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj           kw = VG_(strtok_r) (NULL, " ", &kwdssaveptr)) {
13643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         kwl = VG_(strlen) (kw);
13653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         kpos++;
13663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
13673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (il > kwl) {
13683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            ; /* ishtar !~ is */
13693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         } else if (il == kwl) {
13703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            if (VG_(strcmp) (kw, iw) == 0) {
13713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               /* exact match */
13723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               if (pass == 1)
13733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                  VG_(gdb_printf) (" %s", kw);
13743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               if (full_match != -1)
13753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                  pass1needed++;
13763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               full_match = kpos;
13773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            }
13783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         } else {
13793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* il < kwl */
13803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            if (VG_(strncmp) (iw, kw, il) == 0) {
13813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               /* partial match */
13823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               if (pass == 1)
13833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                  VG_(gdb_printf) (" %s", kw);
13843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               if (partial_match != -1)
13853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                  pass1needed++;
13863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               partial_match = kpos;
13873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            }
13883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
13893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
13903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* check for success or for no match at all */
13913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (pass1needed == 0) {
13923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (full_match != -1) {
13933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return full_match;
13943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         } else {
13953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            if (report == kwd_report_all && partial_match == -1) {
13963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj               VG_(gdb_printf) ("%s does not match any of '%s'\n",
13973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                iw, keywords);
13983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            }
13993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return partial_match;
14003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
14013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
14023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* here we have duplicated match error */
14043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      if (pass == 1 || report == kwd_report_none) {
14053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (report != kwd_report_none) {
14063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            VG_(gdb_printf) ("\n");
14073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
14083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if (partial_match != -1 || full_match != -1)
14093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return -2;
14103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         else
14113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            return -1;
14123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
14133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
14143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   /* UNREACHED */
14153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   vg_assert (0);
14163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
14173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* True if string can be a 0x number */
14191636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic Bool is_zero_x (const HChar *s)
14203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
14213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (strlen (s) >= 3 && s[0] == '0' && s[1] == 'x')
14223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return True;
14233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   else
14243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False;
14253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
14263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* True if string can be a 0b number */
14281636d33c13958b9c0e7d3059cdd5005746418eb2florianstatic Bool is_zero_b (const HChar *s)
14293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
14303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (strlen (s) >= 3 && s[0] == '0' && s[1] == 'b')
14313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return True;
14323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   else
14333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      return False;
14343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
14353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
143607c08527f05caeb0062b42ca9a58ee774ec5fba1philippeBool VG_(strtok_get_address_and_size) (Addr* address,
14373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                                       SizeT* szB,
143819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian                                       HChar **ssaveptr)
14393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
144019f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar* wa;
144119f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar* ws;
144219f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   HChar* endptr;
144319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian   const HChar *ppc;
14443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   wa = VG_(strtok_r) (NULL, " ", ssaveptr);
14463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ppc = wa;
14473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (ppc == NULL || !VG_(parse_Addr) (&ppc, address)) {
14483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(gdb_printf) ("missing or malformed address\n");
14493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *address = (Addr) 0;
14503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *szB = 0;
145107c08527f05caeb0062b42ca9a58ee774ec5fba1philippe      return False;
14523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
14533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   ws = VG_(strtok_r) (NULL, " ", ssaveptr);
14543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (ws == NULL) {
14553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      /* Do nothing, i.e. keep current value of szB. */ ;
14563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else if (is_zero_x (ws)) {
14573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *szB = VG_(strtoull16) (ws, &endptr);
14583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else if (is_zero_b (ws)) {
14593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Int j;
14601636d33c13958b9c0e7d3059cdd5005746418eb2florian      HChar *parsews = ws;
14613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      Int n_bits = VG_(strlen) (ws) - 2;
14623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *szB = 0;
14633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      ws = NULL; // assume the below loop gives a correct nr.
14643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      for (j = 0; j < n_bits; j++) {
14653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         if      ('0' == parsews[j+2]) { /* do nothing */ }
14663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         else if ('1' == parsews[j+2]) *szB |= (1 << (n_bits-j-1));
14673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         else {
14683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            /* report malformed binary integer */
14693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            ws = parsews;
14703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            endptr = ws + j + 2;
14713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj            break;
14723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj         }
14733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      }
14743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   } else {
14753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *szB = VG_(strtoull10) (ws, &endptr);
14763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
14773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   if (ws != NULL && *endptr != '\0') {
14793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      VG_(gdb_printf) ("malformed integer, expecting "
14803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj                       "hex 0x..... or dec ...... or binary .....b\n");
14813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *address = (Addr) 0;
14823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      *szB = 0;
148307c08527f05caeb0062b42ca9a58ee774ec5fba1philippe      return False;
14843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   }
148507c08527f05caeb0062b42ca9a58ee774ec5fba1philippe   return True;
14863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
14873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
14883b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid VG_(gdbserver_status_output)(void)
14893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{
14903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   const int nr_gdbserved_addresses
14913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      = (gs_addresses == NULL ? -1 : VG_(HT_count_nodes) (gs_addresses));
14923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   const int nr_watchpoints
14930972443298eca5e7370f165981b456c6d8e37a19philippe      = (gs_watches == NULL ? -1 : (int) VG_(sizeXA) (gs_watches));
14943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   remote_utils_output_status();
14953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj   VG_(umsg)
14963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj      ("nr of calls to gdbserver: %d\n"
14973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       "single stepping %d\n"
14983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       "interrupts intr_tid %d gs_non_busy %d gs_busy %d tid_non_intr %d\n"
14993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       "gdbserved addresses %d (-1 = not initialized)\n"
15003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       "watchpoints %d (-1 = not initialized)\n"
1501180a7500bf2464d5b16cddb5618b91fb3f095998philippe       "vgdb-error %d\n"
1502180a7500bf2464d5b16cddb5618b91fb3f095998philippe       "hostvisibility %s\n",
15033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       gdbserver_called,
15043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       valgrind_single_stepping(),
15053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
15063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       vgdb_interrupted_tid,
15073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       interrupts_non_busy,
15083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       interrupts_while_busy,
15093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       interrupts_non_interruptible,
15103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj
15113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       nr_gdbserved_addresses,
15123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj       nr_watchpoints,
1513180a7500bf2464d5b16cddb5618b91fb3f095998philippe       VG_(dyn_vgdb_error),
1514180a7500bf2464d5b16cddb5618b91fb3f095998philippe       hostvisibility ? "yes" : "no");
15153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj}
1516