13b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Remote utility routines for the remote server for GDB. 23b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Copyright (C) 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 33b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2001, 2002, 2003, 2004, 2005, 2006, 2011 43b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Free Software Foundation, Inc. 53b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 63b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This file is part of GDB. 73b290486cd4cd601b20e04340e593c9ed9717e5fsewardj It has been modified to integrate it in valgrind 83b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 93b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This program is free software; you can redistribute it and/or modify 103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj it under the terms of the GNU General Public License as published by 113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj the Free Software Foundation; either version 2 of the License, or 123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (at your option) any later version. 133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This program is distributed in the hope that it will be useful, 153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj but WITHOUT ANY WARRANTY; without even the implied warranty of 163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj GNU General Public License for more details. 183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj You should have received a copy of the GNU General Public License 203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj along with this program; if not, write to the Free Software 213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Foundation, Inc., 51 Franklin Street, Fifth Floor, 223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Boston, MA 02110-1301, USA. */ 233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_basics.h" 253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_vki.h" 263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_vkiscnums.h" 273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_libcsignal.h" 283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "pub_core_options.h" 297463e49387b46e66b6612ff4b9683c612c92f804florian#include "pub_core_aspacemgr.h" 303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include "server.h" 323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# if defined(VGO_linux) 343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#include <sys/prctl.h> 353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# endif 363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 37853a1ce66afb2e5517bbac1dededea19a27b1534philippe/* Calls sr_perror with msg. 38853a1ce66afb2e5517bbac1dededea19a27b1534philippe Outputs more information about Valgrind state if verbosity > 0 39853a1ce66afb2e5517bbac1dededea19a27b1534philippe or debuglog_getlevel > 0. */ 40853a1ce66afb2e5517bbac1dededea19a27b1534philippestatic 41853a1ce66afb2e5517bbac1dededea19a27b1534philippevoid sr_extended_perror (SysRes sr, const HChar *msg) 42853a1ce66afb2e5517bbac1dededea19a27b1534philippe{ 435c683cf8f5095d1a0dcf6b8791bcaf4aee09c722mjw sr_perror (sr, "%s", msg); 44853a1ce66afb2e5517bbac1dededea19a27b1534philippe if (VG_(clo_verbosity) > 0 || VG_(debugLog_getLevel)() >= 1) { 45853a1ce66afb2e5517bbac1dededea19a27b1534philippe Int i; 46853a1ce66afb2e5517bbac1dededea19a27b1534philippe vki_sigset_t cursigset; 47853a1ce66afb2e5517bbac1dededea19a27b1534philippe VG_(show_sched_status) (True, // host_stacktrace 4838a74d2cc4670e3eb559adff51a376cd6ec98005philippe True, // stack_usage 49853a1ce66afb2e5517bbac1dededea19a27b1534philippe True); // exited_threads 50853a1ce66afb2e5517bbac1dededea19a27b1534philippe VG_(sigprocmask) (0, // dummy how. 51853a1ce66afb2e5517bbac1dededea19a27b1534philippe NULL, // do not change the sigmask 52853a1ce66afb2e5517bbac1dededea19a27b1534philippe &cursigset); // 53853a1ce66afb2e5517bbac1dededea19a27b1534philippe VG_(dmsg)("current sigmask value { "); 54853a1ce66afb2e5517bbac1dededea19a27b1534philippe for (i = 1; i <= _VKI_NSIG; i++) { 55853a1ce66afb2e5517bbac1dededea19a27b1534philippe if (VG_(sigismember)(&cursigset, i)) 56853a1ce66afb2e5517bbac1dededea19a27b1534philippe VG_(dmsg)("%u ", i); 57853a1ce66afb2e5517bbac1dededea19a27b1534philippe } 58853a1ce66afb2e5517bbac1dededea19a27b1534philippe VG_(dmsg)("}\n"); 59853a1ce66afb2e5517bbac1dededea19a27b1534philippe } 60853a1ce66afb2e5517bbac1dededea19a27b1534philippe} 61853a1ce66afb2e5517bbac1dededea19a27b1534philippe 6202fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe/* Calls VG_(poll) with given arguments. If VG_(poll) fails due to EINTR, 6302fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe restarts the syscall. 6402fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe Normally, VG_(poll) gdbsrv syscalls are not supposed to be interrupted : 6502fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe either gdbsrv has been called by the scheduler (so all async signals 6602fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe are masked) 6702fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe or gdbsrv has been forced invoked by vgdb+ptrace, and vgdb is queuing 6802fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe the signals. 6902fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe 7002fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe However, on old kernels (such as on RHEL5.5 2.6.18), when vgdb+ptrace 7102fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe intercepts and queues an async signal, the poll syscall is not properly 7202fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe restarted. Instead, it returns EINTR even if no signal was effectively 7302fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe received by the ptraced process. 7402fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe See red-hat "Bug 679129 - Change in behaviour between RH5.5 and RH6 7502fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe with ptrace and syscalls bugzilla" 7602fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe e.g. "Why rhel5 differs? Because unlike in rhel6, sys_poll() returns 7702fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe -EINTR if interrupted, that is all. This old implementation does 7802fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe not support the restart-if-eintr-is-spurious." 7902fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe 8002fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe So in case VG_(poll) fails with EINTR, we retry. */ 8102fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippestatic SysRes VG_(poll_no_eintr) (struct vki_pollfd *fds, Int nfds, Int timeout) 8202fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe{ 8302fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe const HChar* msg = "VG_(poll) failed (old kernel ?) retrying ... \n"; 8402fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe SysRes sr; 8502fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe do { 8602fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe sr = VG_(poll) (fds, nfds, timeout); 8702fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe if (!sr_isError(sr) || sr_Err(sr) != VKI_EINTR) 8802fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe return sr; 8902fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe sr_perror (sr, "%s", msg); 9002fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe if (VG_(debugLog_getLevel)() >= 1) { 9102fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe sr_extended_perror (sr, msg); 9202fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe } 9302fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe } while (1); 9402fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe /*NOTREACHED*/ 9502fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe} 9602fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe 973b290486cd4cd601b20e04340e593c9ed9717e5fsewardjBool noack_mode; 983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 993b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int readchar (int single); 1003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1013b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid remote_utils_output_status(void); 1023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 103ed4c5c1e52c80509e809d438db19b77a287ef79aphilippe#define INVALID_DESCRIPTOR -1 104ed4c5c1e52c80509e809d438db19b77a287ef79aphilippestatic int remote_desc = INVALID_DESCRIPTOR; 1053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1063b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic VgdbShared *shared; 1073b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int last_looked_cntr = -1; 1083b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic struct vki_pollfd remote_desc_pollfdread_activity; 1093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* for a gdbserver embedded in valgrind, we read from a FIFO and write 1113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj to another FIFO So, we need two descriptors */ 1123b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int write_remote_desc = INVALID_DESCRIPTOR; 1133b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int pid_from_to_creator; 1143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* only this pid will remove the FIFOs: if an exec fails, we must avoid 1153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj that the exiting child believes it has to remove the FIFOs of its parent */ 1163b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic int mknod_done = 0; 1173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1183b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic char *from_gdb = NULL; 1193b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic char *to_gdb = NULL; 1203b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic char *shared_mem = NULL; 1213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1223b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 1236bd9dc18c043927c1196caba20a327238a179c42florianint open_fifo (const char *side, const char *path, int flags) 1243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj SysRes o; 1263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int fd; 1273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "Opening %s side %s\n", side, path); 1283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj o = VG_(open) (path, flags, 0); 1293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_isError (o)) { 1303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj sr_perror(o, "open fifo %s\n", path); 1313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fatal ("valgrind: fatal error: vgdb FIFO cannot be opened.\n"); 1323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 1333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fd = sr_Res(o); 1343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "result fd %d\n", fd); 1353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 1363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fd = VG_(safe_fd)(fd); 1373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "result safe_fd %d\n", fd); 1383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (fd == -1) 1393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fatal("safe_fd for vgdb FIFO failed\n"); 1403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return fd; 1413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 1423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1433b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid remote_utils_output_status(void) 1443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (shared == NULL) 1463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("remote communication not initialized\n"); 1473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 1483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("shared->written_by_vgdb %d shared->seen_by_valgrind %d\n", 1493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared->written_by_vgdb, shared->seen_by_valgrind); 1503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 1513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Returns 0 if vgdb and connection state looks good, 1533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj otherwise returns an int value telling which check failed. */ 1543b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 1556bd9dc18c043927c1196caba20a327238a179c42florianint vgdb_state_looks_bad(const char* where) 1563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(kill)(shared->vgdb_pid, 0) != 0) 1583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 1; // vgdb process does not exist anymore. 1593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remote_desc_activity(where) == 2) 1613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 2; // check for error on remote desc shows a problem 1623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remote_desc == INVALID_DESCRIPTOR) 1643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 3; // after check, remote_desc not ok anymore 1653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 0; // all is ok. 1673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 1683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 16925583179757e4393a687330732675e3c63c0e0d1philippevoid VG_(set_ptracer)(void) 1703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 1713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#ifdef PR_SET_PTRACER 1723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj SysRes o; 1736bd9dc18c043927c1196caba20a327238a179c42florian const char *ptrace_scope_setting_file = "/proc/sys/kernel/yama/ptrace_scope"; 1743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int fd; 1753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char ptrace_scope; 1763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int ret; 1773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj o = VG_(open) (ptrace_scope_setting_file, VKI_O_RDONLY, 0); 1793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_isError(o)) { 180d142f99836471d4245250247cc9ac7bc5a1391fasewardj if (VG_(debugLog_getLevel)() >= 1) { 181d142f99836471d4245250247cc9ac7bc5a1391fasewardj sr_perror(o, "error VG_(open) %s\n", ptrace_scope_setting_file); 182d142f99836471d4245250247cc9ac7bc5a1391fasewardj } 1833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* can't read setting. Assuming ptrace can be called by vgdb. */ 1843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return; 1853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 1863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fd = sr_Res(o); 1873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(read) (fd, &ptrace_scope, 1) == 1) { 1883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "ptrace_scope %c\n", ptrace_scope); 1893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (ptrace_scope != '0') { 1903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* insufficient default ptrace_scope. 19125583179757e4393a687330732675e3c63c0e0d1philippe Indicate to the kernel that we accept to be ptraced. */ 19225583179757e4393a687330732675e3c63c0e0d1philippe#ifdef PR_SET_PTRACER_ANY 19325583179757e4393a687330732675e3c63c0e0d1philippe ret = VG_(prctl) (PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); 19425583179757e4393a687330732675e3c63c0e0d1philippe dlog(1, "set_ptracer to PR_SET_PTRACER_ANY result %d\n", ret); 19525583179757e4393a687330732675e3c63c0e0d1philippe#else 19625583179757e4393a687330732675e3c63c0e0d1philippe ret = VG_(prctl) (PR_SET_PTRACER, 1, 0, 0, 0); 19725583179757e4393a687330732675e3c63c0e0d1philippe dlog(1, "set_ptracer to 1 result %d\n", ret); 19825583179757e4393a687330732675e3c63c0e0d1philippe#endif 19925583179757e4393a687330732675e3c63c0e0d1philippe if (ret) 20025583179757e4393a687330732675e3c63c0e0d1philippe VG_(umsg)("error calling PR_SET_PTRACER, vgdb might block\n"); 2013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 2033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(0, "Could not read the ptrace_scope setting from %s\n", 2043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ptrace_scope_setting_file); 2053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(close) (fd); 2083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#endif 2093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 2103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* returns 1 if one or more poll "errors" is set. 2123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Errors are: VKI_POLLERR or VKI_POLLHUP or VKI_POLLNAL */ 2133b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 2143b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint poll_cond (short revents) 2153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 2163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return (revents & (VKI_POLLERR | VKI_POLLHUP | VKI_POLLNVAL)); 2173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 2183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Ensures we have a valid write file descriptor. 2203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Returns 1 if we have a valid write file descriptor, 2214254584008012b975d47540812612f297ed68d0aphilippe 0 if the write fd is not valid/cannot be opened. */ 2223b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 2233b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint ensure_write_remote_desc(void) 2243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 2253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj struct vki_pollfd write_remote_desc_ok; 2264254584008012b975d47540812612f297ed68d0aphilippe SysRes ret; 2273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (write_remote_desc != INVALID_DESCRIPTOR) { 2283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj write_remote_desc_ok.fd = write_remote_desc; 2293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj write_remote_desc_ok.events = VKI_POLLOUT; 2303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj write_remote_desc_ok.revents = 0; 23102fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe ret = VG_(poll_no_eintr)(&write_remote_desc_ok, 1, 0); 2324254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret) 2334254584008012b975d47540812612f297ed68d0aphilippe || (sr_Res(ret) > 0 && poll_cond(write_remote_desc_ok.revents))) { 2344254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret)) { 235853a1ce66afb2e5517bbac1dededea19a27b1534philippe sr_extended_perror(ret, "ensure_write_remote_desc: poll error\n"); 2364254584008012b975d47540812612f297ed68d0aphilippe } else { 2374254584008012b975d47540812612f297ed68d0aphilippe dlog(0, "POLLcond %d closing write_remote_desc %d\n", 2384254584008012b975d47540812612f297ed68d0aphilippe write_remote_desc_ok.revents, write_remote_desc); 2394254584008012b975d47540812612f297ed68d0aphilippe } 2404254584008012b975d47540812612f297ed68d0aphilippe VG_(close) (write_remote_desc); 2414254584008012b975d47540812612f297ed68d0aphilippe write_remote_desc = INVALID_DESCRIPTOR; 2423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (write_remote_desc == INVALID_DESCRIPTOR) { 2453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* open_fifo write will block if the receiving vgdb 2463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj process is dead. So, let's check for vgdb state to 2473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj be reasonably sure someone is reading on the other 2483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj side of the fifo. */ 2493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!vgdb_state_looks_bad("bad?@ensure_write_remote_desc")) { 2503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj write_remote_desc = open_fifo ("write", to_gdb, VKI_O_WRONLY); 2513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return (write_remote_desc != INVALID_DESCRIPTOR); 2553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 2563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 2573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#if defined(VGO_darwin) 2583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#define VKI_S_IFIFO 0010000 2593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj#endif 2603b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 2613b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid safe_mknod (char *nod) 2623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 2633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj SysRes m; 264c42a5ccb75501c196e3bcd1a6ef56298a635ece8philippe m = VG_(mknod) (nod, VKI_S_IFIFO|0600, 0); 2653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_isError (m)) { 2663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_Err (m) == VKI_EEXIST) { 2673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(clo_verbosity) > 1) { 2683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("%s already created\n", nod); 2693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 2713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj sr_perror(m, "mknod %s\n", nod); 2723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg) ("valgrind: fatal error: vgdb FIFOs cannot be created.\n"); 2733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(exit)(1); 2743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 2763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 2773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 278e1206672ceb16745cef1d1ed099372b3158882c9philippe/* If remote_desc is not opened, open it. 279e1206672ceb16745cef1d1ed099372b3158882c9philippe Setup remote_desc_pollfdread_activity. */ 280e1206672ceb16745cef1d1ed099372b3158882c9philippestatic void setup_remote_desc_for_reading (void) 281e1206672ceb16745cef1d1ed099372b3158882c9philippe{ 282e1206672ceb16745cef1d1ed099372b3158882c9philippe int save_fcntl_flags; 283e1206672ceb16745cef1d1ed099372b3158882c9philippe 284e1206672ceb16745cef1d1ed099372b3158882c9philippe if (remote_desc == INVALID_DESCRIPTOR) { 285e1206672ceb16745cef1d1ed099372b3158882c9philippe /* we open the read side FIFO in non blocking mode 286e1206672ceb16745cef1d1ed099372b3158882c9philippe We then set the fd in blocking mode. 287e1206672ceb16745cef1d1ed099372b3158882c9philippe Opening in non-blocking read mode always succeeds while opening 288e1206672ceb16745cef1d1ed099372b3158882c9philippe in non-blocking write mode succeeds only if the fifo is already 289e1206672ceb16745cef1d1ed099372b3158882c9philippe opened in read mode. So, we wait till we have read the first 290e1206672ceb16745cef1d1ed099372b3158882c9philippe character from the read side before opening the write side. */ 291e1206672ceb16745cef1d1ed099372b3158882c9philippe remote_desc = open_fifo ("read", from_gdb, VKI_O_RDONLY|VKI_O_NONBLOCK); 292e1206672ceb16745cef1d1ed099372b3158882c9philippe save_fcntl_flags = VG_(fcntl) (remote_desc, VKI_F_GETFL, 0); 293e1206672ceb16745cef1d1ed099372b3158882c9philippe VG_(fcntl) (remote_desc, VKI_F_SETFL, save_fcntl_flags & ~VKI_O_NONBLOCK); 294e1206672ceb16745cef1d1ed099372b3158882c9philippe } 295e1206672ceb16745cef1d1ed099372b3158882c9philippe remote_desc_pollfdread_activity.fd = remote_desc; 296e1206672ceb16745cef1d1ed099372b3158882c9philippe remote_desc_pollfdread_activity.events = VKI_POLLIN; 297e1206672ceb16745cef1d1ed099372b3158882c9philippe remote_desc_pollfdread_activity.revents = 0; 298e1206672ceb16745cef1d1ed099372b3158882c9philippe} 299e1206672ceb16745cef1d1ed099372b3158882c9philippe 3003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Open a connection to a remote debugger. 3013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj NAME is the filename used for communication. 3023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj For Valgrind, name is the prefix for the two read and write FIFOs 3033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj The two FIFOs names will be build by appending 304ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian -from-vgdb-to-pid-by-user-on-host and -to-vgdb-from-pid-by-user-on-host 3053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj with pid being the pidnr of the valgrind process These two FIFOs 3063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj will be created if not existing yet. They will be removed when 3073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj the gdbserver connection is closed or the process exits */ 3083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 30919f91bbaedb4caef8a60ce94b0f507193cc0bc10florianvoid remote_open (const HChar *name) 3103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 311ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian const HChar *user, *host; 312e1206672ceb16745cef1d1ed099372b3158882c9philippe int len; 3133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VgdbShared vgdbinit = 314578642013e14f1d5d3f36cfebf4ad51124ba5e77philippe {0, 0, (Addr) VG_(invoke_gdbserver), 315b12f502f96dee3ead809420943ce5386ded4775aphilippe (Addr) VG_(threads), VG_N_THREADS, sizeof(ThreadState), 3163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj offsetof(ThreadState, status), 317578642013e14f1d5d3f36cfebf4ad51124ba5e77philippe offsetof(ThreadState, os_state) + offsetof(ThreadOSstate, lwpid), 318578642013e14f1d5d3f36cfebf4ad51124ba5e77philippe 0}; 3193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj const int pid = VG_(getpid)(); 3203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Addr addr_shared; 3213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj SysRes o; 3223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int shared_mem_fd = INVALID_DESCRIPTOR; 3233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 324ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian user = VG_(getenv)("LOGNAME"); 325ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian if (user == NULL) user = VG_(getenv)("USER"); 326ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian if (user == NULL) user = "???"; 327511df4ecbd147628cb33f556e34d4c0dbfbff51aflorian if (VG_(strchr)(user, '/')) user = "???"; 328ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian 329ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian host = VG_(getenv)("HOST"); 330ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian if (host == NULL) host = VG_(getenv)("HOSTNAME"); 331ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian if (host == NULL) host = "???"; 332511df4ecbd147628cb33f556e34d4c0dbfbff51aflorian if (VG_(strchr)(host, '/')) host = "???"; 333ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian 334ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian len = strlen(name) + strlen(user) + strlen(host) + 40; 335ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian 3363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (from_gdb != NULL) 3373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (from_gdb); 338ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian from_gdb = malloc (len); 3393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (to_gdb != NULL) 3403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (to_gdb); 341ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian to_gdb = malloc (len); 3423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (shared_mem != NULL) 3433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (shared_mem); 344ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian shared_mem = malloc (len); 3453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* below 3 lines must match the equivalent in vgdb.c */ 346ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian VG_(sprintf) (from_gdb, "%s-from-vgdb-to-%d-by-%s-on-%s", name, 347ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian pid, user, host); 348ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian VG_(sprintf) (to_gdb, "%s-to-vgdb-from-%d-by-%s-on-%s", name, 349ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian pid, user, host); 350ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian VG_(sprintf) (shared_mem, "%s-shared-mem-vgdb-%d-by-%s-on-%s", name, 351ab8630fd1c559a3d8a3e429cf8e9f2e4b94a3ff6florian pid, user, host); 3523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(clo_verbosity) > 1) { 3533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("embedded gdbserver: reading from %s\n", from_gdb); 3543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("embedded gdbserver: writing to %s\n", to_gdb); 3553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(umsg)("embedded gdbserver: shared mem %s\n", shared_mem); 3561568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)("\n"); 3571568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)("TO CONTROL THIS PROCESS USING vgdb (which you probably\n" 3581568e17cf07007c677274ce877973c7ed9357df2sewardj "don't want to do, unless you know exactly what you're doing,\n" 3591568e17cf07007c677274ce877973c7ed9357df2sewardj "or are doing some strange experiment):\n" 3604be47bca8e94c0ae640d83287b6656e4cbfb35f0philippe " %s/../../bin/vgdb%s%s --pid=%d ...command...\n", 361cffe2a55d903655761ccc6025a23b823bee10170philippe VG_(libdir), 362cffe2a55d903655761ccc6025a23b823bee10170philippe (VG_(arg_vgdb_prefix) ? " " : ""), 363cffe2a55d903655761ccc6025a23b823bee10170philippe (VG_(arg_vgdb_prefix) ? VG_(arg_vgdb_prefix) : ""), 3644be47bca8e94c0ae640d83287b6656e4cbfb35f0philippe pid); 3651568e17cf07007c677274ce877973c7ed9357df2sewardj } 3661568e17cf07007c677274ce877973c7ed9357df2sewardj if (VG_(clo_verbosity) > 1 36708a0e88312de3bf39ef35e1f47e79e2537041941philippe || VG_(clo_vgdb_error) < 999999999 36808a0e88312de3bf39ef35e1f47e79e2537041941philippe || VG_(clo_vgdb_stop_at) != 0) { 3691568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)("\n"); 3701568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)( 3711568e17cf07007c677274ce877973c7ed9357df2sewardj "TO DEBUG THIS PROCESS USING GDB: start GDB like this\n" 3721568e17cf07007c677274ce877973c7ed9357df2sewardj " /path/to/gdb %s\n" 3731568e17cf07007c677274ce877973c7ed9357df2sewardj "and then give GDB the following command\n" 3744be47bca8e94c0ae640d83287b6656e4cbfb35f0philippe " target remote | %s/../../bin/vgdb%s%s --pid=%d\n", 3751568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(args_the_exename), 376cffe2a55d903655761ccc6025a23b823bee10170philippe VG_(libdir), 377cffe2a55d903655761ccc6025a23b823bee10170philippe (VG_(arg_vgdb_prefix) ? " " : ""), 378cffe2a55d903655761ccc6025a23b823bee10170philippe (VG_(arg_vgdb_prefix) ? VG_(arg_vgdb_prefix) : ""), 3794be47bca8e94c0ae640d83287b6656e4cbfb35f0philippe pid 3801568e17cf07007c677274ce877973c7ed9357df2sewardj ); 3811568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)("--pid is optional if only one valgrind process is running\n"); 3821568e17cf07007c677274ce877973c7ed9357df2sewardj VG_(umsg)("\n"); 3833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 3843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 3853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!mknod_done) { 3863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj mknod_done++; 38725583179757e4393a687330732675e3c63c0e0d1philippe VG_(set_ptracer)(); 3884b03d390a5e185efda5ca79eddf4016a85624048bart /* 3894b03d390a5e185efda5ca79eddf4016a85624048bart * Unlink just in case a previous process with the same PID had been 3904b03d390a5e185efda5ca79eddf4016a85624048bart * killed and hence Valgrind hasn't had the chance yet to remove these. 3914b03d390a5e185efda5ca79eddf4016a85624048bart */ 3924b03d390a5e185efda5ca79eddf4016a85624048bart VG_(unlink)(from_gdb); 3934b03d390a5e185efda5ca79eddf4016a85624048bart VG_(unlink)(to_gdb); 3944b03d390a5e185efda5ca79eddf4016a85624048bart VG_(unlink)(shared_mem); 3954b03d390a5e185efda5ca79eddf4016a85624048bart 396c42a5ccb75501c196e3bcd1a6ef56298a635ece8philippe o = VG_(open) (shared_mem, VKI_O_CREAT|VKI_O_RDWR, 0600); 3973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_isError (o)) { 3983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj sr_perror(o, "cannot create shared_mem file %s\n", shared_mem); 3995b99e6669a0b2a925bb3fb2604259cc317963b6dflorian fatal("Cannot recover from previous error. Good-bye."); 4003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 4013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared_mem_fd = sr_Res(o); 4023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 4043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(write)(shared_mem_fd, &vgdbinit, sizeof(VgdbShared)) 4053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj != sizeof(VgdbShared)) { 4063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj fatal("error writing %d bytes to shared mem %s\n", 4073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (int) sizeof(VgdbShared), shared_mem); 4083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { 4103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj SysRes res = VG_(am_shared_mmap_file_float_valgrind) 4113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (sizeof(VgdbShared), VKI_PROT_READ|VKI_PROT_WRITE, 4123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared_mem_fd, (Off64T)0); 4133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (sr_isError(res)) { 4143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj sr_perror(res, "error VG_(am_shared_mmap_file_float_valgrind) %s\n", 4153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared_mem); 4165b99e6669a0b2a925bb3fb2604259cc317963b6dflorian fatal("Cannot recover from previous error. Good-bye."); 4173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj addr_shared = sr_Res (res); 4193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared = (VgdbShared*) addr_shared; 4211ac21102f27aee0114733566ef4abd559051c5dasewardj VG_(close) (shared_mem_fd); 4229450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe 4239450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe safe_mknod(to_gdb); 4249450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe safe_mknod(from_gdb); 4259450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe /* from_gdb is the last resource created: vgdb searches such FIFOs 4269450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe to detect the presence of a valgrind process. 4279450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe So, we better create this resource when all the rest needed by 4289450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe vgdb is ready : the other FIFO and the shared memory. */ 4299450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe 4309450a8eaa52f6c46a472f63ea7e81ad2a11615a6philippe pid_from_to_creator = pid; 4313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 433e1206672ceb16745cef1d1ed099372b3158882c9philippe setup_remote_desc_for_reading (); 4343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 4353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 4363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* sync_gdb_connection wait a time long enough to let the connection 4373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj be properly closed if needed when closing the connection (in case 4383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj of detach or error), if we reopen it too quickly, it seems there 4393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj are some events queued in the kernel concerning the "old" 4403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj connection/remote_desc which are discovered with poll or select on 4413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj the "new" connection/remote_desc. We bypass this by waiting some 4423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj time to let a proper cleanup to be donex */ 4433b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid sync_gdb_connection(void) 4443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 445853a1ce66afb2e5517bbac1dededea19a27b1534philippe SysRes ret; 44602fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe ret = VG_(poll_no_eintr)(0, 0, 100); 447853a1ce66afb2e5517bbac1dededea19a27b1534philippe if (sr_isError(ret)) 448853a1ce66afb2e5517bbac1dededea19a27b1534philippe sr_extended_perror(ret, "sync_gdb_connection: poll error\n"); 4493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 4503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 4513b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 4526bd9dc18c043927c1196caba20a327238a179c42florianconst char * ppFinishReason (FinishReason reason) 4533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 4543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj switch (reason) { 4553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case orderly_finish: return "orderly_finish"; 4563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case reset_after_error: return "reset_after_error"; 4573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj case reset_after_fork: return "reset_after_fork"; 4583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj default: vg_assert (0); 4593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 4613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 4623b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid remote_finish (FinishReason reason) 4633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 4643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "remote_finish (reason %s) %d %d\n", 4653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ppFinishReason(reason), remote_desc, write_remote_desc); 4663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj reset_valgrind_sink(ppFinishReason(reason)); 4673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (write_remote_desc != INVALID_DESCRIPTOR) 4683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(close) (write_remote_desc); 4693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj write_remote_desc = INVALID_DESCRIPTOR; 470ed4c5c1e52c80509e809d438db19b77a287ef79aphilippe 471e1206672ceb16745cef1d1ed099372b3158882c9philippe if (remote_desc != INVALID_DESCRIPTOR) { 472ed4c5c1e52c80509e809d438db19b77a287ef79aphilippe /* Fully close the connection, either due to orderly_finish or 473def5aae79084c7b1128674105f9e657e2af0d5dcphilippe to reset_after_fork or reset_after_error. For 474def5aae79084c7b1128674105f9e657e2af0d5dcphilippe reset_after_error, the FIFO will be re-opened soon. This 475def5aae79084c7b1128674105f9e657e2af0d5dcphilippe leaves a small window during which a race condition can 476def5aae79084c7b1128674105f9e657e2af0d5dcphilippe happen between vgdb and a forking process: Just after fork, 477def5aae79084c7b1128674105f9e657e2af0d5dcphilippe both the parent and the child have the FIFO open. The child 478def5aae79084c7b1128674105f9e657e2af0d5dcphilippe will close it asap (as part of the 'after fork cleanup'). If 479def5aae79084c7b1128674105f9e657e2af0d5dcphilippe 2 vgdbs are launched very quickly just after the fork, the 480def5aae79084c7b1128674105f9e657e2af0d5dcphilippe parent will close its FIFO when the 1st vgdb exits. Then if 481def5aae79084c7b1128674105f9e657e2af0d5dcphilippe the 2nd vgdb is started before the parent has the time to 482def5aae79084c7b1128674105f9e657e2af0d5dcphilippe re-open the FIFO, the 2nd vgdb will be able to open the FIFO 483def5aae79084c7b1128674105f9e657e2af0d5dcphilippe (as it is still opened by the child). The 2nd vgdb can then 484def5aae79084c7b1128674105f9e657e2af0d5dcphilippe have a 'write' error when the child closes the FIFO. After 485def5aae79084c7b1128674105f9e657e2af0d5dcphilippe the 1st vgdb closes its FIFO write side, the parent gets EOF 486def5aae79084c7b1128674105f9e657e2af0d5dcphilippe on its reading FIFO till it is closed and re-opened. Opening 487def5aae79084c7b1128674105f9e657e2af0d5dcphilippe a 2nd time the FIFO before closing the 'previous fd' solves 488def5aae79084c7b1128674105f9e657e2af0d5dcphilippe this race condition, but causes other (not understood) 489def5aae79084c7b1128674105f9e657e2af0d5dcphilippe problems due to too early re-invocation of gdbsrv. Rather 490def5aae79084c7b1128674105f9e657e2af0d5dcphilippe than to handle this race condition in gdbsrv side, we put a 491def5aae79084c7b1128674105f9e657e2af0d5dcphilippe 'retry' loop in vgdb for the initial write on the write 492def5aae79084c7b1128674105f9e657e2af0d5dcphilippe FIFO. */ 493def5aae79084c7b1128674105f9e657e2af0d5dcphilippe remote_desc_pollfdread_activity.fd = INVALID_DESCRIPTOR; 494def5aae79084c7b1128674105f9e657e2af0d5dcphilippe remote_desc_pollfdread_activity.events = 0; 495def5aae79084c7b1128674105f9e657e2af0d5dcphilippe remote_desc_pollfdread_activity.revents = 0; 496def5aae79084c7b1128674105f9e657e2af0d5dcphilippe VG_(close) (remote_desc); 497def5aae79084c7b1128674105f9e657e2af0d5dcphilippe remote_desc = INVALID_DESCRIPTOR; 4983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj noack_mode = False; 5003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* ensure the child will create its own FIFOs */ 5023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (reason == reset_after_fork) 5033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj mknod_done = 0; 5043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (reason == reset_after_error) 5063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj sync_gdb_connection(); 5073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 5083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* orderly close, cleans up everything */ 5103b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid remote_close (void) 5113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 5123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj const int pid = VG_(getpid)(); 5133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remote_finish(orderly_finish); 514180a7500bf2464d5b16cddb5618b91fb3f095998philippe dlog(1, "%d (creator %d) maybe unlinking \n %s\n %s\n %s\n", 515180a7500bf2464d5b16cddb5618b91fb3f095998philippe pid, pid_from_to_creator, 516180a7500bf2464d5b16cddb5618b91fb3f095998philippe from_gdb ? from_gdb : "NULL", 517180a7500bf2464d5b16cddb5618b91fb3f095998philippe to_gdb ? to_gdb : "NULL", 518180a7500bf2464d5b16cddb5618b91fb3f095998philippe shared_mem ? shared_mem : "NULL"); 519180a7500bf2464d5b16cddb5618b91fb3f095998philippe if (pid == pid_from_to_creator && from_gdb && VG_(unlink) (from_gdb) == -1) 520180a7500bf2464d5b16cddb5618b91fb3f095998philippe warning ("could not unlink %s\n", from_gdb); 521180a7500bf2464d5b16cddb5618b91fb3f095998philippe if (pid == pid_from_to_creator && to_gdb && VG_(unlink) (to_gdb) == -1) 522180a7500bf2464d5b16cddb5618b91fb3f095998philippe warning ("could not unlink %s\n", to_gdb); 523180a7500bf2464d5b16cddb5618b91fb3f095998philippe if (pid == pid_from_to_creator && shared_mem && VG_(unlink) (shared_mem) == -1) 524180a7500bf2464d5b16cddb5618b91fb3f095998philippe warning ("could not unlink %s\n", shared_mem); 5253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (from_gdb); 526180a7500bf2464d5b16cddb5618b91fb3f095998philippe from_gdb = NULL; 5273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (to_gdb); 528180a7500bf2464d5b16cddb5618b91fb3f095998philippe to_gdb = NULL; 529180a7500bf2464d5b16cddb5618b91fb3f095998philippe free (shared_mem); 530180a7500bf2464d5b16cddb5618b91fb3f095998philippe shared_mem = NULL; 5313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 5323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5333b290486cd4cd601b20e04340e593c9ed9717e5fsewardjBool remote_connected(void) 5343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 5353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return write_remote_desc != INVALID_DESCRIPTOR; 5363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 5373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* cleanup after an error detected by poll_cond */ 5393b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 5403b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid error_poll_cond(void) 5413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 5423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* if we will close the connection, we assume either that 5433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj all characters have been seen or that they will be dropped. */ 5443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared->seen_by_valgrind = shared->written_by_vgdb; 5453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remote_finish(reset_after_error); 5463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 5473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* remote_desc_activity might be used at high frequency if the user 5493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gives a small value to --vgdb-poll. So, the function avoids 5503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj doing repetitively system calls by rather looking at the 5513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj counter values maintained in shared memory by vgdb. */ 5526bd9dc18c043927c1196caba20a327238a179c42florianint remote_desc_activity(const char *msg) 5533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 5544254584008012b975d47540812612f297ed68d0aphilippe int retval; 5554254584008012b975d47540812612f297ed68d0aphilippe SysRes ret; 5563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj const int looking_at = shared->written_by_vgdb; 5573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (shared->seen_by_valgrind == looking_at) 5583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 0; 5593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remote_desc == INVALID_DESCRIPTOR) 5603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 0; 5613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* poll the remote desc */ 5633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remote_desc_pollfdread_activity.revents = 0; 56402fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe ret = VG_(poll_no_eintr) (&remote_desc_pollfdread_activity, 1, 0); 5654254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret) 5664254584008012b975d47540812612f297ed68d0aphilippe || (sr_Res(ret) && poll_cond(remote_desc_pollfdread_activity.revents))) { 5674254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret)) { 568853a1ce66afb2e5517bbac1dededea19a27b1534philippe sr_extended_perror(ret, "remote_desc_activity: poll error\n"); 5694254584008012b975d47540812612f297ed68d0aphilippe } else { 5704254584008012b975d47540812612f297ed68d0aphilippe dlog(0, "POLLcond %d remote_desc_pollfdread %d\n", 5714254584008012b975d47540812612f297ed68d0aphilippe remote_desc_pollfdread_activity.revents, remote_desc); 5724254584008012b975d47540812612f297ed68d0aphilippe error_poll_cond(); 5734254584008012b975d47540812612f297ed68d0aphilippe } 5744254584008012b975d47540812612f297ed68d0aphilippe retval = 2; 5754254584008012b975d47540812612f297ed68d0aphilippe } else { 5764254584008012b975d47540812612f297ed68d0aphilippe retval = sr_Res(ret); 5773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 5783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, 5793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj "remote_desc_activity %s %d last_looked_cntr %d looking_at %d" 5803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj " shared->written_by_vgdb %d shared->seen_by_valgrind %d" 5814254584008012b975d47540812612f297ed68d0aphilippe " retval %d\n", 5823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj msg, remote_desc, last_looked_cntr, looking_at, 5833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared->written_by_vgdb, shared->seen_by_valgrind, 5844254584008012b975d47540812612f297ed68d0aphilippe retval); 5853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* if no error from poll, indicate we have "seen" up to looking_at */ 5864254584008012b975d47540812612f297ed68d0aphilippe if (retval == 1) 5873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj last_looked_cntr = looking_at; 5884254584008012b975d47540812612f297ed68d0aphilippe return retval; 5893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 5903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Convert hex digit A to a number. */ 5923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5933b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 5943b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint fromhex (int a) 5953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 5963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (a >= '0' && a <= '9') 5973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return a - '0'; 5983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else if (a >= 'a' && a <= 'f') 5993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return a - 'a' + 10; 6003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 6013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj error ("Reply contains invalid hex digit 0x%x\n", a); 6023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 0; 6033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 6043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6053b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint unhexify (char *bin, const char *hex, int count) 6063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 6073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i; 6083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (i = 0; i < count; i++) { 6103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (hex[0] == 0 || hex[1] == 0) { 6113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Hex string is short, or of uneven length. 6123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Return the count that has been converted so far. */ 6133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return i; 6143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 6153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); 6163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj hex += 2; 6173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 6183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return i; 6193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 6203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6213b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid decode_address (CORE_ADDR *addrp, const char *start, int len) 6223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 6233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj CORE_ADDR addr; 6243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char ch; 6253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i; 6263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj addr = 0; 6283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (i = 0; i < len; i++) { 6293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ch = start[i]; 6303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj addr = addr << 4; 6313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj addr = addr | (fromhex (ch) & 0x0f); 6323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 6333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *addrp = addr; 6343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 6353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Convert number NIB to a hex digit. */ 6373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6383b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 6393b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint tohex (int nib) 6403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 6413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (nib < 10) 6423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return '0' + nib; 6433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 6443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 'a' + nib - 10; 6453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 6463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6473b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint hexify (char *hex, const char *bin, int count) 6483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 6493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i; 6503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* May use a length, or a nul-terminated string as input. */ 6523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (count == 0) 6533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj count = strlen (bin); 6543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (i = 0; i < count; i++) { 6563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *hex++ = tohex ((*bin >> 4) & 0xf); 6573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *hex++ = tohex (*bin++ & 0xf); 6583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 6593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *hex = 0; 6603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return i; 6613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 6623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 663349a39142e16d060936911c1792cc0a5d2fe63fephilippe/* builds an image of bin according to byte order of the architecture 664349a39142e16d060936911c1792cc0a5d2fe63fephilippe Useful for register and int image */ 665349a39142e16d060936911c1792cc0a5d2fe63fephilippechar* heximage (char *buf, char *bin, int count) 666349a39142e16d060936911c1792cc0a5d2fe63fephilippe{ 667a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe#if (VKI_LITTLE_ENDIAN) 668349a39142e16d060936911c1792cc0a5d2fe63fephilippe char rev[count]; 669349a39142e16d060936911c1792cc0a5d2fe63fephilippe /* note: no need for trailing \0, length is known with count */ 670a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe int i; 671a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe for (i = 0; i < count; i++) 672a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe rev[i] = bin[count - i - 1]; 673a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe hexify (buf, rev, count); 674349a39142e16d060936911c1792cc0a5d2fe63fephilippe#else 675a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe hexify (buf, bin, count); 676349a39142e16d060936911c1792cc0a5d2fe63fephilippe#endif 677a0a0c6bc3ed5df4cf05db6ce90c881199152127dphilippe return buf; 678349a39142e16d060936911c1792cc0a5d2fe63fephilippe} 679349a39142e16d060936911c1792cc0a5d2fe63fephilippe 680349a39142e16d060936911c1792cc0a5d2fe63fephilippevoid* C2v(CORE_ADDR addr) 681349a39142e16d060936911c1792cc0a5d2fe63fephilippe{ 682349a39142e16d060936911c1792cc0a5d2fe63fephilippe return (void*) addr; 683349a39142e16d060936911c1792cc0a5d2fe63fephilippe} 684349a39142e16d060936911c1792cc0a5d2fe63fephilippe 685349a39142e16d060936911c1792cc0a5d2fe63fephilippe 6863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Convert BUFFER, binary data at least LEN bytes long, into escaped 6873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj binary data in OUT_BUF. Set *OUT_LEN to the length of the data 6883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj encoded in OUT_BUF, and return the number of bytes in OUT_BUF 6893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (which may be more than *OUT_LEN due to escape characters). The 6903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj total number of bytes in the output buffer will be at most 6913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj OUT_MAXLEN. */ 6923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 6933b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint 6943b290486cd4cd601b20e04340e593c9ed9717e5fsewardjremote_escape_output (const gdb_byte *buffer, int len, 6953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdb_byte *out_buf, int *out_len, 6963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int out_maxlen) 6973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 6983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int input_index, output_index; 6993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj output_index = 0; 7013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (input_index = 0; input_index < len; input_index++) { 7023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdb_byte b = buffer[input_index]; 7033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (b == '$' || b == '#' || b == '}' || b == '*') { 7053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* These must be escaped. */ 7063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (output_index + 2 > out_maxlen) 7073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 7083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj out_buf[output_index++] = '}'; 7093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj out_buf[output_index++] = b ^ 0x20; 7103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 7113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (output_index + 1 > out_maxlen) 7123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 7133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj out_buf[output_index++] = b; 7143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 7153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 7163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *out_len = input_index; 7183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return output_index; 7193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 7203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Convert BUFFER, escaped data LEN bytes long, into binary data 7223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj in OUT_BUF. Return the number of bytes written to OUT_BUF. 7233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Raise an error if the total number of bytes exceeds OUT_MAXLEN. 7243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj This function reverses remote_escape_output. It allows more 7263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj escaped characters than that function does, in particular because 7273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj '*' must be escaped to avoid the run-length encoding processing 7283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj in reading packets. */ 7293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7303b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 7313b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint remote_unescape_input (const gdb_byte *buffer, int len, 7323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdb_byte *out_buf, int out_maxlen) 7333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 7343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int input_index, output_index; 7353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int escaped; 7363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj output_index = 0; 7383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj escaped = 0; 7393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (input_index = 0; input_index < len; input_index++) { 7403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdb_byte b = buffer[input_index]; 7413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (output_index + 1 > out_maxlen) 7433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj error ("Received too much data (len %d) from the target.\n", len); 7443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (escaped) { 7463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj out_buf[output_index++] = b ^ 0x20; 7473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj escaped = 0; 7483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else if (b == '}') { 7493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj escaped = 1; 7503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 7513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj out_buf[output_index++] = b; 7523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 7533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 7543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (escaped) 7563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj error ("Unmatched escape character in target response.\n"); 7573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return output_index; 7593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 7603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Look for a sequence of characters which can be run-length encoded. 7623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj If there are any, update *CSUM and *P. Otherwise, output the 7633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj single character. Return the number of characters consumed. */ 7643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7653b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 7663b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint try_rle (char *buf, int remaining, unsigned char *csum, char **p) 7673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 7683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int n; 7693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Always output the character. */ 7713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *csum += buf[0]; 7723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *(*p)++ = buf[0]; 7733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Don't go past '~'. */ 7753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remaining > 97) 7763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remaining = 97; 7773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (n = 1; n < remaining; n++) 7793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (buf[n] != buf[0]) 7803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 7813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* N is the index of the first character not the same as buf[0]. 7833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[0] is counted twice, so by decrementing N, we get the number 7843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj of characters the RLE sequence will replace. */ 7853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj n--; 7863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (n < 3) 7883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 1; 7893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Skip the frame characters. The manual says to skip '+' and '-' 7913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj also, but there's no reason to. Unfortunately these two unusable 7923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj characters double the encoded length of a four byte zero 7933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj value. */ 7943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (n + 29 == '$' || n + 29 == '#') 7953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj n--; 7963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 7973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *csum += '*'; 7983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *(*p)++ = '*'; 7993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *csum += n + 29; 8003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *(*p)++ = n + 29; 8013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return n + 1; 8033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 8043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Send a packet to the remote machine, with error checking. 8063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj The data of the packet is in BUF, and the length of the 8073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj packet is in CNT. Returns >= 0 on success, -1 otherwise. */ 8083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8093b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint putpkt_binary (char *buf, int cnt) 8103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 8113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i; 8123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned char csum = 0; 8133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char *buf2; 8143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char *p; 8153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int cc; 8163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 81703ffc6ebe6ae367d1ace1398d9584cbd45a3d90cphilippe buf2 = malloc (PBUFSIZ+POVERHSIZ); 81803ffc6ebe6ae367d1ace1398d9584cbd45a3d90cphilippe // should malloc PBUFSIZ, but bypass GDB bug (see gdbserver_init in server.c) 81901a492ec43ea5da29b9db4b044014e96f52b441bphilippe vg_assert (5 == POVERHSIZ); 82001a492ec43ea5da29b9db4b044014e96f52b441bphilippe vg_assert (cnt <= PBUFSIZ); // be tolerant for GDB bug. 8213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Copy the packet into buffer BUF2, encapsulating it 8233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj and giving it a checksum. */ 8243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj p = buf2; 8263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *p++ = '$'; 8273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (i = 0; i < cnt;) 8293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj i += try_rle (buf + i, cnt - i, &csum, &p); 8303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *p++ = '#'; 8323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *p++ = tohex ((csum >> 4) & 0xf); 8333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *p++ = tohex (csum & 0xf); 8343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *p = '\0'; 8363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* we might have to write a pkt when out FIFO not yet/anymore opened */ 8383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!ensure_write_remote_desc()) { 8393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj warning ("putpkt(write) error: no write_remote_desc\n"); 840f2df33244d9295a6e0305cd5edddd97d18f88e2cphilippe free (buf2); 8413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 8423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 8433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Send it once (noack_mode) 8453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj or send it over and over until we get a positive ack. */ 8463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj do { 8483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (VG_(write) (write_remote_desc, buf2, p - buf2) != p - buf2) { 8493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj warning ("putpkt(write) error\n"); 850f2df33244d9295a6e0305cd5edddd97d18f88e2cphilippe free (buf2); 8513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 8523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 8533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8548568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe if (VG_(debugLog_getLevel)() >= 3) { 8558568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe char *tracebuf = malloc(4 * (p - buf2) + 1); // worst case 8568568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe char *tr = tracebuf; 8578568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe 8588568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe for (UInt npr = 0; npr < p - buf2; npr++) { 8598568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe UChar uc = (unsigned char)buf2[npr]; 8608568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe if (uc > 31 && uc < 127) { 8618568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe *tr++ = uc; 8628568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe } else { 8638568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe *tr++ = '\\'; 8648568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe VG_(sprintf)(tr, "%03o", uc); 8658568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe tr += 3; 8668568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe } 8678568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe } 8688568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe *tr++ = 0; 8698568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe dlog(3, "putpkt (\"%s\"); (%slen %d) %s\n", tracebuf, 8708568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe strlen(tracebuf) == p - buf2 ? "binary " : "", 871bc1b77cdc8a9cb1959a80edbd0b0e636801a27e5philippe (int)(p - buf2), 8728568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe noack_mode ? "[no ack]" : "[looking for ack]"); 8738568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe free (tracebuf); 8748568c99d33c6e0ad6738ebb39da9467a71b847ddphilippe } 8753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (noack_mode) 8773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 8783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj cc = readchar (1); 8803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (cc > 0) 88175d8a4e4e4c3c471f366683faa903aef0ce91405philippe dlog(3, "[received '%c' (0x%x)]\n", cc, cc); 8823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (cc <= 0) { 8843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (cc == 0) 8853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "putpkt(read): Got EOF\n"); 8863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 8873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj warning ("putpkt(read) error\n"); 8883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (buf2); 8903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 8913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 8923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Check for an input interrupt while we're here. */ 8943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (cc == '\003') 895349a39142e16d060936911c1792cc0a5d2fe63fephilippe dlog(1, "Received 0x03 character (SIGINT)\n"); 8963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 8973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (cc != '+'); 8983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 8993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj free (buf2); 9003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 1; /* Success! */ 9013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 9023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Send a packet to the remote machine, with error checking. The data 9043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj of the packet is in BUF, and the packet should be a NUL-terminated 9053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj string. Returns >= 0 on success, -1 otherwise. */ 9063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9073b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint putpkt (char *buf) 9083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 9093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return putpkt_binary (buf, strlen (buf)); 9103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 9113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9123b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid monitor_output (char *s) 9133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 91446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe if (remote_connected()) { 91546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe const int len = strlen(s); 91646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe char *buf = malloc(1 + 2*len + 1); 91746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 91846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe buf[0] = 'O'; 91946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe hexify(buf+1, s, len); 92046207652a0c99a2c8b0f05eafce3ca3ec533c121philippe if (putpkt (buf) < 0) { 92146207652a0c99a2c8b0f05eafce3ca3ec533c121philippe /* We probably have lost the connection with vgdb. */ 92246207652a0c99a2c8b0f05eafce3ca3ec533c121philippe reset_valgrind_sink("Error writing monitor output"); 92346207652a0c99a2c8b0f05eafce3ca3ec533c121philippe /* write again after reset */ 92446207652a0c99a2c8b0f05eafce3ca3ec533c121philippe VG_(printf) ("%s", s); 92546207652a0c99a2c8b0f05eafce3ca3ec533c121philippe } 92646207652a0c99a2c8b0f05eafce3ca3ec533c121philippe 92746207652a0c99a2c8b0f05eafce3ca3ec533c121philippe free (buf); 92846207652a0c99a2c8b0f05eafce3ca3ec533c121philippe } else { 92946207652a0c99a2c8b0f05eafce3ca3ec533c121philippe print_to_initial_valgrind_sink (s); 9303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 9313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 9323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Returns next char from remote GDB. -1 if error. */ 9343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* if single, only one character maximum can be read with 9353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj read system call. Otherwise, when reading an ack character 9363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj we might pile up the next gdb command in the static buf. 9373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj The read loop is then blocked in poll till gdb times out. */ 9383b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 9393b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint readchar (int single) 9403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 9413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj static unsigned char buf[PBUFSIZ]; 9423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj static int bufcnt = 0; 9433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj static unsigned char *bufp; 9444254584008012b975d47540812612f297ed68d0aphilippe SysRes ret; 9453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (bufcnt-- > 0) 9473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return *bufp++; 9483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remote_desc == INVALID_DESCRIPTOR) 9503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 9513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* No characters available in buf => 9533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj wait for some characters to arrive */ 9543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remote_desc_pollfdread_activity.revents = 0; 95502fbf7f71a2dbe9258b2d5dc530eaaa59b8890c9philippe ret = VG_(poll_no_eintr)(&remote_desc_pollfdread_activity, 1, -1); 9564254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret) || sr_Res(ret) != 1) { 9574254584008012b975d47540812612f297ed68d0aphilippe if (sr_isError(ret)) { 958853a1ce66afb2e5517bbac1dededea19a27b1534philippe sr_extended_perror(ret, "readchar: poll error\n"); 9594254584008012b975d47540812612f297ed68d0aphilippe } else { 9604254584008012b975d47540812612f297ed68d0aphilippe dlog(0, "readchar: poll got %d, expecting 1\n", (int)sr_Res(ret)); 9614254584008012b975d47540812612f297ed68d0aphilippe } 9624254584008012b975d47540812612f297ed68d0aphilippe return -1; 9633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 9643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (single) 9653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj bufcnt = VG_(read) (remote_desc, buf, 1); 9663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 9673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj bufcnt = VG_(read) (remote_desc, buf, sizeof (buf)); 9683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (bufcnt <= 0) { 9703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (bufcnt == 0) 9713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog (1, "readchar: Got EOF\n"); 9723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 9733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj warning ("readchar read error\n"); 9743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 9763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 9773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj shared->seen_by_valgrind += bufcnt; 9793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* If we have received a character and we do not yet have a 9813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj connection, we better open our "write" fifo to let vgdb open its 9823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj read fifo side */ 9833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (write_remote_desc == INVALID_DESCRIPTOR 9843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj && !ensure_write_remote_desc()) { 9853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "reachar: write_remote_desc could not be created"); 9863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 9873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj bufp = buf; 9893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj bufcnt--; 9903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (poll_cond(remote_desc_pollfdread_activity.revents)) { 9923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "readchar: POLLcond got %d\n", 9933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj remote_desc_pollfdread_activity.revents); 9943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj error_poll_cond(); 9953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 9963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 9973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return *bufp++; 9983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 9993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj/* Read a packet from the remote machine, with error checking, 10023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj and store it in BUF. Returns length of packet, or negative if error. */ 10033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10043b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint getpkt (char *buf) 10053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 10063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char *bp; 10073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned char csum, c1, c2; 10083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int c; 10093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (1) { 10113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj csum = 0; 10123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (1) { 10143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj c = readchar (0); 10153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (c == '$') 10163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 101775d8a4e4e4c3c471f366683faa903aef0ce91405philippe dlog(3, "[getpkt: discarding char '%c']\n", c); 10183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (c < 0) 10193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 10203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj bp = buf; 10233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (1) { 10243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj c = readchar (0); 10253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (c < 0) 10263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 10273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (c == '#') 10283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 10293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *bp++ = c; 10303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj csum += c; 10313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *bp = 0; 10333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj c1 = fromhex (readchar (0)); 10353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj c2 = fromhex (readchar (0)); 10363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (csum == (c1 << 4) + c2) 10383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 10393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog (0, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", 10413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (c1 << 4) + c2, csum, buf); 10423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!ensure_write_remote_desc()) { 10433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "getpkt(write nack) no write_remote_desc"); 10443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(write) (write_remote_desc, "-", 1); 10463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (noack_mode) 104975d8a4e4e4c3c471f366683faa903aef0ce91405philippe dlog(3, "getpkt (\"%s\"); [no ack] \n", buf); 10503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj else 105175d8a4e4e4c3c471f366683faa903aef0ce91405philippe dlog(3, "getpkt (\"%s\"); [sending ack] \n", buf); 10523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!noack_mode) { 10543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (!ensure_write_remote_desc()) { 10553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "getpkt(write ack) no write_remote_desc"); 10563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(write) (write_remote_desc, "+", 1); 105875d8a4e4e4c3c471f366683faa903aef0ce91405philippe dlog(3, "[sent ack]\n"); 10593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return bp - buf; 10623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 10633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10643b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid write_ok (char *buf) 10653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 10663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[0] = 'O'; 10673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[1] = 'K'; 10683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[2] = '\0'; 10693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 10703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10713b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid write_enn (char *buf) 10723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 10733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Some day, we should define the meanings of the error codes... */ 10743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[0] = 'E'; 10753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[1] = '0'; 10763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[2] = '1'; 10773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf[3] = '\0'; 10783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 10793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10803e7986312a0ffc7646b0552d4c4ea3744a870e73florianvoid convert_int_to_ascii (const unsigned char *from, char *to, int n) 10813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 10823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int nib; 10833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int ch; 10843b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (n--) { 10853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ch = *from++; 10863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib = ((ch & 0xf0) >> 4) & 0x0f; 10873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *to++ = tohex (nib); 10883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib = ch & 0x0f; 10893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *to++ = tohex (nib); 10903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 10913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *to++ = 0; 10923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 10933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 10953e7986312a0ffc7646b0552d4c4ea3744a870e73florianvoid convert_ascii_to_int (const char *from, unsigned char *to, int n) 10963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 10973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int nib1, nib2; 10983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (n--) { 10993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib1 = fromhex (*from++); 11003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib2 = fromhex (*from++); 11013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f); 11023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 11043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11053b290486cd4cd601b20e04340e593c9ed9717e5fsewardjstatic 11063b290486cd4cd601b20e04340e593c9ed9717e5fsewardjchar * outreg (int regno, char *buf) 11073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 11083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if ((regno >> 12) != 0) 11093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex ((regno >> 12) & 0xf); 11103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if ((regno >> 8) != 0) 11113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex ((regno >> 8) & 0xf); 11123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex ((regno >> 4) & 0xf); 11133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex (regno & 0xf); 11143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = ':'; 11153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj collect_register_as_string (regno, buf); 11163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf += 2 * register_size (regno); 11173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = ';'; 11183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return buf; 11203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 11213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11223b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid prepare_resume_reply (char *buf, char status, unsigned char sig) 11233b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 11243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int nib; 11253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = status; 11273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib = ((sig & 0xf0) >> 4); 11293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex (nib); 11303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj nib = sig & 0x0f; 11313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex (nib); 11323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (status == 'T') { 11343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj const char **regp = gdbserver_expedite_regs; 11353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1136349a39142e16d060936911c1792cc0a5d2fe63fephilippe if (valgrind_stopped_by_watchpoint()) { 11373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj CORE_ADDR addr; 11383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i; 11393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj strncpy (buf, "watch:", 6); 11413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf += 6; 11423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1143349a39142e16d060936911c1792cc0a5d2fe63fephilippe addr = valgrind_stopped_data_address (); 11443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* Convert each byte of the address into two hexadecimal chars. 11463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj Note that we take sizeof (void *) instead of sizeof (addr); 11473b290486cd4cd601b20e04340e593c9ed9717e5fsewardj this is to avoid sending a 64-bit address to a 32-bit GDB. */ 11483b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (i = sizeof (void *) * 2; i > 0; i--) { 11493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = tohex ((addr >> (i - 1) * 4) & 0xf); 11503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = ';'; 11523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while (*regp) { 11553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf = outreg (find_regno (*regp), buf); 11563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj regp ++; 11573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11583b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj { 11603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned int gdb_id_from_wait; 11613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* FIXME right place to set this? */ 11633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj thread_from_wait = 11643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ((struct inferior_list_entry *)current_inferior)->id; 11653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj gdb_id_from_wait = thread_to_gdb_id (current_inferior); 11663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj dlog(1, "Writing resume reply for %ld\n", thread_from_wait); 11683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* This if (1) ought to be unnecessary. But remote_wait in GDB 11693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj will claim this event belongs to inferior_ptid if we do not 11703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj specify a thread, and there's no way for gdbserver to know 11713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj what inferior_ptid is. */ 11723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (1 || old_thread_from_wait != thread_from_wait) { 11733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj general_thread = thread_from_wait; 11743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj VG_(sprintf) (buf, "thread:%x;", gdb_id_from_wait); 11753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj buf += strlen (buf); 11763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj old_thread_from_wait = thread_from_wait; 11773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj /* For W and X, we're done. */ 11813b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *buf++ = 0; 11823b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 11833b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11843b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid decode_m_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr) 11853b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 11863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i = 0, j = 0; 11873b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char ch; 11883b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *len_ptr = 0; 11893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while ((ch = from[i++]) != ',') { 11913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *mem_addr_ptr << 4; 11923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr |= fromhex (ch) & 0x0f; 11933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 11943b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 11953b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for (j = 0; j < 4; j++) { 11963b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if ((ch = from[i++]) == 0) 11973b290486cd4cd601b20e04340e593c9ed9717e5fsewardj break; 11983b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr = *len_ptr << 4; 11993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr |= fromhex (ch) & 0x0f; 12003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 12013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 12023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12033b290486cd4cd601b20e04340e593c9ed9717e5fsewardjvoid decode_M_packet (char *from, CORE_ADDR *mem_addr_ptr, unsigned int *len_ptr, 12043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned char *to) 12053b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 12063b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i = 0; 12073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char ch; 12083b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *len_ptr = 0; 12093b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12103b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while ((ch = from[i++]) != ',') { 12113b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *mem_addr_ptr << 4; 12123b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr |= fromhex (ch) & 0x0f; 12133b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 12143b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12153b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while ((ch = from[i++]) != ':') { 12163b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr = *len_ptr << 4; 12173b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr |= fromhex (ch) & 0x0f; 12183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 12193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12203b290486cd4cd601b20e04340e593c9ed9717e5fsewardj convert_ascii_to_int (&from[i++], to, *len_ptr); 12213b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 12223b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12233b290486cd4cd601b20e04340e593c9ed9717e5fsewardjint decode_X_packet (char *from, int packet_len, CORE_ADDR *mem_addr_ptr, 12243b290486cd4cd601b20e04340e593c9ed9717e5fsewardj unsigned int *len_ptr, unsigned char *to) 12253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj{ 12263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj int i = 0; 12273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj char ch; 12283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *len_ptr = 0; 12293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while ((ch = from[i++]) != ',') { 12313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr = *mem_addr_ptr << 4; 12323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *mem_addr_ptr |= fromhex (ch) & 0x0f; 12333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 12343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj while ((ch = from[i++]) != ':') { 12363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr = *len_ptr << 4; 12373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj *len_ptr |= fromhex (ch) & 0x0f; 12383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 12393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (remote_unescape_input ((const gdb_byte *) &from[i], packet_len - i, 12413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj to, *len_ptr) != *len_ptr) 12423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return -1; 12433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 12443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj return 0; 12453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj} 12463b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 1247b985e2de52983cafd2d17cc6c9e60064847777fdflorian 1248cffe2a55d903655761ccc6025a23b823bee10170philippe/* Return the default path prefix for the named pipes (FIFOs) used by vgdb/gdb 1249b985e2de52983cafd2d17cc6c9e60064847777fdflorian to communicate with valgrind */ 1250b985e2de52983cafd2d17cc6c9e60064847777fdflorianHChar * 1251b985e2de52983cafd2d17cc6c9e60064847777fdflorianVG_(vgdb_prefix_default)(void) 1252b985e2de52983cafd2d17cc6c9e60064847777fdflorian{ 1253ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe static HChar *prefix; 1254b985e2de52983cafd2d17cc6c9e60064847777fdflorian 1255ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe if (prefix == NULL) { 1256ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe const HChar *tmpdir = VG_(tmpdir)(); 1257ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe prefix = malloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1); 1258ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe strcpy(prefix, tmpdir); 1259ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe strcat(prefix, "/vgdb-pipe"); 1260ae52a9398788dfa1b4d51b03013e8665268ad6dfphilippe } 1261b985e2de52983cafd2d17cc6c9e60064847777fdflorian return prefix; 1262b985e2de52983cafd2d17cc6c9e60064847777fdflorian} 1263