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