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