GDB (xrefs)
/tmp/gdb-8.1/gdb/fbsd-nat.c
Go to the documentation of this file.
1 /* Native-dependent code for FreeBSD.
2 
3  Copyright (C) 2002-2018 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 "defs.h"
21 #include "byte-vector.h"
22 #include "gdbcore.h"
23 #include "inferior.h"
24 #include "regcache.h"
25 #include "regset.h"
26 #include "gdbcmd.h"
27 #include "gdbthread.h"
28 #include "gdb_wait.h"
29 #include <sys/types.h>
30 #include <sys/procfs.h>
31 #include <sys/ptrace.h>
32 #include <sys/signal.h>
33 #include <sys/sysctl.h>
34 #include <sys/user.h>
35 #ifdef HAVE_KINFO_GETVMMAP
36 #include <libutil.h>
37 #else
38 #include "filestuff.h"
39 #endif
40 
41 #include "elf-bfd.h"
42 #include "fbsd-nat.h"
43 
44 #include <list>
45 
46 /* Return the name of a file that can be opened to get the symbols for
47  the child process identified by PID. */
48 
49 static char *
51 {
52  ssize_t len;
53  static char buf[PATH_MAX];
54  char name[PATH_MAX];
55 
56 #ifdef KERN_PROC_PATHNAME
57  size_t buflen;
58  int mib[4];
59 
60  mib[0] = CTL_KERN;
61  mib[1] = KERN_PROC;
62  mib[2] = KERN_PROC_PATHNAME;
63  mib[3] = pid;
64  buflen = sizeof buf;
65  if (sysctl (mib, 4, buf, &buflen, NULL, 0) == 0)
66  return buf;
67 #endif
68 
69  xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
70  len = readlink (name, buf, PATH_MAX - 1);
71  if (len != -1)
72  {
73  buf[len] = '\0';
74  return buf;
75  }
76 
77  return NULL;
78 }
79 
80 #ifdef HAVE_KINFO_GETVMMAP
81 /* Deleter for std::unique_ptr that invokes free. */
82 
83 template <typename T>
84 struct free_deleter
85 {
86  void operator() (T *ptr) const { free (ptr); }
87 };
88 
89 /* Iterate over all the memory regions in the current inferior,
90  calling FUNC for each memory region. OBFD is passed as the last
91  argument to FUNC. */
92 
93 static int
95  find_memory_region_ftype func, void *obfd)
96 {
97  pid_t pid = ptid_get_pid (inferior_ptid);
98  struct kinfo_vmentry *kve;
99  uint64_t size;
100  int i, nitems;
101 
102  std::unique_ptr<struct kinfo_vmentry, free_deleter<struct kinfo_vmentry>>
103  vmentl (kinfo_getvmmap (pid, &nitems));
104  if (vmentl == NULL)
105  perror_with_name (_("Couldn't fetch VM map entries."));
106 
107  for (i = 0, kve = vmentl.get (); i < nitems; i++, kve++)
108  {
109  /* Skip unreadable segments and those where MAP_NOCORE has been set. */
110  if (!(kve->kve_protection & KVME_PROT_READ)
111  || kve->kve_flags & KVME_FLAG_NOCOREDUMP)
112  continue;
113 
114  /* Skip segments with an invalid type. */
115  if (kve->kve_type != KVME_TYPE_DEFAULT
116  && kve->kve_type != KVME_TYPE_VNODE
117  && kve->kve_type != KVME_TYPE_SWAP
118  && kve->kve_type != KVME_TYPE_PHYS)
119  continue;
120 
121  size = kve->kve_end - kve->kve_start;
122  if (info_verbose)
123  {
125  "Save segment, %ld bytes at %s (%c%c%c)\n",
126  (long) size,
127  paddress (target_gdbarch (), kve->kve_start),
128  kve->kve_protection & KVME_PROT_READ ? 'r' : '-',
129  kve->kve_protection & KVME_PROT_WRITE ? 'w' : '-',
130  kve->kve_protection & KVME_PROT_EXEC ? 'x' : '-');
131  }
132 
133  /* Invoke the callback function to create the corefile segment.
134  Pass MODIFIED as true, we do not know the real modification state. */
135  func (kve->kve_start, size, kve->kve_protection & KVME_PROT_READ,
136  kve->kve_protection & KVME_PROT_WRITE,
137  kve->kve_protection & KVME_PROT_EXEC, 1, obfd);
138  }
139  return 0;
140 }
141 #else
142 static int
143 fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
144  char *protection)
145 {
146  /* FreeBSD 5.1-RELEASE uses a 256-byte buffer. */
147  char buf[256];
148  int resident, privateresident;
149  unsigned long obj;
150  int ret = EOF;
151 
152  /* As of FreeBSD 5.0-RELEASE, the layout is described in
153  /usr/src/sys/fs/procfs/procfs_map.c. Somewhere in 5.1-CURRENT a
154  new column was added to the procfs map. Therefore we can't use
155  fscanf since we need to support older releases too. */
156  if (fgets (buf, sizeof buf, mapfile) != NULL)
157  ret = sscanf (buf, "%lx %lx %d %d %lx %s", start, end,
158  &resident, &privateresident, &obj, protection);
159 
160  return (ret != 0 && ret != EOF);
161 }
162 
163 /* Iterate over all the memory regions in the current inferior,
164  calling FUNC for each memory region. OBFD is passed as the last
165  argument to FUNC. */
166 
167 static int
169  find_memory_region_ftype func, void *obfd)
170 {
171  pid_t pid = ptid_get_pid (inferior_ptid);
172  unsigned long start, end, size;
173  char protection[4];
174  int read, write, exec;
175 
176  std::string mapfilename = string_printf ("/proc/%ld/map", (long) pid);
177  gdb_file_up mapfile (fopen (mapfilename.c_str (), "r"));
178  if (mapfile == NULL)
179  error (_("Couldn't open %s."), mapfilename.c_str ());
180 
181  if (info_verbose)
183  "Reading memory regions from %s\n", mapfilename.c_str ());
184 
185  /* Now iterate until end-of-file. */
186  while (fbsd_read_mapping (mapfile.get (), &start, &end, &protection[0]))
187  {
188  size = end - start;
189 
190  read = (strchr (protection, 'r') != 0);
191  write = (strchr (protection, 'w') != 0);
192  exec = (strchr (protection, 'x') != 0);
193 
194  if (info_verbose)
195  {
197  "Save segment, %ld bytes at %s (%c%c%c)\n",
198  size, paddress (target_gdbarch (), start),
199  read ? 'r' : '-',
200  write ? 'w' : '-',
201  exec ? 'x' : '-');
202  }
203 
204  /* Invoke the callback function to create the corefile segment.
205  Pass MODIFIED as true, we do not know the real modification state. */
206  func (start, size, read, write, exec, 1, obfd);
207  }
208 
209  return 0;
210 }
211 #endif
212 
213 #ifdef KERN_PROC_AUXV
214 static enum target_xfer_status (*super_xfer_partial) (struct target_ops *ops,
215  enum target_object object,
216  const char *annex,
217  gdb_byte *readbuf,
218  const gdb_byte *writebuf,
220  ULONGEST len,
221  ULONGEST *xfered_len);
222 
223 #ifdef PT_LWPINFO
224 /* Return the size of siginfo for the current inferior. */
225 
226 #ifdef __LP64__
227 union sigval32 {
228  int sival_int;
229  uint32_t sival_ptr;
230 };
231 
232 /* This structure matches the naming and layout of `siginfo_t' in
233  <sys/signal.h>. In particular, the `si_foo' macros defined in that
234  header can be used with both types to copy fields in the `_reason'
235  union. */
236 
237 struct siginfo32
238 {
239  int si_signo;
240  int si_errno;
241  int si_code;
242  __pid_t si_pid;
243  __uid_t si_uid;
244  int si_status;
245  uint32_t si_addr;
246  union sigval32 si_value;
247  union
248  {
249  struct
250  {
251  int _trapno;
252  } _fault;
253  struct
254  {
255  int _timerid;
256  int _overrun;
257  } _timer;
258  struct
259  {
260  int _mqd;
261  } _mesgq;
262  struct
263  {
264  int32_t _band;
265  } _poll;
266  struct
267  {
268  int32_t __spare1__;
269  int __spare2__[7];
270  } __spare__;
271  } _reason;
272 };
273 #endif
274 
275 static size_t
276 fbsd_siginfo_size ()
277 {
278 #ifdef __LP64__
280 
281  /* Is the inferior 32-bit? If so, use the 32-bit siginfo size. */
282  if (gdbarch_long_bit (gdbarch) == 32)
283  return sizeof (struct siginfo32);
284 #endif
285  return sizeof (siginfo_t);
286 }
287 
288 /* Convert a native 64-bit siginfo object to a 32-bit object. Note
289  that FreeBSD doesn't support writing to $_siginfo, so this only
290  needs to convert one way. */
291 
292 static void
293 fbsd_convert_siginfo (siginfo_t *si)
294 {
295 #ifdef __LP64__
297 
298  /* Is the inferior 32-bit? If not, nothing to do. */
299  if (gdbarch_long_bit (gdbarch) != 32)
300  return;
301 
302  struct siginfo32 si32;
303 
304  si32.si_signo = si->si_signo;
305  si32.si_errno = si->si_errno;
306  si32.si_code = si->si_code;
307  si32.si_pid = si->si_pid;
308  si32.si_uid = si->si_uid;
309  si32.si_status = si->si_status;
310  si32.si_addr = (uintptr_t) si->si_addr;
311 
312  /* If sival_ptr is being used instead of sival_int on a big-endian
313  platform, then sival_int will be zero since it holds the upper
314  32-bits of the pointer value. */
315 #if _BYTE_ORDER == _BIG_ENDIAN
316  if (si->si_value.sival_int == 0)
317  si32.si_value.sival_ptr = (uintptr_t) si->si_value.sival_ptr;
318  else
319  si32.si_value.sival_int = si->si_value.sival_int;
320 #else
321  si32.si_value.sival_int = si->si_value.sival_int;
322 #endif
323 
324  /* Always copy the spare fields and then possibly overwrite them for
325  signal-specific or code-specific fields. */
326  si32._reason.__spare__.__spare1__ = si->_reason.__spare__.__spare1__;
327  for (int i = 0; i < 7; i++)
328  si32._reason.__spare__.__spare2__[i] = si->_reason.__spare__.__spare2__[i];
329  switch (si->si_signo) {
330  case SIGILL:
331  case SIGFPE:
332  case SIGSEGV:
333  case SIGBUS:
334  si32.si_trapno = si->si_trapno;
335  break;
336  }
337  switch (si->si_code) {
338  case SI_TIMER:
339  si32.si_timerid = si->si_timerid;
340  si32.si_overrun = si->si_overrun;
341  break;
342  case SI_MESGQ:
343  si32.si_mqd = si->si_mqd;
344  break;
345  }
346 
347  memcpy(si, &si32, sizeof (si32));
348 #endif
349 }
350 #endif
351 
352 /* Implement the "to_xfer_partial target_ops" method. */
353 
354 static enum target_xfer_status
355 fbsd_xfer_partial (struct target_ops *ops, enum target_object object,
356  const char *annex, gdb_byte *readbuf,
357  const gdb_byte *writebuf,
358  ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
359 {
360  pid_t pid = ptid_get_pid (inferior_ptid);
361 
362  switch (object)
363  {
364 #ifdef PT_LWPINFO
366  {
367  struct ptrace_lwpinfo pl;
368  size_t siginfo_size;
369 
370  /* FreeBSD doesn't support writing to $_siginfo. */
371  if (writebuf != NULL)
372  return TARGET_XFER_E_IO;
373 
374  if (inferior_ptid.lwp_p ())
375  pid = inferior_ptid.lwp ();
376 
377  siginfo_size = fbsd_siginfo_size ();
378  if (offset > siginfo_size)
379  return TARGET_XFER_E_IO;
380 
381  if (ptrace (PT_LWPINFO, pid, (PTRACE_TYPE_ARG3) &pl, sizeof (pl)) == -1)
382  return TARGET_XFER_E_IO;
383 
384  if (!(pl.pl_flags & PL_FLAG_SI))
385  return TARGET_XFER_E_IO;
386 
387  fbsd_convert_siginfo (&pl.pl_siginfo);
388  if (offset + len > siginfo_size)
389  len = siginfo_size - offset;
390 
391  memcpy (readbuf, ((gdb_byte *) &pl.pl_siginfo) + offset, len);
392  *xfered_len = len;
393  return TARGET_XFER_OK;
394  }
395 #endif
396  case TARGET_OBJECT_AUXV:
397  {
398  gdb::byte_vector buf_storage;
399  gdb_byte *buf;
400  size_t buflen;
401  int mib[4];
402 
403  if (writebuf != NULL)
404  return TARGET_XFER_E_IO;
405  mib[0] = CTL_KERN;
406  mib[1] = KERN_PROC;
407  mib[2] = KERN_PROC_AUXV;
408  mib[3] = pid;
409  if (offset == 0)
410  {
411  buf = readbuf;
412  buflen = len;
413  }
414  else
415  {
416  buflen = offset + len;
417  buf_storage.resize (buflen);
418  buf = buf_storage.data ();
419  }
420  if (sysctl (mib, 4, buf, &buflen, NULL, 0) == 0)
421  {
422  if (offset != 0)
423  {
424  if (buflen > offset)
425  {
426  buflen -= offset;
427  memcpy (readbuf, buf + offset, buflen);
428  }
429  else
430  buflen = 0;
431  }
432  *xfered_len = buflen;
433  return (buflen == 0) ? TARGET_XFER_EOF : TARGET_XFER_OK;
434  }
435  return TARGET_XFER_E_IO;
436  }
437  default:
438  return super_xfer_partial (ops, object, annex, readbuf, writebuf, offset,
439  len, xfered_len);
440  }
441 }
442 #endif
443 
444 #ifdef PT_LWPINFO
445 static int debug_fbsd_lwp;
446 
447 static void (*super_resume) (struct target_ops *,
448  ptid_t,
449  int,
450  enum gdb_signal);
451 static ptid_t (*super_wait) (struct target_ops *,
452  ptid_t,
453  struct target_waitstatus *,
454  int);
455 
456 static void
457 show_fbsd_lwp_debug (struct ui_file *file, int from_tty,
458  struct cmd_list_element *c, const char *value)
459 {
460  fprintf_filtered (file, _("Debugging of FreeBSD lwp module is %s.\n"), value);
461 }
462 
463 #if defined(TDP_RFPPWAIT) || defined(HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME)
464 /* Fetch the external variant of the kernel's internal process
465  structure for the process PID into KP. */
466 
467 static void
468 fbsd_fetch_kinfo_proc (pid_t pid, struct kinfo_proc *kp)
469 {
470  size_t len;
471  int mib[4];
472 
473  len = sizeof *kp;
474  mib[0] = CTL_KERN;
475  mib[1] = KERN_PROC;
476  mib[2] = KERN_PROC_PID;
477  mib[3] = pid;
478  if (sysctl (mib, 4, kp, &len, NULL, 0) == -1)
479  perror_with_name (("sysctl"));
480 }
481 #endif
482 
483 /*
484  FreeBSD's first thread support was via a "reentrant" version of libc
485  (libc_r) that first shipped in 2.2.7. This library multiplexed all
486  of the threads in a process onto a single kernel thread. This
487  library was supported via the bsd-uthread target.
488 
489  FreeBSD 5.1 introduced two new threading libraries that made use of
490  multiple kernel threads. The first (libkse) scheduled M user
491  threads onto N (<= M) kernel threads (LWPs). The second (libthr)
492  bound each user thread to a dedicated kernel thread. libkse shipped
493  as the default threading library (libpthread).
494 
495  FreeBSD 5.3 added a libthread_db to abstract the interface across
496  the various thread libraries (libc_r, libkse, and libthr).
497 
498  FreeBSD 7.0 switched the default threading library from from libkse
499  to libpthread and removed libc_r.
500 
501  FreeBSD 8.0 removed libkse and the in-kernel support for it. The
502  only threading library supported by 8.0 and later is libthr which
503  ties each user thread directly to an LWP. To simplify the
504  implementation, this target only supports LWP-backed threads using
505  ptrace directly rather than libthread_db.
506 
507  FreeBSD 11.0 introduced LWP event reporting via PT_LWP_EVENTS.
508 */
509 
510 /* Return true if PTID is still active in the inferior. */
511 
512 static int
513 fbsd_thread_alive (struct target_ops *ops, ptid_t ptid)
514 {
515  if (ptid_lwp_p (ptid))
516  {
517  struct ptrace_lwpinfo pl;
518 
519  if (ptrace (PT_LWPINFO, ptid_get_lwp (ptid), (caddr_t) &pl, sizeof pl)
520  == -1)
521  return 0;
522 #ifdef PL_FLAG_EXITED
523  if (pl.pl_flags & PL_FLAG_EXITED)
524  return 0;
525 #endif
526  }
527 
528  return 1;
529 }
530 
531 /* Convert PTID to a string. Returns the string in a static
532  buffer. */
533 
534 static const char *
535 fbsd_pid_to_str (struct target_ops *ops, ptid_t ptid)
536 {
537  lwpid_t lwp;
538 
539  lwp = ptid_get_lwp (ptid);
540  if (lwp != 0)
541  {
542  static char buf[64];
543  int pid = ptid_get_pid (ptid);
544 
545  xsnprintf (buf, sizeof buf, "LWP %d of process %d", lwp, pid);
546  return buf;
547  }
548 
549  return normal_pid_to_str (ptid);
550 }
551 
552 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME
553 /* Return the name assigned to a thread by an application. Returns
554  the string in a static buffer. */
555 
556 static const char *
557 fbsd_thread_name (struct target_ops *self, struct thread_info *thr)
558 {
559  struct ptrace_lwpinfo pl;
560  struct kinfo_proc kp;
561  int pid = ptid_get_pid (thr->ptid);
562  long lwp = ptid_get_lwp (thr->ptid);
563  static char buf[sizeof pl.pl_tdname + 1];
564 
565  /* Note that ptrace_lwpinfo returns the process command in pl_tdname
566  if a name has not been set explicitly. Return a NULL name in
567  that case. */
568  fbsd_fetch_kinfo_proc (pid, &kp);
569  if (ptrace (PT_LWPINFO, lwp, (caddr_t) &pl, sizeof pl) == -1)
570  perror_with_name (("ptrace"));
571  if (strcmp (kp.ki_comm, pl.pl_tdname) == 0)
572  return NULL;
573  xsnprintf (buf, sizeof buf, "%s", pl.pl_tdname);
574  return buf;
575 }
576 #endif
577 
578 /* Enable additional event reporting on new processes.
579 
580  To catch fork events, PTRACE_FORK is set on every traced process
581  to enable stops on returns from fork or vfork. Note that both the
582  parent and child will always stop, even if system call stops are
583  not enabled.
584 
585  To catch LWP events, PTRACE_EVENTS is set on every traced process.
586  This enables stops on the birth for new LWPs (excluding the "main" LWP)
587  and the death of LWPs (excluding the last LWP in a process). Note
588  that unlike fork events, the LWP that creates a new LWP does not
589  report an event. */
590 
591 static void
592 fbsd_enable_proc_events (pid_t pid)
593 {
594 #ifdef PT_GET_EVENT_MASK
595  int events;
596 
597  if (ptrace (PT_GET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
598  sizeof (events)) == -1)
599  perror_with_name (("ptrace"));
600  events |= PTRACE_FORK | PTRACE_LWP;
601 #ifdef PTRACE_VFORK
602  events |= PTRACE_VFORK;
603 #endif
604  if (ptrace (PT_SET_EVENT_MASK, pid, (PTRACE_TYPE_ARG3)&events,
605  sizeof (events)) == -1)
606  perror_with_name (("ptrace"));
607 #else
608 #ifdef TDP_RFPPWAIT
609  if (ptrace (PT_FOLLOW_FORK, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
610  perror_with_name (("ptrace"));
611 #endif
612 #ifdef PT_LWP_EVENTS
613  if (ptrace (PT_LWP_EVENTS, pid, (PTRACE_TYPE_ARG3)0, 1) == -1)
614  perror_with_name (("ptrace"));
615 #endif
616 #endif
617 }
618 
619 /* Add threads for any new LWPs in a process.
620 
621  When LWP events are used, this function is only used to detect existing
622  threads when attaching to a process. On older systems, this function is
623  called to discover new threads each time the thread list is updated. */
624 
625 static void
626 fbsd_add_threads (pid_t pid)
627 {
628  int i, nlwps;
629 
631  nlwps = ptrace (PT_GETNUMLWPS, pid, NULL, 0);
632  if (nlwps == -1)
633  perror_with_name (("ptrace"));
634 
636 
637  nlwps = ptrace (PT_GETLWPLIST, pid, (caddr_t) lwps.get (), nlwps);
638  if (nlwps == -1)
639  perror_with_name (("ptrace"));
640 
641  for (i = 0; i < nlwps; i++)
642  {
643  ptid_t ptid = ptid_build (pid, lwps[i], 0);
644 
645  if (!in_thread_list (ptid))
646  {
647 #ifdef PT_LWP_EVENTS
648  struct ptrace_lwpinfo pl;
649 
650  /* Don't add exited threads. Note that this is only called
651  when attaching to a multi-threaded process. */
652  if (ptrace (PT_LWPINFO, lwps[i], (caddr_t) &pl, sizeof pl) == -1)
653  perror_with_name (("ptrace"));
654  if (pl.pl_flags & PL_FLAG_EXITED)
655  continue;
656 #endif
657  if (debug_fbsd_lwp)
659  "FLWP: adding thread for LWP %u\n",
660  lwps[i]);
661  add_thread (ptid);
662  }
663  }
664 }
665 
666 /* Implement the "to_update_thread_list" target_ops method. */
667 
668 static void
669 fbsd_update_thread_list (struct target_ops *ops)
670 {
671 #ifdef PT_LWP_EVENTS
672  /* With support for thread events, threads are added/deleted from the
673  list as events are reported, so just try deleting exited threads. */
675 #else
676  prune_threads ();
677 
678  fbsd_add_threads (ptid_get_pid (inferior_ptid));
679 #endif
680 }
681 
682 #ifdef TDP_RFPPWAIT
683 /*
684  To catch fork events, PT_FOLLOW_FORK is set on every traced process
685  to enable stops on returns from fork or vfork. Note that both the
686  parent and child will always stop, even if system call stops are not
687  enabled.
688 
689  After a fork, both the child and parent process will stop and report
690  an event. However, there is no guarantee of order. If the parent
691  reports its stop first, then fbsd_wait explicitly waits for the new
692  child before returning. If the child reports its stop first, then
693  the event is saved on a list and ignored until the parent's stop is
694  reported. fbsd_wait could have been changed to fetch the parent PID
695  of the new child and used that to wait for the parent explicitly.
696  However, if two threads in the parent fork at the same time, then
697  the wait on the parent might return the "wrong" fork event.
698 
699  The initial version of PT_FOLLOW_FORK did not set PL_FLAG_CHILD for
700  the new child process. This flag could be inferred by treating any
701  events for an unknown pid as a new child.
702 
703  In addition, the initial version of PT_FOLLOW_FORK did not report a
704  stop event for the parent process of a vfork until after the child
705  process executed a new program or exited. The kernel was changed to
706  defer the wait for exit or exec of the child until after posting the
707  stop event shortly after the change to introduce PL_FLAG_CHILD.
708  This could be worked around by reporting a vfork event when the
709  child event posted and ignoring the subsequent event from the
710  parent.
711 
712  This implementation requires both of these fixes for simplicity's
713  sake. FreeBSD versions newer than 9.1 contain both fixes.
714 */
715 
716 static std::list<ptid_t> fbsd_pending_children;
717 
718 /* Record a new child process event that is reported before the
719  corresponding fork event in the parent. */
720 
721 static void
722 fbsd_remember_child (ptid_t pid)
723 {
724  fbsd_pending_children.push_front (pid);
725 }
726 
727 /* Check for a previously-recorded new child process event for PID.
728  If one is found, remove it from the list and return the PTID. */
729 
730 static ptid_t
731 fbsd_is_child_pending (pid_t pid)
732 {
733  for (auto it = fbsd_pending_children.begin ();
734  it != fbsd_pending_children.end (); it++)
735  if (it->pid () == pid)
736  {
737  ptid_t ptid = *it;
738  fbsd_pending_children.erase (it);
739  return ptid;
740  }
741  return null_ptid;
742 }
743 
744 #ifndef PTRACE_VFORK
745 static std::forward_list<ptid_t> fbsd_pending_vfork_done;
746 
747 /* Record a pending vfork done event. */
748 
749 static void
750 fbsd_add_vfork_done (ptid_t pid)
751 {
752  fbsd_pending_vfork_done.push_front (pid);
753 }
754 
755 /* Check for a pending vfork done event for a specific PID. */
756 
757 static int
758 fbsd_is_vfork_done_pending (pid_t pid)
759 {
760  for (auto it = fbsd_pending_vfork_done.begin ();
761  it != fbsd_pending_vfork_done.end (); it++)
762  if (it->pid () == pid)
763  return 1;
764  return 0;
765 }
766 
767 /* Check for a pending vfork done event. If one is found, remove it
768  from the list and return the PTID. */
769 
770 static ptid_t
771 fbsd_next_vfork_done (void)
772 {
773  if (!fbsd_pending_vfork_done.empty ())
774  {
775  ptid_t ptid = fbsd_pending_vfork_done.front ();
776  fbsd_pending_vfork_done.pop_front ();
777  return ptid;
778  }
779  return null_ptid;
780 }
781 #endif
782 #endif
783 
784 /* Implement the "to_resume" target_ops method. */
785 
786 static void
787 fbsd_resume (struct target_ops *ops,
788  ptid_t ptid, int step, enum gdb_signal signo)
789 {
790 #if defined(TDP_RFPPWAIT) && !defined(PTRACE_VFORK)
791  pid_t pid;
792 
793  /* Don't PT_CONTINUE a process which has a pending vfork done event. */
794  if (ptid_equal (minus_one_ptid, ptid))
796  else
797  pid = ptid_get_pid (ptid);
798  if (fbsd_is_vfork_done_pending (pid))
799  return;
800 #endif
801 
802  if (debug_fbsd_lwp)
804  "FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
805  ptid_get_pid (ptid), ptid_get_lwp (ptid),
806  ptid_get_tid (ptid));
807  if (ptid_lwp_p (ptid))
808  {
809  /* If ptid is a specific LWP, suspend all other LWPs in the process. */
810  struct thread_info *tp;
811  int request;
812 
814  {
815  if (ptid_get_pid (tp->ptid) != ptid_get_pid (ptid))
816  continue;
817 
818  if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (ptid))
819  request = PT_RESUME;
820  else
821  request = PT_SUSPEND;
822 
823  if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
824  perror_with_name (("ptrace"));
825  }
826  }
827  else
828  {
829  /* If ptid is a wildcard, resume all matching threads (they won't run
830  until the process is continued however). */
831  struct thread_info *tp;
832 
834  {
835  if (!ptid_match (tp->ptid, ptid))
836  continue;
837 
838  if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
839  perror_with_name (("ptrace"));
840  }
842  }
843  super_resume (ops, ptid, step, signo);
844 }
845 
846 /* Wait for the child specified by PTID to do something. Return the
847  process ID of the child, or MINUS_ONE_PTID in case of error; store
848  the status in *OURSTATUS. */
849 
850 static ptid_t
851 fbsd_wait (struct target_ops *ops,
852  ptid_t ptid, struct target_waitstatus *ourstatus,
853  int target_options)
854 {
855  ptid_t wptid;
856 
857  while (1)
858  {
859 #ifndef PTRACE_VFORK
860  wptid = fbsd_next_vfork_done ();
861  if (!ptid_equal (wptid, null_ptid))
862  {
863  ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
864  return wptid;
865  }
866 #endif
867  wptid = super_wait (ops, ptid, ourstatus, target_options);
868  if (ourstatus->kind == TARGET_WAITKIND_STOPPED)
869  {
870  struct ptrace_lwpinfo pl;
871  pid_t pid;
872  int status;
873 
874  pid = ptid_get_pid (wptid);
875  if (ptrace (PT_LWPINFO, pid, (caddr_t) &pl, sizeof pl) == -1)
876  perror_with_name (("ptrace"));
877 
878  wptid = ptid_build (pid, pl.pl_lwpid, 0);
879 
880 #ifdef PT_LWP_EVENTS
881  if (pl.pl_flags & PL_FLAG_EXITED)
882  {
883  /* If GDB attaches to a multi-threaded process, exiting
884  threads might be skipped during fbsd_post_attach that
885  have not yet reported their PL_FLAG_EXITED event.
886  Ignore EXITED events for an unknown LWP. */
887  if (in_thread_list (wptid))
888  {
889  if (debug_fbsd_lwp)
891  "FLWP: deleting thread for LWP %u\n",
892  pl.pl_lwpid);
894  printf_unfiltered (_("[%s exited]\n"), target_pid_to_str
895  (wptid));
896  delete_thread (wptid);
897  }
898  if (ptrace (PT_CONTINUE, pid, (caddr_t) 1, 0) == -1)
899  perror_with_name (("ptrace"));
900  continue;
901  }
902 #endif
903 
904  /* Switch to an LWP PTID on the first stop in a new process.
905  This is done after handling PL_FLAG_EXITED to avoid
906  switching to an exited LWP. It is done before checking
907  PL_FLAG_BORN in case the first stop reported after
908  attaching to an existing process is a PL_FLAG_BORN
909  event. */
911  {
912  if (debug_fbsd_lwp)
914  "FLWP: using LWP %u for first thread\n",
915  pl.pl_lwpid);
917  }
918 
919 #ifdef PT_LWP_EVENTS
920  if (pl.pl_flags & PL_FLAG_BORN)
921  {
922  /* If GDB attaches to a multi-threaded process, newborn
923  threads might be added by fbsd_add_threads that have
924  not yet reported their PL_FLAG_BORN event. Ignore
925  BORN events for an already-known LWP. */
926  if (!in_thread_list (wptid))
927  {
928  if (debug_fbsd_lwp)
930  "FLWP: adding thread for LWP %u\n",
931  pl.pl_lwpid);
932  add_thread (wptid);
933  }
934  ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
935  return wptid;
936  }
937 #endif
938 
939 #ifdef TDP_RFPPWAIT
940  if (pl.pl_flags & PL_FLAG_FORKED)
941  {
942 #ifndef PTRACE_VFORK
943  struct kinfo_proc kp;
944 #endif
945  ptid_t child_ptid;
946  pid_t child;
947 
948  child = pl.pl_child_pid;
949  ourstatus->kind = TARGET_WAITKIND_FORKED;
950 #ifdef PTRACE_VFORK
951  if (pl.pl_flags & PL_FLAG_VFORKED)
952  ourstatus->kind = TARGET_WAITKIND_VFORKED;
953 #endif
954 
955  /* Make sure the other end of the fork is stopped too. */
956  child_ptid = fbsd_is_child_pending (child);
957  if (ptid_equal (child_ptid, null_ptid))
958  {
959  pid = waitpid (child, &status, 0);
960  if (pid == -1)
961  perror_with_name (("waitpid"));
962 
963  gdb_assert (pid == child);
964 
965  if (ptrace (PT_LWPINFO, child, (caddr_t)&pl, sizeof pl) == -1)
966  perror_with_name (("ptrace"));
967 
968  gdb_assert (pl.pl_flags & PL_FLAG_CHILD);
969  child_ptid = ptid_build (child, pl.pl_lwpid, 0);
970  }
971 
972  /* Enable additional events on the child process. */
973  fbsd_enable_proc_events (ptid_get_pid (child_ptid));
974 
975 #ifndef PTRACE_VFORK
976  /* For vfork, the child process will have the P_PPWAIT
977  flag set. */
978  fbsd_fetch_kinfo_proc (child, &kp);
979  if (kp.ki_flag & P_PPWAIT)
980  ourstatus->kind = TARGET_WAITKIND_VFORKED;
981 #endif
982  ourstatus->value.related_pid = child_ptid;
983 
984  return wptid;
985  }
986 
987  if (pl.pl_flags & PL_FLAG_CHILD)
988  {
989  /* Remember that this child forked, but do not report it
990  until the parent reports its corresponding fork
991  event. */
992  fbsd_remember_child (wptid);
993  continue;
994  }
995 
996 #ifdef PTRACE_VFORK
997  if (pl.pl_flags & PL_FLAG_VFORK_DONE)
998  {
999  ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
1000  return wptid;
1001  }
1002 #endif
1003 #endif
1004 
1005 #ifdef PL_FLAG_EXEC
1006  if (pl.pl_flags & PL_FLAG_EXEC)
1007  {
1008  ourstatus->kind = TARGET_WAITKIND_EXECD;
1009  ourstatus->value.execd_pathname
1010  = xstrdup (fbsd_pid_to_exec_file (NULL, pid));
1011  return wptid;
1012  }
1013 #endif
1014 
1015  /* Note that PL_FLAG_SCE is set for any event reported while
1016  a thread is executing a system call in the kernel. In
1017  particular, signals that interrupt a sleep in a system
1018  call will report this flag as part of their event. Stops
1019  explicitly for system call entry and exit always use
1020  SIGTRAP, so only treat SIGTRAP events as system call
1021  entry/exit events. */
1022  if (pl.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)
1023  && ourstatus->value.sig == SIGTRAP)
1024  {
1025 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
1026  if (catch_syscall_enabled ())
1027  {
1028  if (catching_syscall_number (pl.pl_syscall_code))
1029  {
1030  if (pl.pl_flags & PL_FLAG_SCE)
1031  ourstatus->kind = TARGET_WAITKIND_SYSCALL_ENTRY;
1032  else
1033  ourstatus->kind = TARGET_WAITKIND_SYSCALL_RETURN;
1034  ourstatus->value.syscall_number = pl.pl_syscall_code;
1035  return wptid;
1036  }
1037  }
1038 #endif
1039  /* If the core isn't interested in this event, just
1040  continue the process explicitly and wait for another
1041  event. Note that PT_SYSCALL is "sticky" on FreeBSD
1042  and once system call stops are enabled on a process
1043  it stops for all system call entries and exits. */
1044  if (ptrace (PT_CONTINUE, pid, (caddr_t) 1, 0) == -1)
1045  perror_with_name (("ptrace"));
1046  continue;
1047  }
1048  }
1049  return wptid;
1050  }
1051 }
1052 
1053 #ifdef TDP_RFPPWAIT
1054 /* Target hook for follow_fork. On entry and at return inferior_ptid is
1055  the ptid of the followed inferior. */
1056 
1057 static int
1058 fbsd_follow_fork (struct target_ops *ops, int follow_child,
1059  int detach_fork)
1060 {
1061  if (!follow_child && detach_fork)
1062  {
1063  struct thread_info *tp = inferior_thread ();
1064  pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid);
1065 
1066  /* Breakpoints have already been detached from the child by
1067  infrun.c. */
1068 
1069  if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
1070  perror_with_name (("ptrace"));
1071 
1072 #ifndef PTRACE_VFORK
1074  {
1075  /* We can't insert breakpoints until the child process has
1076  finished with the shared memory region. The parent
1077  process doesn't wait for the child process to exit or
1078  exec until after it has been resumed from the ptrace stop
1079  to report the fork. Once it has been resumed it doesn't
1080  stop again before returning to userland, so there is no
1081  reliable way to wait on the parent.
1082 
1083  We can't stay attached to the child to wait for an exec
1084  or exit because it may invoke ptrace(PT_TRACE_ME)
1085  (e.g. if the parent process is a debugger forking a new
1086  child process).
1087 
1088  In the end, the best we can do is to make sure it runs
1089  for a little while. Hopefully it will be out of range of
1090  any breakpoints we reinsert. Usually this is only the
1091  single-step breakpoint at vfork's return point. */
1092 
1093  usleep (10000);
1094 
1095  /* Schedule a fake VFORK_DONE event to report on the next
1096  wait. */
1097  fbsd_add_vfork_done (inferior_ptid);
1098  }
1099 #endif
1100  }
1101 
1102  return 0;
1103 }
1104 
1105 static int
1106 fbsd_insert_fork_catchpoint (struct target_ops *self, int pid)
1107 {
1108  return 0;
1109 }
1110 
1111 static int
1112 fbsd_remove_fork_catchpoint (struct target_ops *self, int pid)
1113 {
1114  return 0;
1115 }
1116 
1117 static int
1118 fbsd_insert_vfork_catchpoint (struct target_ops *self, int pid)
1119 {
1120  return 0;
1121 }
1122 
1123 static int
1124 fbsd_remove_vfork_catchpoint (struct target_ops *self, int pid)
1125 {
1126  return 0;
1127 }
1128 #endif
1129 
1130 /* Implement the "to_post_startup_inferior" target_ops method. */
1131 
1132 static void
1133 fbsd_post_startup_inferior (struct target_ops *self, ptid_t pid)
1134 {
1135  fbsd_enable_proc_events (ptid_get_pid (pid));
1136 }
1137 
1138 /* Implement the "to_post_attach" target_ops method. */
1139 
1140 static void
1141 fbsd_post_attach (struct target_ops *self, int pid)
1142 {
1143  fbsd_enable_proc_events (pid);
1144  fbsd_add_threads (pid);
1145 }
1146 
1147 #ifdef PL_FLAG_EXEC
1148 /* If the FreeBSD kernel supports PL_FLAG_EXEC, then traced processes
1149  will always stop after exec. */
1150 
1151 static int
1152 fbsd_insert_exec_catchpoint (struct target_ops *self, int pid)
1153 {
1154  return 0;
1155 }
1156 
1157 static int
1158 fbsd_remove_exec_catchpoint (struct target_ops *self, int pid)
1159 {
1160  return 0;
1161 }
1162 #endif
1163 
1164 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
1165 static int
1166 fbsd_set_syscall_catchpoint (struct target_ops *self, int pid, bool needed,
1167  int any_count,
1168  gdb::array_view<const int> syscall_counts)
1169 {
1170 
1171  /* Ignore the arguments. inf-ptrace.c will use PT_SYSCALL which
1172  will catch all system call entries and exits. The system calls
1173  are filtered by GDB rather than the kernel. */
1174  return 0;
1175 }
1176 #endif
1177 #endif
1178 
1179 void
1181 {
1184 #ifdef KERN_PROC_AUXV
1186  t->to_xfer_partial = fbsd_xfer_partial;
1187 #endif
1188 #ifdef PT_LWPINFO
1189  t->to_thread_alive = fbsd_thread_alive;
1190  t->to_pid_to_str = fbsd_pid_to_str;
1191 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_TDNAME
1192  t->to_thread_name = fbsd_thread_name;
1193 #endif
1194  t->to_update_thread_list = fbsd_update_thread_list;
1196  super_resume = t->to_resume;
1197  t->to_resume = fbsd_resume;
1198  super_wait = t->to_wait;
1199  t->to_wait = fbsd_wait;
1200  t->to_post_startup_inferior = fbsd_post_startup_inferior;
1201  t->to_post_attach = fbsd_post_attach;
1202 #ifdef TDP_RFPPWAIT
1203  t->to_follow_fork = fbsd_follow_fork;
1204  t->to_insert_fork_catchpoint = fbsd_insert_fork_catchpoint;
1205  t->to_remove_fork_catchpoint = fbsd_remove_fork_catchpoint;
1206  t->to_insert_vfork_catchpoint = fbsd_insert_vfork_catchpoint;
1207  t->to_remove_vfork_catchpoint = fbsd_remove_vfork_catchpoint;
1208 #endif
1209 #ifdef PL_FLAG_EXEC
1210  t->to_insert_exec_catchpoint = fbsd_insert_exec_catchpoint;
1211  t->to_remove_exec_catchpoint = fbsd_remove_exec_catchpoint;
1212 #endif
1213 #ifdef HAVE_STRUCT_PTRACE_LWPINFO_PL_SYSCALL_CODE
1214  t->to_set_syscall_catchpoint = fbsd_set_syscall_catchpoint;
1215 #endif
1216 #endif
1217  add_target (t);
1218 }
1219 
1220 void
1222 {
1223 #ifdef PT_LWPINFO
1225  &debug_fbsd_lwp, _("\
1226 Set debugging of FreeBSD lwp module."), _("\
1227 Show debugging of FreeBSD lwp module."), _("\
1228 Enables printf debugging output."),
1229  NULL,
1230  &show_fbsd_lwp_debug,
1232 #endif
1233 }
unsigned int lwpid_t
struct gdbarch * target_gdbarch(void)
Definition: gdbarch.c:5467
const char * string
Definition: signals.c:50
void add_target(struct target_ops *t)
Definition: target.c:395
ssize_t read(int fd, void *buf, size_t count)
Definition: expect-read1.c:26
static int fbsd_find_memory_regions(struct target_ops *self, find_memory_region_ftype func, void *obfd)
Definition: fbsd-nat.c:168
constexpr long lwp() const
Definition: ptid.h:63
struct thread_info * add_thread(ptid_t ptid)
Definition: thread.c:333
int catch_syscall_enabled(void)
static target_xfer_partial_ftype * super_xfer_partial
struct frame_info * get_current_frame(void)
Definition: frame.c:1563
int(* to_find_memory_regions)(struct target_ops *, find_memory_region_ftype func, void *data) TARGET_DEFAULT_FUNC(dummy_find_memory_regions)
Definition: target.h:683
int ptid_get_pid(const ptid_t &ptid)
Definition: ptid.c:47
void delete_thread(ptid_t)
Definition: thread.c:476
void fbsd_nat_add_target(struct target_ops *t)
Definition: fbsd-nat.c:1180
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
Definition: gnu-nat.c:1824
void(* func)(char *)
if(!(yy_init))
Definition: ada-lex.c:1075
int(* to_follow_fork)(struct target_ops *, int, int) TARGET_DEFAULT_FUNC(default_follow_fork)
Definition: target.h:592
struct thread_info * inferior_thread(void)
Definition: thread.c:90
int(* to_set_syscall_catchpoint)(struct target_ops *, int, bool, int, gdb::array_view< const int >) TARGET_DEFAULT_RETURN(1)
Definition: target.h:600
int info_verbose
Definition: top.c:1791
const char *(* to_pid_to_str)(struct target_ops *, ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
Definition: target.h:630
union target_waitstatus::@174 value
int gdbarch_long_bit(struct gdbarch *gdbarch)
Definition: gdbarch.c:1596
#define _(String)
Definition: gdb_locale.h:35
PTRACE_TYPE_RET ptrace()
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
Definition: utils.c:2745
int(* to_remove_exec_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:596
ptid_t ptid_build(int pid, long lwp, long tid)
Definition: ptid.c:31
const char * normal_pid_to_str(ptid_t ptid)
Definition: target.c:3234
#define XCNEWVEC(T, N)
Definition: poison.h:157
int in_thread_list(ptid_t ptid)
Definition: thread.c:628
const char *const name
Definition: aarch64-tdep.c:76
int(* to_remove_fork_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:586
std::unique_ptr< FILE, gdb_file_deleter > gdb_file_up
Definition: filestuff.h:59
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
void fprintf_filtered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2008
enum gdb_signal sig
Definition: waitstatus.h:114
long ptid_get_tid(const ptid_t &ptid)
Definition: ptid.c:63
int(* to_remove_vfork_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:590
Definition: ptid.h:35
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2018
void(* to_resume)(struct target_ops *, ptid_t, int TARGET_DEBUG_PRINTER(target_debug_print_step), enum gdb_signal) TARGET_DEFAULT_NORETURN(noprocess())
Definition: target.h:447
ptid_t pid_to_ptid(int pid)
Definition: ptid.c:39
int(* to_insert_exec_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:594
int catching_syscall_number(int syscall_number)
target_xfer_status
Definition: target.h:206
void free(T *ptr)=delete
struct target_waitstatus pending_follow
Definition: gdbthread.h:342
void thread_change_ptid(ptid_t old_ptid, ptid_t new_ptid)
Definition: thread.c:855
int(* to_insert_fork_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:584
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
Definition: gnu-nat.c:1822
ptid_t ptid
Definition: gdbthread.h:219
#define PL_FLAG_SI
Definition: fbsd-tdep.c:49
enum target_xfer_status(* to_xfer_partial)(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) TARGET_DEFAULT_RETURN(TARGET_XFER_E_IO)
Definition: target.h:739
void printf_unfiltered(const char *format,...)
Definition: utils.c:2056
struct cmd_list_element * setdebuglist
Definition: cli-cmds.c:153
static char * fbsd_pid_to_exec_file(struct target_ops *self, int pid)
Definition: fbsd-nat.c:50
#define PT_CONTINUE
Definition: gdb_ptrace.h:79
long ptid_get_lwp(const ptid_t &ptid)
Definition: ptid.c:55
target_object
Definition: target.h:132
char *(* to_pid_to_exec_file)(struct target_ops *, int pid) TARGET_DEFAULT_RETURN(NULL)
Definition: target.h:650
#define gdb_assert(expr)
Definition: gdb_assert.h:32
Definition: value.c:169
char * execd_pathname
Definition: waitstatus.h:118
bfd_byte gdb_byte
Definition: common-types.h:38
int ptid_lwp_p(const ptid_t &ptid)
Definition: ptid.c:87
static int fbsd_read_mapping(FILE *mapfile, unsigned long *start, unsigned long *end, char *protection)
Definition: fbsd-nat.c:143
ptid_t null_ptid
Definition: ptid.c:25
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
Definition: utils.c:692
#define ALL_NON_EXITED_THREADS(T)
Definition: gdbthread.h:490
void prune_threads(void)
Definition: thread.c:727
int xsnprintf(char *str, size_t size, const char *format,...)
Definition: common-utils.c:134
enum target_waitkind kind
Definition: waitstatus.h:106
ptid_t inferior_ptid
Definition: infcmd.c:94
constexpr bool lwp_p() const
Definition: ptid.h:58
const char * target_pid_to_str(ptid_t ptid)
Definition: target.c:2194
int offset
Definition: agent.c:65
void add_setshow_boolean_cmd(const char *name, enum command_class theclass, int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
Definition: cli-decode.c:569
void(* to_post_attach)(struct target_ops *, int) TARGET_DEFAULT_IGNORE()
Definition: target.h:441
static constexpr ptid_t lwp
void _initialize_fbsd_nat(void)
Definition: fbsd-nat.c:1221
std::string string_printf(const char *fmt,...)
Definition: common-utils.c:150
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
Definition: ptid.c:71
gdb::def_vector< gdb_byte > byte_vector
Definition: byte-vector.h:58
void delete_exited_threads(void)
Definition: thread.c:741
int ptid_match(const ptid_t &ptid, const ptid_t &filter)
Definition: ptid.c:103
unsigned long long ULONGEST
Definition: common-types.h:53
#define gdb_stdlog
Definition: utils.h:349
struct cmd_list_element * showdebuglist
Definition: cli-cmds.c:155
#define PTRACE_TYPE_ARG3
Definition: config.h:642
int(* to_insert_vfork_catchpoint)(struct target_ops *, int) TARGET_DEFAULT_RETURN(1)
Definition: target.h:588
int to_has_thread_control
Definition: target.h:662
int(* to_thread_alive)(struct target_ops *, ptid_t ptid) TARGET_DEFAULT_RETURN(0)
Definition: target.h:626
static int detach_fork
Definition: infrun.c:154
void(* to_update_thread_list)(struct target_ops *) TARGET_DEFAULT_IGNORE()
Definition: target.h:628
int(* find_memory_region_ftype)(CORE_ADDR addr, unsigned long size, int read, int write, int exec, int modified, void *data)
Definition: defs.h:371
ptid_t(* to_wait)(struct target_ops *, ptid_t, struct target_waitstatus *, int TARGET_DEBUG_PRINTER(target_debug_print_options)) TARGET_DEFAULT_FUNC(default_target_wait)
Definition: target.h:453
void error(const char *fmt,...)
Definition: errors.c:38
const char *(* to_thread_name)(struct target_ops *, struct thread_info *) TARGET_DEFAULT_RETURN(NULL)
Definition: target.h:634
size_t size
Definition: go32-nat.c:242
ptid_t minus_one_ptid
Definition: ptid.c:26
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691
int print_thread_events
Definition: thread.c:1912
void(* to_post_startup_inferior)(struct target_ops *, ptid_t) TARGET_DEFAULT_IGNORE()
Definition: target.h:582
#define gdb_stdout
Definition: utils.h:340