GDB (xrefs)
agent.c
Go to the documentation of this file.
1 /* Shared utility routines for GDB to interact with agent.
2 
3  Copyright (C) 2009-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "common-defs.h"
21 #include "target/target.h"
22 #include "common/symbol.h"
23 #include <unistd.h>
24 #include "agent.h"
25 #include "filestuff.h"
26 
27 int debug_agent = 0;
28 
29 /* A stdarg wrapper for debug_vprintf. */
30 
31 static void ATTRIBUTE_PRINTF (1, 2)
32 debug_agent_printf (const char *fmt, ...)
33 {
34  va_list ap;
35 
36  if (!debug_agent)
37  return;
38  va_start (ap, fmt);
39  debug_vprintf (fmt, ap);
40  va_end (ap);
41 }
42 
43 #define DEBUG_AGENT debug_agent_printf
44 
45 /* Global flag to determine using agent or not. */
46 int use_agent = 0;
47 
48 /* Addresses of in-process agent's symbols both GDB and GDBserver cares
49  about. */
50 
52 {
56 };
57 
58 /* Cache of the helper thread id. FIXME: this global should be made
59  per-process. */
60 static uint32_t helper_thread_id = 0;
61 
62 static struct
63 {
64  const char *name;
65  int offset;
66  int required;
67 } symbol_list[] = {
69  IPA_SYM(cmd_buf),
70  IPA_SYM(capability),
71 };
72 
74 
76 
77 int
79 {
81 }
82 
83 /* Look up all symbols needed by agent. Return 0 if all the symbols are
84  found, return non-zero otherwise. */
85 
86 int
88 {
89  int i;
90 
92 
93  for (i = 0; i < sizeof (symbol_list) / sizeof (symbol_list[0]); i++)
94  {
95  CORE_ADDR *addrp =
96  (CORE_ADDR *) ((char *) &ipa_sym_addrs + symbol_list[i].offset);
97 
99  arg) != 0)
100  {
101  DEBUG_AGENT ("symbol `%s' not found\n", symbol_list[i].name);
102  return -1;
103  }
104  }
105 
107  return 0;
108 }
109 
110 static unsigned int
112 {
113  if (helper_thread_id == 0)
114  {
117  warning (_("Error reading helper thread's id in lib"));
118  }
119 
120  return helper_thread_id;
121 }
122 
123 #ifdef HAVE_SYS_UN_H
124 #include <sys/socket.h>
125 #include <sys/un.h>
126 #define SOCK_DIR P_tmpdir
127 
128 #ifndef UNIX_PATH_MAX
129 #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
130 #endif
131 
132 #endif
133 
134 /* Connects to synchronization socket. PID is the pid of inferior, which is
135  used to set up the connection socket. */
136 
137 static int
139 {
140 #ifdef HAVE_SYS_UN_H
141  struct sockaddr_un addr;
142  int res, fd;
143  char path[UNIX_PATH_MAX];
144 
145  res = xsnprintf (path, UNIX_PATH_MAX, "%s/gdb_ust%d", P_tmpdir, pid);
146  if (res >= UNIX_PATH_MAX)
147  return -1;
148 
149  res = fd = gdb_socket_cloexec (PF_UNIX, SOCK_STREAM, 0);
150  if (res == -1)
151  {
152  warning (_("error opening sync socket: %s"), strerror (errno));
153  return -1;
154  }
155 
156  addr.sun_family = AF_UNIX;
157 
158  res = xsnprintf (addr.sun_path, UNIX_PATH_MAX, "%s", path);
159  if (res >= UNIX_PATH_MAX)
160  {
161  warning (_("string overflow allocating socket name"));
162  close (fd);
163  return -1;
164  }
165 
166  res = connect (fd, (struct sockaddr *) &addr, sizeof (addr));
167  if (res == -1)
168  {
169  warning (_("error connecting sync socket (%s): %s. "
170  "Make sure the directory exists and that it is writable."),
171  path, strerror (errno));
172  close (fd);
173  return -1;
174  }
175 
176  return fd;
177 #else
178  return -1;
179 #endif
180 }
181 
182 /* Execute an agent command in the inferior. PID is the value of pid of the
183  inferior. CMD is the buffer for command. GDB or GDBserver will store the
184  command into it and fetch the return result from CMD. The interaction
185  between GDB/GDBserver and the agent is synchronized by a synchronization
186  socket. Return zero if success, otherwise return non-zero. */
187 
188 int
189 agent_run_command (int pid, const char *cmd, int len)
190 {
191  int fd;
192  int tid = agent_get_helper_thread_id ();
193  ptid_t ptid = ptid_build (pid, tid, 0);
194 
196  (gdb_byte *) cmd, len);
197 
198  if (ret != 0)
199  {
200  warning (_("unable to write"));
201  return -1;
202  }
203 
204  DEBUG_AGENT ("agent: resumed helper thread\n");
205 
206  /* Resume helper thread. */
208 
209  fd = gdb_connect_sync_socket (pid);
210  if (fd >= 0)
211  {
212  char buf[1] = "";
213  int ret;
214 
215  DEBUG_AGENT ("agent: signalling helper thread\n");
216 
217  do
218  {
219  ret = write (fd, buf, 1);
220  } while (ret == -1 && errno == EINTR);
221 
222  DEBUG_AGENT ("agent: waiting for helper thread's response\n");
223 
224  do
225  {
226  ret = read (fd, buf, 1);
227  } while (ret == -1 && errno == EINTR);
228 
229  close (fd);
230 
231  DEBUG_AGENT ("agent: helper thread's response received\n");
232  }
233  else
234  return -1;
235 
236  /* Need to read response with the inferior stopped. */
237  if (!ptid_equal (ptid, null_ptid))
238  {
239  /* Stop thread PTID. */
240  DEBUG_AGENT ("agent: stop helper thread\n");
241  target_stop_and_wait (ptid);
242  }
243 
244  if (fd >= 0)
245  {
248  {
249  warning (_("Error reading command response"));
250  return -1;
251  }
252  }
253 
254  return 0;
255 }
256 
257 /* Each bit of it stands for a capability of agent. */
258 static uint32_t agent_capability = 0;
259 
260 /* Return true if agent has capability AGENT_CAP, otherwise return false. */
261 
262 int
264 {
265  if (agent_capability == 0)
266  {
269  warning (_("Error reading capability of agent"));
270  }
271  return agent_capability & agent_capa;
272 }
273 
274 /* Invalidate the cache of agent capability, so we'll read it from inferior
275  again. Call it when launches a new program or reconnect to remote stub. */
276 
277 void
279 {
280  agent_capability = 0;
281 }
#define IPA_CMD_BUF_SIZE
Definition: agent.h:35
ssize_t read(int fd, void *buf, size_t count)
Definition: expect-read1.c:26
static struct @39 symbol_list[]
static unsigned int agent_get_helper_thread_id(void)
Definition: agent.c:111
int find_minimal_symbol_address(const char *name, CORE_ADDR *addr, struct objfile *objfile)
Definition: minsyms.c:343
int ptid_equal(ptid_t ptid1, ptid_t ptid2)
Definition: ptid.c:76
bfd_vma CORE_ADDR
Definition: common-types.h:41
int target_write_memory(CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len)
Definition: target.c:1474
int debug_agent
Definition: agent.c:27
void warning(const char *fmt,...)
Definition: errors.c:26
struct type ** const(pascal_builtin_types[])
const char * name
Definition: agent.c:64
#define DEBUG_AGENT
Definition: agent.c:43
#define _(String)
Definition: gdb_locale.h:40
agent_capa
Definition: agent.h:48
int gdb_socket_cloexec(int domain, int style, int protocol)
Definition: filestuff.c:367
int required
Definition: agent.c:66
Definition: ptid.h:35
ptid_t ptid_build(int pid, long lwp, long tid)
Definition: ptid.c:31
#define IPA_SYM(SYM)
Definition: agent.h:27
#define UNIX_PATH_MAX
Definition: agent.c:129
int use_agent
Definition: agent.c:46
static int all_agent_symbols_looked_up
Definition: agent.c:75
int target_read_uint32(CORE_ADDR memaddr, uint32_t *result)
Definition: target.c:1408
int agent_run_command(int pid, const char *cmd, int len)
Definition: agent.c:189
void target_stop_and_wait(ptid_t ptid)
Definition: target.c:3311
void agent_capability_invalidate(void)
Definition: agent.c:278
static int gdb_connect_sync_socket(int pid)
Definition: agent.c:138
void void debug_vprintf(const char *format, va_list ap) ATTRIBUTE_PRINTF(1
bfd_byte gdb_byte
Definition: common-types.h:38
CORE_ADDR addr_cmd_buf
Definition: agent.c:54
ptid_t null_ptid
Definition: ptid.c:25
int xsnprintf(char *str, size_t size, const char *format,...)
Definition: common-utils.c:134
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1393
static struct ipa_sym_addresses ipa_sym_addrs
Definition: agent.c:73
int offset
Definition: agent.c:65
int agent_capability_check(enum agent_capa agent_capa)
Definition: agent.c:263
int agent_loaded_p(void)
Definition: agent.c:78
CORE_ADDR addr_capability
Definition: agent.c:55
static void ATTRIBUTE_PRINTF(1, 2)
Definition: agent.c:31
static uint32_t agent_capability
Definition: agent.c:258
CORE_ADDR addr_helper_thread_id
Definition: agent.c:53
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t int int rusage_t pid_t pid
Definition: gnu-nat.c:1818
void target_continue_no_signal(ptid_t ptid)
Definition: target.c:3328
int agent_look_up_symbols(void *arg)
Definition: agent.c:87
const ULONGEST const LONGEST len
Definition: target.h:309
static uint32_t helper_thread_id
Definition: agent.c:60