1/* libthread_db assisted debugging support, generic parts.
2
3   Copyright 1999, 2000, 2001, 2003, 2004 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 2 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, write to the Free Software
19   Foundation, Inc., 59 Temple Place - Suite 330,
20   Boston, MA 02111-1307, USA.  */
21
22#include "defs.h"
23
24#include "gdb_assert.h"
25#include <dlfcn.h>
26#include "gdb_proc_service.h"
27#include "gdb_thread_db.h"
28
29#include "bfd.h"
30#include "gdbthread.h"
31#include "inferior.h"
32#include "symfile.h"
33#include "objfiles.h"
34#include "target.h"
35#include "regcache.h"
36#include "solib-svr4.h"
37
38#ifdef HAVE_GNU_LIBC_VERSION_H
39#include <gnu/libc-version.h>
40#endif
41
42#ifndef LIBTHREAD_DB_SO
43#define LIBTHREAD_DB_SO "libthread_db.so.1"
44#endif
45
46/* If we're running on GNU/Linux, we must explicitly attach to any new
47   threads.  */
48
49/* FIXME: There is certainly some room for improvements:
50   - Cache LWP ids.
51   - Bypass libthread_db when fetching or storing registers for
52   threads bound to a LWP.  */
53
54/* This module's target vector.  */
55static struct target_ops thread_db_ops;
56
57/* The target vector that we call for things this module can't handle.  */
58static struct target_ops *target_beneath;
59
60/* Pointer to the next function on the objfile event chain.  */
61static void (*target_new_objfile_chain) (struct objfile * objfile);
62
63/* Non-zero if we're using this module's target vector.  */
64static int using_thread_db;
65
66/* Non-zero if we have determined the signals used by the threads
67   library.  */
68static int thread_signals;
69static sigset_t thread_stop_set;
70static sigset_t thread_print_set;
71
72/* Structure that identifies the child process for the
73   <proc_service.h> interface.  */
74static struct ps_prochandle proc_handle;
75
76/* Connection to the libthread_db library.  */
77static td_thragent_t *thread_agent;
78
79/* Pointers to the libthread_db functions.  */
80
81static td_err_e (*td_init_p) (void);
82
83static td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
84				td_thragent_t **ta);
85static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
86				       td_thrhandle_t *__th);
87static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
88					lwpid_t lwpid, td_thrhandle_t *th);
89static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
90				     td_thr_iter_f *callback, void *cbdata_p,
91				     td_thr_state_e state, int ti_pri,
92				     sigset_t *ti_sigmask_p,
93				     unsigned int ti_user_flags);
94static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
95				       td_event_e event, td_notify_t *ptr);
96static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
97				      td_thr_events_t *event);
98static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
99					 td_event_msg_t *msg);
100
101static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
102static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
103				      td_thrinfo_t *infop);
104static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
105				       gdb_prfpregset_t *regset);
106static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
107				      prgregset_t gregs);
108static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
109				       const gdb_prfpregset_t *fpregs);
110static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
111				      prgregset_t gregs);
112static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
113					  int event);
114
115static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
116					  void *map_address,
117					  size_t offset, void **address);
118
119/* Location of the thread creation event breakpoint.  The code at this
120   location in the child process will be called by the pthread library
121   whenever a new thread is created.  By setting a special breakpoint
122   at this location, GDB can detect when a new thread is created.  We
123   obtain this location via the td_ta_event_addr call.  */
124static CORE_ADDR td_create_bp_addr;
125
126/* Location of the thread death event breakpoint.  */
127static CORE_ADDR td_death_bp_addr;
128
129/* Prototypes for local functions.  */
130static void thread_db_find_new_threads (void);
131static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
132			   const td_thrinfo_t *ti_p, int verbose);
133static void detach_thread (ptid_t ptid, int verbose);
134
135
136/* Building process ids.  */
137
138#define GET_PID(ptid)		ptid_get_pid (ptid)
139#define GET_LWP(ptid)		ptid_get_lwp (ptid)
140#define GET_THREAD(ptid)	ptid_get_tid (ptid)
141
142#define is_lwp(ptid)		(GET_LWP (ptid) != 0)
143#define is_thread(ptid)		(GET_THREAD (ptid) != 0)
144
145#define BUILD_LWP(lwp, pid)	ptid_build (pid, lwp, 0)
146#define BUILD_THREAD(tid, pid)	ptid_build (pid, 0, tid)
147
148
149/* Use "struct private_thread_info" to cache thread state.  This is
150   a substantial optimization.  */
151
152struct private_thread_info
153{
154  /* Flag set when we see a TD_DEATH event for this thread.  */
155  unsigned int dying:1;
156
157  /* Cached thread state.  */
158  unsigned int th_valid:1;
159  unsigned int ti_valid:1;
160
161  td_thrhandle_t th;
162  td_thrinfo_t ti;
163};
164
165
166static char *
167thread_db_err_str (td_err_e err)
168{
169  static char buf[64];
170
171  switch (err)
172    {
173    case TD_OK:
174      return "generic 'call succeeded'";
175    case TD_ERR:
176      return "generic error";
177    case TD_NOTHR:
178      return "no thread to satisfy query";
179    case TD_NOSV:
180      return "no sync handle to satisfy query";
181    case TD_NOLWP:
182      return "no LWP to satisfy query";
183    case TD_BADPH:
184      return "invalid process handle";
185    case TD_BADTH:
186      return "invalid thread handle";
187    case TD_BADSH:
188      return "invalid synchronization handle";
189    case TD_BADTA:
190      return "invalid thread agent";
191    case TD_BADKEY:
192      return "invalid key";
193    case TD_NOMSG:
194      return "no event message for getmsg";
195    case TD_NOFPREGS:
196      return "FPU register set not available";
197    case TD_NOLIBTHREAD:
198      return "application not linked with libthread";
199    case TD_NOEVENT:
200      return "requested event is not supported";
201    case TD_NOCAPAB:
202      return "capability not available";
203    case TD_DBERR:
204      return "debugger service failed";
205    case TD_NOAPLIC:
206      return "operation not applicable to";
207    case TD_NOTSD:
208      return "no thread-specific data for this thread";
209    case TD_MALLOC:
210      return "malloc failed";
211    case TD_PARTIALREG:
212      return "only part of register set was written/read";
213    case TD_NOXREGS:
214      return "X register set not available for this thread";
215    default:
216      snprintf (buf, sizeof (buf), "unknown thread_db error '%d'", err);
217      return buf;
218    }
219}
220
221static char *
222thread_db_state_str (td_thr_state_e state)
223{
224  static char buf[64];
225
226  switch (state)
227    {
228    case TD_THR_STOPPED:
229      return "stopped by debugger";
230    case TD_THR_RUN:
231      return "runnable";
232    case TD_THR_ACTIVE:
233      return "active";
234    case TD_THR_ZOMBIE:
235      return "zombie";
236    case TD_THR_SLEEP:
237      return "sleeping";
238    case TD_THR_STOPPED_ASLEEP:
239      return "stopped by debugger AND blocked";
240    default:
241      snprintf (buf, sizeof (buf), "unknown thread_db state %d", state);
242      return buf;
243    }
244}
245
246/* A callback function for td_ta_thr_iter, which we use to map all
247   threads to LWPs.
248
249   THP is a handle to the current thread; if INFOP is not NULL, the
250   struct thread_info associated with this thread is returned in
251   *INFOP.
252
253   If the thread is a zombie, TD_THR_ZOMBIE is returned.  Otherwise,
254   zero is returned to indicate success.  */
255
256static int
257thread_get_info_callback (const td_thrhandle_t *thp, void *infop)
258{
259  td_thrinfo_t ti;
260  td_err_e err;
261  struct thread_info *thread_info;
262  ptid_t thread_ptid;
263
264  err = td_thr_get_info_p (thp, &ti);
265  if (err != TD_OK)
266    error ("thread_get_info_callback: cannot get thread info: %s",
267	   thread_db_err_str (err));
268
269  /* Fill the cache.  */
270  thread_ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
271  thread_info = find_thread_pid (thread_ptid);
272
273  /* In the case of a zombie thread, don't continue.  We don't want to
274     attach to it thinking it is a new thread.  */
275  if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
276    {
277      if (infop != NULL)
278        *(struct thread_info **) infop = thread_info;
279      if (thread_info != NULL)
280	{
281	  memcpy (&thread_info->private->th, thp, sizeof (*thp));
282	  thread_info->private->th_valid = 1;
283	  memcpy (&thread_info->private->ti, &ti, sizeof (ti));
284	  thread_info->private->ti_valid = 1;
285	}
286      return TD_THR_ZOMBIE;
287    }
288
289  if (thread_info == NULL)
290    {
291      /* New thread.  Attach to it now (why wait?).  */
292      attach_thread (thread_ptid, thp, &ti, 1);
293      thread_info = find_thread_pid (thread_ptid);
294      gdb_assert (thread_info != NULL);
295    }
296
297  memcpy (&thread_info->private->th, thp, sizeof (*thp));
298  thread_info->private->th_valid = 1;
299  memcpy (&thread_info->private->ti, &ti, sizeof (ti));
300  thread_info->private->ti_valid = 1;
301
302  if (infop != NULL)
303    *(struct thread_info **) infop = thread_info;
304
305  return 0;
306}
307
308/* Accessor functions for the thread_db information, with caching.  */
309
310static void
311thread_db_map_id2thr (struct thread_info *thread_info, int fatal)
312{
313  td_err_e err;
314
315  if (thread_info->private->th_valid)
316    return;
317
318  err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (thread_info->ptid),
319			    &thread_info->private->th);
320  if (err != TD_OK)
321    {
322      if (fatal)
323	error ("Cannot find thread %ld: %s",
324	       (long) GET_THREAD (thread_info->ptid),
325	       thread_db_err_str (err));
326    }
327  else
328    thread_info->private->th_valid = 1;
329}
330
331static td_thrinfo_t *
332thread_db_get_info (struct thread_info *thread_info)
333{
334  td_err_e err;
335
336  if (thread_info->private->ti_valid)
337    return &thread_info->private->ti;
338
339  if (!thread_info->private->th_valid)
340    thread_db_map_id2thr (thread_info, 1);
341
342  err =
343    td_thr_get_info_p (&thread_info->private->th, &thread_info->private->ti);
344  if (err != TD_OK)
345    error ("thread_db_get_info: cannot get thread info: %s",
346	   thread_db_err_str (err));
347
348  thread_info->private->ti_valid = 1;
349  return &thread_info->private->ti;
350}
351
352/* Convert between user-level thread ids and LWP ids.  */
353
354static ptid_t
355thread_from_lwp (ptid_t ptid)
356{
357  td_thrhandle_t th;
358  td_err_e err;
359  struct thread_info *thread_info;
360  ptid_t thread_ptid;
361
362  if (GET_LWP (ptid) == 0)
363    ptid = BUILD_LWP (GET_PID (ptid), GET_PID (ptid));
364
365  gdb_assert (is_lwp (ptid));
366
367  err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
368  if (err != TD_OK)
369    error ("Cannot find user-level thread for LWP %ld: %s",
370	   GET_LWP (ptid), thread_db_err_str (err));
371
372  thread_info = NULL;
373
374  /* Fetch the thread info.  If we get back TD_THR_ZOMBIE, then the
375     event thread has already died.  If another gdb interface has called
376     thread_alive() previously, the thread won't be found on the thread list
377     anymore.  In that case, we don't want to process this ptid anymore
378     to avoid the possibility of later treating it as a newly
379     discovered thread id that we should add to the list.  Thus,
380     we return a -1 ptid which is also how the thread list marks a
381     dead thread.  */
382  if (thread_get_info_callback (&th, &thread_info) == TD_THR_ZOMBIE
383      && thread_info == NULL)
384    return pid_to_ptid (-1);
385
386  gdb_assert (thread_info && thread_info->private->ti_valid);
387
388  return BUILD_THREAD (thread_info->private->ti.ti_tid, GET_PID (ptid));
389}
390
391static ptid_t
392lwp_from_thread (ptid_t ptid)
393{
394  struct thread_info *thread_info;
395  ptid_t thread_ptid;
396
397  if (!is_thread (ptid))
398    return ptid;
399
400  thread_info = find_thread_pid (ptid);
401  thread_db_get_info (thread_info);
402
403  return BUILD_LWP (thread_info->private->ti.ti_lid, GET_PID (ptid));
404}
405
406
407void
408thread_db_init (struct target_ops *target)
409{
410  target_beneath = target;
411}
412
413static void *
414verbose_dlsym (void *handle, const char *name)
415{
416  void *sym = dlsym (handle, name);
417  if (sym == NULL)
418    warning ("Symbol \"%s\" not found in libthread_db: %s", name, dlerror ());
419  return sym;
420}
421
422static int
423thread_db_load (void)
424{
425  void *handle;
426  td_err_e err;
427
428  handle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW);
429  if (handle == NULL)
430    {
431      fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
432			LIBTHREAD_DB_SO, dlerror ());
433      fprintf_filtered (gdb_stderr,
434			"GDB will not be able to debug pthreads.\n\n");
435      return 0;
436    }
437
438  /* Initialize pointers to the dynamic library functions we will use.
439     Essential functions first.  */
440
441  td_init_p = verbose_dlsym (handle, "td_init");
442  if (td_init_p == NULL)
443    return 0;
444
445  td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
446  if (td_ta_new_p == NULL)
447    return 0;
448
449  td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
450  if (td_ta_map_id2thr_p == NULL)
451    return 0;
452
453  td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
454  if (td_ta_map_lwp2thr_p == NULL)
455    return 0;
456
457  td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
458  if (td_ta_thr_iter_p == NULL)
459    return 0;
460
461  td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
462  if (td_thr_validate_p == NULL)
463    return 0;
464
465  td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
466  if (td_thr_get_info_p == NULL)
467    return 0;
468
469  td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
470  if (td_thr_getfpregs_p == NULL)
471    return 0;
472
473  td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
474  if (td_thr_getgregs_p == NULL)
475    return 0;
476
477  td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
478  if (td_thr_setfpregs_p == NULL)
479    return 0;
480
481  td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
482  if (td_thr_setgregs_p == NULL)
483    return 0;
484
485  /* Initialize the library.  */
486  err = td_init_p ();
487  if (err != TD_OK)
488    {
489      warning ("Cannot initialize libthread_db: %s", thread_db_err_str (err));
490      return 0;
491    }
492
493  /* These are not essential.  */
494  td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
495  td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
496  td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
497  td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
498  td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
499
500  return 1;
501}
502
503static td_err_e
504enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
505{
506  td_notify_t notify;
507  td_err_e err;
508
509  /* Get the breakpoint address for thread EVENT.  */
510  err = td_ta_event_addr_p (thread_agent, event, &notify);
511  if (err != TD_OK)
512    return err;
513
514  /* Set up the breakpoint.  */
515  (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
516					      (CORE_ADDR) notify.u.bptaddr,
517					      &current_target);
518  create_thread_event_breakpoint ((*bp));
519
520  return TD_OK;
521}
522
523static void
524enable_thread_event_reporting (void)
525{
526  td_thr_events_t events;
527  td_notify_t notify;
528  td_err_e err;
529#ifdef HAVE_GNU_LIBC_VERSION_H
530  const char *libc_version;
531  int libc_major, libc_minor;
532#endif
533
534  /* We cannot use the thread event reporting facility if these
535     functions aren't available.  */
536  if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
537      || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
538    return;
539
540  /* Set the process wide mask saying which events we're interested in.  */
541  td_event_emptyset (&events);
542  td_event_addset (&events, TD_CREATE);
543
544#ifdef HAVE_GNU_LIBC_VERSION_H
545  /* FIXME: kettenis/2000-04-23: The event reporting facility is
546     broken for TD_DEATH events in glibc 2.1.3, so don't enable it for
547     now.  */
548  libc_version = gnu_get_libc_version ();
549  if (sscanf (libc_version, "%d.%d", &libc_major, &libc_minor) == 2
550      && (libc_major > 2 || (libc_major == 2 && libc_minor > 1)))
551#endif
552    td_event_addset (&events, TD_DEATH);
553
554  err = td_ta_set_event_p (thread_agent, &events);
555  if (err != TD_OK)
556    {
557      warning ("Unable to set global thread event mask: %s",
558	       thread_db_err_str (err));
559      return;
560    }
561
562  /* Delete previous thread event breakpoints, if any.  */
563  remove_thread_event_breakpoints ();
564  td_create_bp_addr = 0;
565  td_death_bp_addr = 0;
566
567  /* Set up the thread creation event.  */
568  err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr);
569  if (err != TD_OK)
570    {
571      warning ("Unable to get location for thread creation breakpoint: %s",
572	       thread_db_err_str (err));
573      return;
574    }
575
576  /* Set up the thread death event.  */
577  err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr);
578  if (err != TD_OK)
579    {
580      warning ("Unable to get location for thread death breakpoint: %s",
581	       thread_db_err_str (err));
582      return;
583    }
584}
585
586static void
587disable_thread_event_reporting (void)
588{
589  td_thr_events_t events;
590
591  /* Set the process wide mask saying we aren't interested in any
592     events anymore.  */
593  td_event_emptyset (&events);
594  td_ta_set_event_p (thread_agent, &events);
595
596  /* Delete thread event breakpoints, if any.  */
597  remove_thread_event_breakpoints ();
598  td_create_bp_addr = 0;
599  td_death_bp_addr = 0;
600}
601
602static void
603check_thread_signals (void)
604{
605#ifdef GET_THREAD_SIGNALS
606  if (!thread_signals)
607    {
608      sigset_t mask;
609      int i;
610
611      GET_THREAD_SIGNALS (&mask);
612      sigemptyset (&thread_stop_set);
613      sigemptyset (&thread_print_set);
614
615      for (i = 1; i < NSIG; i++)
616	{
617	  if (sigismember (&mask, i))
618	    {
619	      if (signal_stop_update (target_signal_from_host (i), 0))
620		sigaddset (&thread_stop_set, i);
621	      if (signal_print_update (target_signal_from_host (i), 0))
622		sigaddset (&thread_print_set, i);
623	      thread_signals = 1;
624	    }
625	}
626    }
627#endif
628}
629
630static void
631thread_db_new_objfile (struct objfile *objfile)
632{
633  td_err_e err;
634
635  /* First time through, report that libthread_db was successfuly
636     loaded.  Can't print this in in thread_db_load as, at that stage,
637     the interpreter and it's console haven't started.  The real
638     problem here is that libthread_db is loaded too early - it should
639     only be loaded when there is a program to debug.  */
640  {
641    static int dejavu;
642    if (!dejavu)
643      {
644	Dl_info info;
645	const char *library = NULL;
646	/* Try dladdr.  */
647	if (dladdr ((*td_ta_new_p), &info) != 0)
648	  library = info.dli_fname;
649	/* Try dlinfo?  */
650	if (library == NULL)
651	  /* Paranoid - don't let a NULL path slip through.  */
652	  library = LIBTHREAD_DB_SO;
653	printf_unfiltered ("Using host libthread_db library \"%s\".\n",
654			   library);
655	dejavu = 1;
656      }
657  }
658
659  /* Don't attempt to use thread_db on targets which can not run
660     (core files).  */
661  if (objfile == NULL || !target_has_execution)
662    {
663      /* All symbols have been discarded.  If the thread_db target is
664         active, deactivate it now.  */
665      if (using_thread_db)
666	{
667	  gdb_assert (proc_handle.pid == 0);
668	  unpush_target (&thread_db_ops);
669	  using_thread_db = 0;
670	}
671
672      goto quit;
673    }
674
675  if (using_thread_db)
676    /* Nothing to do.  The thread library was already detected and the
677       target vector was already activated.  */
678    goto quit;
679
680  /* Initialize the structure that identifies the child process.  Note
681     that at this point there is no guarantee that we actually have a
682     child process.  */
683  proc_handle.pid = GET_PID (inferior_ptid);
684
685  /* Now attempt to open a connection to the thread library.  */
686  err = td_ta_new_p (&proc_handle, &thread_agent);
687  switch (err)
688    {
689    case TD_NOLIBTHREAD:
690      /* No thread library was detected.  */
691      break;
692
693    case TD_OK:
694      printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
695
696      /* The thread library was detected.  Activate the thread_db target.  */
697      push_target (&thread_db_ops);
698      using_thread_db = 1;
699
700      enable_thread_event_reporting ();
701      thread_db_find_new_threads ();
702      break;
703
704    default:
705      warning ("Cannot initialize thread debugging library: %s",
706	       thread_db_err_str (err));
707      break;
708    }
709
710quit:
711  if (target_new_objfile_chain)
712    target_new_objfile_chain (objfile);
713}
714
715/* Attach to a new thread.  This function is called when we receive a
716   TD_CREATE event or when we iterate over all threads and find one
717   that wasn't already in our list.  */
718
719static void
720attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
721	       const td_thrinfo_t *ti_p, int verbose)
722{
723  struct thread_info *tp;
724  td_err_e err;
725
726  /* If we're being called after a TD_CREATE event, we may already
727     know about this thread.  There are two ways this can happen.  We
728     may have iterated over all threads between the thread creation
729     and the TD_CREATE event, for instance when the user has issued
730     the `info threads' command before the SIGTRAP for hitting the
731     thread creation breakpoint was reported.  Alternatively, the
732     thread may have exited and a new one been created with the same
733     thread ID.  In the first case we don't need to do anything; in
734     the second case we should discard information about the dead
735     thread and attach to the new one.  */
736  if (in_thread_list (ptid))
737    {
738      tp = find_thread_pid (ptid);
739      gdb_assert (tp != NULL);
740
741      if (!tp->private->dying)
742        return;
743
744      delete_thread (ptid);
745    }
746
747  check_thread_signals ();
748
749  /* Add the thread to GDB's thread list.  */
750  tp = add_thread (ptid);
751  tp->private = xmalloc (sizeof (struct private_thread_info));
752  memset (tp->private, 0, sizeof (struct private_thread_info));
753
754  if (verbose)
755    printf_unfiltered ("[New %s]\n", target_pid_to_str (ptid));
756
757  if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
758    return;			/* A zombie thread -- do not attach.  */
759
760  /* Under GNU/Linux, we have to attach to each and every thread.  */
761#ifdef ATTACH_LWP
762  ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
763#endif
764
765  /* Enable thread event reporting for this thread.  */
766  err = td_thr_event_enable_p (th_p, 1);
767  if (err != TD_OK)
768    error ("Cannot enable thread event reporting for %s: %s",
769	   target_pid_to_str (ptid), thread_db_err_str (err));
770}
771
772static void
773thread_db_attach (char *args, int from_tty)
774{
775  target_beneath->to_attach (args, from_tty);
776
777  /* Destroy thread info; it's no longer valid.  */
778  init_thread_list ();
779
780  /* The child process is now the actual multi-threaded
781     program.  Snatch its process ID...  */
782  proc_handle.pid = GET_PID (inferior_ptid);
783
784  /* ...and perform the remaining initialization steps.  */
785  enable_thread_event_reporting ();
786  thread_db_find_new_threads ();
787}
788
789static void
790detach_thread (ptid_t ptid, int verbose)
791{
792  struct thread_info *thread_info;
793
794  if (verbose)
795    printf_unfiltered ("[%s exited]\n", target_pid_to_str (ptid));
796
797  /* Don't delete the thread now, because it still reports as active
798     until it has executed a few instructions after the event
799     breakpoint - if we deleted it now, "info threads" would cause us
800     to re-attach to it.  Just mark it as having had a TD_DEATH
801     event.  This means that we won't delete it from our thread list
802     until we notice that it's dead (via prune_threads), or until
803     something re-uses its thread ID.  */
804  thread_info = find_thread_pid (ptid);
805  gdb_assert (thread_info != NULL);
806  thread_info->private->dying = 1;
807}
808
809static void
810thread_db_detach (char *args, int from_tty)
811{
812  disable_thread_event_reporting ();
813
814  /* There's no need to save & restore inferior_ptid here, since the
815     inferior is supposed to be survive this function call.  */
816  inferior_ptid = lwp_from_thread (inferior_ptid);
817
818  /* Forget about the child's process ID.  We shouldn't need it
819     anymore.  */
820  proc_handle.pid = 0;
821
822  target_beneath->to_detach (args, from_tty);
823}
824
825static int
826clear_lwpid_callback (struct thread_info *thread, void *dummy)
827{
828  /* If we know that our thread implementation is 1-to-1, we could save
829     a certain amount of information; it's not clear how much, so we
830     are always conservative.  */
831
832  thread->private->th_valid = 0;
833  thread->private->ti_valid = 0;
834
835  return 0;
836}
837
838static void
839thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
840{
841  struct cleanup *old_chain = save_inferior_ptid ();
842
843  if (GET_PID (ptid) == -1)
844    inferior_ptid = lwp_from_thread (inferior_ptid);
845  else if (is_thread (ptid))
846    ptid = lwp_from_thread (ptid);
847
848  /* Clear cached data which may not be valid after the resume.  */
849  iterate_over_threads (clear_lwpid_callback, NULL);
850
851  target_beneath->to_resume (ptid, step, signo);
852
853  do_cleanups (old_chain);
854}
855
856/* Check if PID is currently stopped at the location of a thread event
857   breakpoint location.  If it is, read the event message and act upon
858   the event.  */
859
860static void
861check_event (ptid_t ptid)
862{
863  td_event_msg_t msg;
864  td_thrinfo_t ti;
865  td_err_e err;
866  CORE_ADDR stop_pc;
867  int loop = 0;
868
869  /* Bail out early if we're not at a thread event breakpoint.  */
870  stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
871  if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
872    return;
873
874  /* If we are at a create breakpoint, we do not know what new lwp
875     was created and cannot specifically locate the event message for it.
876     We have to call td_ta_event_getmsg() to get
877     the latest message.  Since we have no way of correlating whether
878     the event message we get back corresponds to our breakpoint, we must
879     loop and read all event messages, processing them appropriately.
880     This guarantees we will process the correct message before continuing
881     from the breakpoint.
882
883     Currently, death events are not enabled.  If they are enabled,
884     the death event can use the td_thr_event_getmsg() interface to
885     get the message specifically for that lwp and avoid looping
886     below.  */
887
888  loop = 1;
889
890  do
891    {
892      err = td_ta_event_getmsg_p (thread_agent, &msg);
893      if (err != TD_OK)
894	{
895	  if (err == TD_NOMSG)
896	    return;
897
898	  error ("Cannot get thread event message: %s",
899		 thread_db_err_str (err));
900	}
901
902      err = td_thr_get_info_p (msg.th_p, &ti);
903      if (err != TD_OK)
904	error ("Cannot get thread info: %s", thread_db_err_str (err));
905
906      ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
907
908      switch (msg.event)
909	{
910	case TD_CREATE:
911	  /* Call attach_thread whether or not we already know about a
912	     thread with this thread ID.  */
913	  attach_thread (ptid, msg.th_p, &ti, 1);
914
915	  break;
916
917	case TD_DEATH:
918
919	  if (!in_thread_list (ptid))
920	    error ("Spurious thread death event.");
921
922	  detach_thread (ptid, 1);
923
924	  break;
925
926	default:
927	  error ("Spurious thread event.");
928	}
929    }
930  while (loop);
931}
932
933static ptid_t
934thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
935{
936  extern ptid_t trap_ptid;
937
938  if (GET_PID (ptid) != -1 && is_thread (ptid))
939    ptid = lwp_from_thread (ptid);
940
941  ptid = target_beneath->to_wait (ptid, ourstatus);
942
943  if (proc_handle.pid == 0)
944    /* The current child process isn't the actual multi-threaded
945       program yet, so don't try to do any special thread-specific
946       post-processing and bail out early.  */
947    return ptid;
948
949  if (ourstatus->kind == TARGET_WAITKIND_EXITED)
950    return pid_to_ptid (-1);
951
952  if (ourstatus->kind == TARGET_WAITKIND_STOPPED
953      && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
954    /* Check for a thread event.  */
955    check_event (ptid);
956
957  if (!ptid_equal (trap_ptid, null_ptid))
958    trap_ptid = thread_from_lwp (trap_ptid);
959
960  /* Change the ptid back into the higher level PID + TID format.
961     If the thread is dead and no longer on the thread list, we will
962     get back a dead ptid.  This can occur if the thread death event
963     gets postponed by other simultaneous events.  In such a case,
964     we want to just ignore the event and continue on.  */
965  ptid = thread_from_lwp (ptid);
966  if (GET_PID (ptid) == -1)
967    ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
968
969  return ptid;
970}
971
972static int
973thread_db_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
974		       struct mem_attrib *attrib, struct target_ops *target)
975{
976  struct cleanup *old_chain = save_inferior_ptid ();
977  int xfer;
978
979  if (is_thread (inferior_ptid))
980    {
981      /* FIXME: This seems to be necessary to make sure breakpoints
982         are removed.  */
983      if (!target_thread_alive (inferior_ptid))
984	inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
985      else
986	inferior_ptid = lwp_from_thread (inferior_ptid);
987    }
988
989  xfer =
990    target_beneath->deprecated_xfer_memory (memaddr, myaddr, len, write,
991					    attrib, target);
992
993  do_cleanups (old_chain);
994  return xfer;
995}
996
997static void
998thread_db_fetch_registers (int regno)
999{
1000  struct thread_info *thread_info;
1001  prgregset_t gregset;
1002  gdb_prfpregset_t fpregset;
1003  td_err_e err;
1004
1005  if (!is_thread (inferior_ptid))
1006    {
1007      /* Pass the request to the target beneath us.  */
1008      target_beneath->to_fetch_registers (regno);
1009      return;
1010    }
1011
1012  thread_info = find_thread_pid (inferior_ptid);
1013  thread_db_map_id2thr (thread_info, 1);
1014
1015  err = td_thr_getgregs_p (&thread_info->private->th, gregset);
1016  if (err != TD_OK)
1017    error ("Cannot fetch general-purpose registers for thread %ld: %s",
1018	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1019
1020  err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);
1021  if (err != TD_OK)
1022    error ("Cannot get floating-point registers for thread %ld: %s",
1023	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1024
1025  /* Note that we must call supply_gregset after calling the thread_db
1026     routines because the thread_db routines call ps_lgetgregs and
1027     friends which clobber GDB's register cache.  */
1028  supply_gregset ((gdb_gregset_t *) gregset);
1029  supply_fpregset (&fpregset);
1030}
1031
1032static void
1033thread_db_store_registers (int regno)
1034{
1035  prgregset_t gregset;
1036  gdb_prfpregset_t fpregset;
1037  td_err_e err;
1038  struct thread_info *thread_info;
1039
1040  if (!is_thread (inferior_ptid))
1041    {
1042      /* Pass the request to the target beneath us.  */
1043      target_beneath->to_store_registers (regno);
1044      return;
1045    }
1046
1047  thread_info = find_thread_pid (inferior_ptid);
1048  thread_db_map_id2thr (thread_info, 1);
1049
1050  if (regno != -1)
1051    {
1052      char raw[MAX_REGISTER_SIZE];
1053
1054      deprecated_read_register_gen (regno, raw);
1055      thread_db_fetch_registers (-1);
1056      regcache_raw_supply (current_regcache, regno, raw);
1057    }
1058
1059  fill_gregset ((gdb_gregset_t *) gregset, -1);
1060  fill_fpregset (&fpregset, -1);
1061
1062  err = td_thr_setgregs_p (&thread_info->private->th, gregset);
1063  if (err != TD_OK)
1064    error ("Cannot store general-purpose registers for thread %ld: %s",
1065	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1066  err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);
1067  if (err != TD_OK)
1068    error ("Cannot store floating-point registers  for thread %ld: %s",
1069	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1070}
1071
1072static void
1073thread_db_kill (void)
1074{
1075  /* There's no need to save & restore inferior_ptid here, since the
1076     inferior isn't supposed to survive this function call.  */
1077  inferior_ptid = lwp_from_thread (inferior_ptid);
1078  target_beneath->to_kill ();
1079}
1080
1081static void
1082thread_db_create_inferior (char *exec_file, char *allargs, char **env,
1083			   int from_tty)
1084{
1085  unpush_target (&thread_db_ops);
1086  using_thread_db = 0;
1087  target_beneath->to_create_inferior (exec_file, allargs, env, from_tty);
1088}
1089
1090static void
1091thread_db_post_startup_inferior (ptid_t ptid)
1092{
1093  if (proc_handle.pid == 0)
1094    {
1095      /* The child process is now the actual multi-threaded
1096         program.  Snatch its process ID...  */
1097      proc_handle.pid = GET_PID (ptid);
1098
1099      /* ...and perform the remaining initialization steps.  */
1100      enable_thread_event_reporting ();
1101      thread_db_find_new_threads ();
1102    }
1103}
1104
1105static void
1106thread_db_mourn_inferior (void)
1107{
1108  remove_thread_event_breakpoints ();
1109
1110  /* Forget about the child's process ID.  We shouldn't need it
1111     anymore.  */
1112  proc_handle.pid = 0;
1113
1114  target_beneath->to_mourn_inferior ();
1115
1116  /* Detach thread_db target ops.  */
1117  unpush_target (&thread_db_ops);
1118  using_thread_db = 0;
1119}
1120
1121static int
1122thread_db_thread_alive (ptid_t ptid)
1123{
1124  td_thrhandle_t th;
1125  td_err_e err;
1126
1127  if (is_thread (ptid))
1128    {
1129      struct thread_info *thread_info;
1130      thread_info = find_thread_pid (ptid);
1131
1132      thread_db_map_id2thr (thread_info, 0);
1133      if (!thread_info->private->th_valid)
1134	return 0;
1135
1136      err = td_thr_validate_p (&thread_info->private->th);
1137      if (err != TD_OK)
1138	return 0;
1139
1140      if (!thread_info->private->ti_valid)
1141	{
1142	  err =
1143	    td_thr_get_info_p (&thread_info->private->th,
1144			       &thread_info->private->ti);
1145	  if (err != TD_OK)
1146	    return 0;
1147	  thread_info->private->ti_valid = 1;
1148	}
1149
1150      if (thread_info->private->ti.ti_state == TD_THR_UNKNOWN
1151	  || thread_info->private->ti.ti_state == TD_THR_ZOMBIE)
1152	return 0;		/* A zombie thread.  */
1153
1154      return 1;
1155    }
1156
1157  if (target_beneath->to_thread_alive)
1158    return target_beneath->to_thread_alive (ptid);
1159
1160  return 0;
1161}
1162
1163static int
1164find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
1165{
1166  td_thrinfo_t ti;
1167  td_err_e err;
1168  ptid_t ptid;
1169
1170  err = td_thr_get_info_p (th_p, &ti);
1171  if (err != TD_OK)
1172    error ("find_new_threads_callback: cannot get thread info: %s",
1173	   thread_db_err_str (err));
1174
1175  if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
1176    return 0;			/* A zombie -- ignore.  */
1177
1178  ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
1179
1180  if (!in_thread_list (ptid))
1181    attach_thread (ptid, th_p, &ti, 1);
1182
1183  return 0;
1184}
1185
1186static void
1187thread_db_find_new_threads (void)
1188{
1189  td_err_e err;
1190
1191  /* Iterate over all user-space threads to discover new threads.  */
1192  err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
1193			  TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
1194			  TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
1195  if (err != TD_OK)
1196    error ("Cannot find new threads: %s", thread_db_err_str (err));
1197}
1198
1199static char *
1200thread_db_pid_to_str (ptid_t ptid)
1201{
1202  if (is_thread (ptid))
1203    {
1204      static char buf[64];
1205      td_thrinfo_t *ti_p;
1206      td_err_e err;
1207      struct thread_info *thread_info;
1208
1209      thread_info = find_thread_pid (ptid);
1210      thread_db_map_id2thr (thread_info, 0);
1211      if (!thread_info->private->th_valid)
1212	{
1213	  snprintf (buf, sizeof (buf), "Thread %ld (Missing)",
1214		    GET_THREAD (ptid));
1215	  return buf;
1216	}
1217
1218      ti_p = thread_db_get_info (thread_info);
1219
1220      if (ti_p->ti_state == TD_THR_ACTIVE && ti_p->ti_lid != 0)
1221	{
1222	  snprintf (buf, sizeof (buf), "Thread %ld (LWP %d)",
1223		    (long) ti_p->ti_tid, ti_p->ti_lid);
1224	}
1225      else
1226	{
1227	  snprintf (buf, sizeof (buf), "Thread %ld (%s)",
1228		    (long) ti_p->ti_tid,
1229		    thread_db_state_str (ti_p->ti_state));
1230	}
1231
1232      return buf;
1233    }
1234
1235  if (target_beneath->to_pid_to_str (ptid))
1236    return target_beneath->to_pid_to_str (ptid);
1237
1238  return normal_pid_to_str (ptid);
1239}
1240
1241/* Get the address of the thread local variable in OBJFILE which is
1242   stored at OFFSET within the thread local storage for thread PTID.  */
1243
1244static CORE_ADDR
1245thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
1246				    CORE_ADDR offset)
1247{
1248  if (is_thread (ptid))
1249    {
1250      int objfile_is_library = (objfile->flags & OBJF_SHARED);
1251      td_err_e err;
1252      void *address;
1253      CORE_ADDR lm;
1254      struct thread_info *thread_info;
1255
1256      /* glibc doesn't provide the needed interface.  */
1257      if (!td_thr_tls_get_addr_p)
1258	error ("Cannot find thread-local variables in this thread library.");
1259
1260      /* Get the address of the link map for this objfile.  */
1261      lm = svr4_fetch_objfile_link_map (objfile);
1262
1263      /* Whoops, we couldn't find one. Bail out.  */
1264      if (!lm)
1265	{
1266	  if (objfile_is_library)
1267	    error ("Cannot find shared library `%s' link_map in dynamic"
1268		   " linker's module list", objfile->name);
1269	  else
1270	    error ("Cannot find executable file `%s' link_map in dynamic"
1271		   " linker's module list", objfile->name);
1272	}
1273
1274      /* Get info about the thread.  */
1275      thread_info = find_thread_pid (ptid);
1276      thread_db_map_id2thr (thread_info, 1);
1277
1278      /* Finally, get the address of the variable.  */
1279      err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,
1280				   offset, &address);
1281
1282#ifdef THREAD_DB_HAS_TD_NOTALLOC
1283      /* The memory hasn't been allocated, yet.  */
1284      if (err == TD_NOTALLOC)
1285	{
1286	  /* Now, if libthread_db provided the initialization image's
1287	     address, we *could* try to build a non-lvalue value from
1288	     the initialization image.  */
1289	  if (objfile_is_library)
1290	    error ("The inferior has not yet allocated storage for"
1291		   " thread-local variables in\n"
1292		   "the shared library `%s'\n"
1293		   "for the thread %ld",
1294		   objfile->name, (long) GET_THREAD (ptid));
1295	  else
1296	    error ("The inferior has not yet allocated storage for"
1297		   " thread-local variables in\n"
1298		   "the executable `%s'\n"
1299		   "for the thread %ld",
1300		   objfile->name, (long) GET_THREAD (ptid));
1301	}
1302#endif
1303
1304      /* Something else went wrong.  */
1305      if (err != TD_OK)
1306	{
1307	  if (objfile_is_library)
1308	    error ("Cannot find thread-local storage for thread %ld, "
1309		   "shared library %s:\n%s",
1310		   (long) GET_THREAD (ptid),
1311		   objfile->name, thread_db_err_str (err));
1312	  else
1313	    error ("Cannot find thread-local storage for thread %ld, "
1314		   "executable file %s:\n%s",
1315		   (long) GET_THREAD (ptid),
1316		   objfile->name, thread_db_err_str (err));
1317	}
1318
1319      /* Cast assuming host == target.  Joy.  */
1320      return (CORE_ADDR) address;
1321    }
1322
1323  if (target_beneath->to_get_thread_local_address)
1324    return target_beneath->to_get_thread_local_address (ptid, objfile,
1325							offset);
1326
1327  error ("Cannot find thread-local values on this target.");
1328}
1329
1330static void
1331init_thread_db_ops (void)
1332{
1333  thread_db_ops.to_shortname = "multi-thread";
1334  thread_db_ops.to_longname = "multi-threaded child process.";
1335  thread_db_ops.to_doc = "Threads and pthreads support.";
1336  thread_db_ops.to_attach = thread_db_attach;
1337  thread_db_ops.to_detach = thread_db_detach;
1338  thread_db_ops.to_resume = thread_db_resume;
1339  thread_db_ops.to_wait = thread_db_wait;
1340  thread_db_ops.to_fetch_registers = thread_db_fetch_registers;
1341  thread_db_ops.to_store_registers = thread_db_store_registers;
1342  thread_db_ops.deprecated_xfer_memory = thread_db_xfer_memory;
1343  thread_db_ops.to_kill = thread_db_kill;
1344  thread_db_ops.to_create_inferior = thread_db_create_inferior;
1345  thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;
1346  thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
1347  thread_db_ops.to_thread_alive = thread_db_thread_alive;
1348  thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
1349  thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
1350  thread_db_ops.to_stratum = thread_stratum;
1351  thread_db_ops.to_has_thread_control = tc_schedlock;
1352  thread_db_ops.to_get_thread_local_address
1353    = thread_db_get_thread_local_address;
1354  thread_db_ops.to_magic = OPS_MAGIC;
1355}
1356
1357void
1358_initialize_thread_db (void)
1359{
1360  /* Only initialize the module if we can load libthread_db.  */
1361  if (thread_db_load ())
1362    {
1363      init_thread_db_ops ();
1364      add_target (&thread_db_ops);
1365
1366      /* Add ourselves to objfile event chain.  */
1367      target_new_objfile_chain = deprecated_target_new_objfile_hook;
1368      deprecated_target_new_objfile_hook = thread_db_new_objfile;
1369    }
1370}
1371