* config/tc-mips.c (s_change_section): Make sure input buffer
[binutils-gdb.git] / gdb / thread-db.c
1 /* libthread_db assisted debugging support, generic parts.
2 Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "defs.h"
22
23 #include "gdb_assert.h"
24 #include <dlfcn.h>
25 #include "gdb_proc_service.h"
26 #include "gdb_thread_db.h"
27
28 #include "bfd.h"
29 #include "gdbthread.h"
30 #include "inferior.h"
31 #include "symfile.h"
32 #include "objfiles.h"
33 #include "target.h"
34 #include "regcache.h"
35 #include "solib-svr4.h"
36
37 #ifndef LIBTHREAD_DB_SO
38 #define LIBTHREAD_DB_SO "libthread_db.so.1"
39 #endif
40
41 /* If we're running on GNU/Linux, we must explicitly attach to any new
42 threads. */
43
44 /* FIXME: There is certainly some room for improvements:
45 - Cache LWP ids.
46 - Bypass libthread_db when fetching or storing registers for
47 threads bound to a LWP. */
48
49 /* This module's target vector. */
50 static struct target_ops thread_db_ops;
51
52 /* The target vector that we call for things this module can't handle. */
53 static struct target_ops *target_beneath;
54
55 /* Pointer to the next function on the objfile event chain. */
56 static void (*target_new_objfile_chain) (struct objfile *objfile);
57
58 /* Non-zero if we're using this module's target vector. */
59 static int using_thread_db;
60
61 /* Non-zero if we have to keep this module's target vector active
62 across re-runs. */
63 static int keep_thread_db;
64
65 /* Non-zero if we have determined the signals used by the threads
66 library. */
67 static int thread_signals;
68 static sigset_t thread_stop_set;
69 static sigset_t thread_print_set;
70
71 /* Structure that identifies the child process for the
72 <proc_service.h> interface. */
73 static struct ps_prochandle proc_handle;
74
75 /* Connection to the libthread_db library. */
76 static td_thragent_t *thread_agent;
77
78 /* Pointers to the libthread_db functions. */
79
80 static td_err_e (*td_init_p) (void);
81
82 static td_err_e (*td_ta_new_p) (struct ps_prochandle *ps, td_thragent_t **ta);
83 static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
84 td_thrhandle_t *__th);
85 static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta, lwpid_t lwpid,
86 td_thrhandle_t *th);
87 static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
88 td_thr_iter_f *callback,
89 void *cbdata_p, td_thr_state_e state,
90 int ti_pri, sigset_t *ti_sigmask_p,
91 unsigned int ti_user_flags);
92 static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
93 td_event_e event, td_notify_t *ptr);
94 static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
95 td_thr_events_t *event);
96 static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
97 td_event_msg_t *msg);
98
99 static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
100 static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
101 td_thrinfo_t *infop);
102 static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
103 gdb_prfpregset_t *regset);
104 static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
105 prgregset_t gregs);
106 static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
107 const gdb_prfpregset_t *fpregs);
108 static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
109 prgregset_t gregs);
110 static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, int event);
111
112 static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
113 void *map_address,
114 size_t offset,
115 void **address);
116
117 /* Location of the thread creation event breakpoint. The code at this
118 location in the child process will be called by the pthread library
119 whenever a new thread is created. By setting a special breakpoint
120 at this location, GDB can detect when a new thread is created. We
121 obtain this location via the td_ta_event_addr call. */
122 static CORE_ADDR td_create_bp_addr;
123
124 /* Location of the thread death event breakpoint. */
125 static CORE_ADDR td_death_bp_addr;
126
127 /* Prototypes for local functions. */
128 static void thread_db_find_new_threads (void);
129 \f
130
131 /* Building process ids. */
132
133 #define GET_PID(ptid) ptid_get_pid (ptid)
134 #define GET_LWP(ptid) ptid_get_lwp (ptid)
135 #define GET_THREAD(ptid) ptid_get_tid (ptid)
136
137 #define is_lwp(ptid) (GET_LWP (ptid) != 0)
138 #define is_thread(ptid) (GET_THREAD (ptid) != 0)
139
140 #define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
141 #define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
142 \f
143
144 struct private_thread_info
145 {
146 /* Cached LWP id. Must come first, see lin-lwp.c. */
147 lwpid_t lwpid;
148 };
149 \f
150
151 static char *
152 thread_db_err_str (td_err_e err)
153 {
154 static char buf[64];
155
156 switch (err)
157 {
158 case TD_OK:
159 return "generic 'call succeeded'";
160 case TD_ERR:
161 return "generic error";
162 case TD_NOTHR:
163 return "no thread to satisfy query";
164 case TD_NOSV:
165 return "no sync handle to satisfy query";
166 case TD_NOLWP:
167 return "no LWP to satisfy query";
168 case TD_BADPH:
169 return "invalid process handle";
170 case TD_BADTH:
171 return "invalid thread handle";
172 case TD_BADSH:
173 return "invalid synchronization handle";
174 case TD_BADTA:
175 return "invalid thread agent";
176 case TD_BADKEY:
177 return "invalid key";
178 case TD_NOMSG:
179 return "no event message for getmsg";
180 case TD_NOFPREGS:
181 return "FPU register set not available";
182 case TD_NOLIBTHREAD:
183 return "application not linked with libthread";
184 case TD_NOEVENT:
185 return "requested event is not supported";
186 case TD_NOCAPAB:
187 return "capability not available";
188 case TD_DBERR:
189 return "debugger service failed";
190 case TD_NOAPLIC:
191 return "operation not applicable to";
192 case TD_NOTSD:
193 return "no thread-specific data for this thread";
194 case TD_MALLOC:
195 return "malloc failed";
196 case TD_PARTIALREG:
197 return "only part of register set was written/read";
198 case TD_NOXREGS:
199 return "X register set not available for this thread";
200 default:
201 snprintf (buf, sizeof (buf), "unknown thread_db error '%d'", err);
202 return buf;
203 }
204 }
205
206 static char *
207 thread_db_state_str (td_thr_state_e state)
208 {
209 static char buf[64];
210
211 switch (state)
212 {
213 case TD_THR_STOPPED:
214 return "stopped by debugger";
215 case TD_THR_RUN:
216 return "runnable";
217 case TD_THR_ACTIVE:
218 return "active";
219 case TD_THR_ZOMBIE:
220 return "zombie";
221 case TD_THR_SLEEP:
222 return "sleeping";
223 case TD_THR_STOPPED_ASLEEP:
224 return "stopped by debugger AND blocked";
225 default:
226 snprintf (buf, sizeof (buf), "unknown thread_db state %d", state);
227 return buf;
228 }
229 }
230 \f
231
232 /* Convert between user-level thread ids and LWP ids. */
233
234 static ptid_t
235 thread_from_lwp (ptid_t ptid)
236 {
237 td_thrinfo_t ti;
238 td_thrhandle_t th;
239 td_err_e err;
240
241 if (GET_LWP (ptid) == 0)
242 ptid = BUILD_LWP (GET_PID (ptid), GET_PID (ptid));
243
244 gdb_assert (is_lwp (ptid));
245
246 err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
247 if (err != TD_OK)
248 error ("Cannot find user-level thread for LWP %ld: %s",
249 GET_LWP (ptid), thread_db_err_str (err));
250
251 err = td_thr_get_info_p (&th, &ti);
252 if (err != TD_OK)
253 error ("Cannot get thread info: %s", thread_db_err_str (err));
254
255 return BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
256 }
257
258 static ptid_t
259 lwp_from_thread (ptid_t ptid)
260 {
261 td_thrinfo_t ti;
262 td_thrhandle_t th;
263 td_err_e err;
264
265 if (!is_thread (ptid))
266 return ptid;
267
268 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
269 if (err != TD_OK)
270 error ("Cannot find thread %ld: %s",
271 (long) GET_THREAD (ptid), thread_db_err_str (err));
272
273 err = td_thr_get_info_p (&th, &ti);
274 if (err != TD_OK)
275 error ("Cannot get thread info: %s", thread_db_err_str (err));
276
277 return BUILD_LWP (ti.ti_lid, GET_PID (ptid));
278 }
279 \f
280
281 void
282 thread_db_init (struct target_ops *target)
283 {
284 target_beneath = target;
285 }
286
287 static int
288 thread_db_load (void)
289 {
290 void *handle;
291 td_err_e err;
292
293 handle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW);
294 if (handle == NULL)
295 return 0;
296
297 /* Initialize pointers to the dynamic library functions we will use.
298 Essential functions first. */
299
300 td_init_p = dlsym (handle, "td_init");
301 if (td_init_p == NULL)
302 return 0;
303
304 td_ta_new_p = dlsym (handle, "td_ta_new");
305 if (td_ta_new_p == NULL)
306 return 0;
307
308 td_ta_map_id2thr_p = dlsym (handle, "td_ta_map_id2thr");
309 if (td_ta_map_id2thr_p == NULL)
310 return 0;
311
312 td_ta_map_lwp2thr_p = dlsym (handle, "td_ta_map_lwp2thr");
313 if (td_ta_map_lwp2thr_p == NULL)
314 return 0;
315
316 td_ta_thr_iter_p = dlsym (handle, "td_ta_thr_iter");
317 if (td_ta_thr_iter_p == NULL)
318 return 0;
319
320 td_thr_validate_p = dlsym (handle, "td_thr_validate");
321 if (td_thr_validate_p == NULL)
322 return 0;
323
324 td_thr_get_info_p = dlsym (handle, "td_thr_get_info");
325 if (td_thr_get_info_p == NULL)
326 return 0;
327
328 td_thr_getfpregs_p = dlsym (handle, "td_thr_getfpregs");
329 if (td_thr_getfpregs_p == NULL)
330 return 0;
331
332 td_thr_getgregs_p = dlsym (handle, "td_thr_getgregs");
333 if (td_thr_getgregs_p == NULL)
334 return 0;
335
336 td_thr_setfpregs_p = dlsym (handle, "td_thr_setfpregs");
337 if (td_thr_setfpregs_p == NULL)
338 return 0;
339
340 td_thr_setgregs_p = dlsym (handle, "td_thr_setgregs");
341 if (td_thr_setgregs_p == NULL)
342 return 0;
343
344 /* Initialize the library. */
345 err = td_init_p ();
346 if (err != TD_OK)
347 {
348 warning ("Cannot initialize libthread_db: %s", thread_db_err_str (err));
349 return 0;
350 }
351
352 /* These are not essential. */
353 td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
354 td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
355 td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
356 td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
357 td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
358
359 return 1;
360 }
361
362 static void
363 enable_thread_event_reporting (void)
364 {
365 td_thr_events_t events;
366 td_notify_t notify;
367 td_err_e err;
368
369 /* We cannot use the thread event reporting facility if these
370 functions aren't available. */
371 if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
372 || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
373 return;
374
375 /* Set the process wide mask saying which events we're interested in. */
376 td_event_emptyset (&events);
377 td_event_addset (&events, TD_CREATE);
378 #if 0
379 /* FIXME: kettenis/2000-04-23: The event reporting facility is
380 broken for TD_DEATH events in glibc 2.1.3, so don't enable it for
381 now. */
382 td_event_addset (&events, TD_DEATH);
383 #endif
384
385 err = td_ta_set_event_p (thread_agent, &events);
386 if (err != TD_OK)
387 {
388 warning ("Unable to set global thread event mask: %s",
389 thread_db_err_str (err));
390 return;
391 }
392
393 /* Delete previous thread event breakpoints, if any. */
394 remove_thread_event_breakpoints ();
395
396 /* Get address for thread creation breakpoint. */
397 err = td_ta_event_addr_p (thread_agent, TD_CREATE, &notify);
398 if (err != TD_OK)
399 {
400 warning ("Unable to get location for thread creation breakpoint: %s",
401 thread_db_err_str (err));
402 return;
403 }
404
405 /* Set up the breakpoint. */
406 td_create_bp_addr = (CORE_ADDR) notify.u.bptaddr;
407 create_thread_event_breakpoint (td_create_bp_addr);
408
409 /* Get address for thread death breakpoint. */
410 err = td_ta_event_addr_p (thread_agent, TD_DEATH, &notify);
411 if (err != TD_OK)
412 {
413 warning ("Unable to get location for thread death breakpoint: %s",
414 thread_db_err_str (err));
415 return;
416 }
417
418 /* Set up the breakpoint. */
419 td_death_bp_addr = (CORE_ADDR) notify.u.bptaddr;
420 create_thread_event_breakpoint (td_death_bp_addr);
421 }
422
423 static void
424 disable_thread_event_reporting (void)
425 {
426 td_thr_events_t events;
427
428 /* Set the process wide mask saying we aren't interested in any
429 events anymore. */
430 td_event_emptyset (&events);
431 td_ta_set_event_p (thread_agent, &events);
432
433 /* Delete thread event breakpoints, if any. */
434 remove_thread_event_breakpoints ();
435 td_create_bp_addr = 0;
436 td_death_bp_addr = 0;
437 }
438
439 static void
440 check_thread_signals (void)
441 {
442 #ifdef GET_THREAD_SIGNALS
443 if (!thread_signals)
444 {
445 sigset_t mask;
446 int i;
447
448 GET_THREAD_SIGNALS (&mask);
449 sigemptyset (&thread_stop_set);
450 sigemptyset (&thread_print_set);
451
452 for (i = 1; i < NSIG; i++)
453 {
454 if (sigismember (&mask, i))
455 {
456 if (signal_stop_update (target_signal_from_host (i), 0))
457 sigaddset (&thread_stop_set, i);
458 if (signal_print_update (target_signal_from_host (i), 0))
459 sigaddset (&thread_print_set, i);
460 thread_signals = 1;
461 }
462 }
463 }
464 #endif
465 }
466
467 static void
468 disable_thread_signals (void)
469 {
470 #ifdef GET_THREAD_SIGNALS
471 if (thread_signals)
472 {
473 int i;
474
475 for (i = 1; i < NSIG; i++)
476 {
477 if (sigismember (&thread_stop_set, i))
478 signal_stop_update (target_signal_from_host (i), 1);
479 if (sigismember (&thread_print_set, i))
480 signal_print_update (target_signal_from_host (i), 1);
481 }
482
483 thread_signals = 0;
484 }
485 #endif
486 }
487
488 static void
489 thread_db_new_objfile (struct objfile *objfile)
490 {
491 td_err_e err;
492
493 /* Don't attempt to use thread_db on targets which can not run
494 (core files). */
495 if (objfile == NULL || !target_has_execution)
496 {
497 /* All symbols have been discarded. If the thread_db target is
498 active, deactivate it now. */
499 if (using_thread_db)
500 {
501 gdb_assert (proc_handle.pid == 0);
502 unpush_target (&thread_db_ops);
503 using_thread_db = 0;
504 }
505
506 keep_thread_db = 0;
507
508 goto quit;
509 }
510
511 if (using_thread_db)
512 /* Nothing to do. The thread library was already detected and the
513 target vector was already activated. */
514 goto quit;
515
516 /* Initialize the structure that identifies the child process. Note
517 that at this point there is no guarantee that we actually have a
518 child process. */
519 proc_handle.pid = GET_PID (inferior_ptid);
520
521 /* Now attempt to open a connection to the thread library. */
522 err = td_ta_new_p (&proc_handle, &thread_agent);
523 switch (err)
524 {
525 case TD_NOLIBTHREAD:
526 /* No thread library was detected. */
527 break;
528
529 case TD_OK:
530 /* The thread library was detected. Activate the thread_db target. */
531 push_target (&thread_db_ops);
532 using_thread_db = 1;
533
534 /* If the thread library was detected in the main symbol file
535 itself, we assume that the program was statically linked
536 against the thread library and well have to keep this
537 module's target vector activated until forever... Well, at
538 least until all symbols have been discarded anyway (see
539 above). */
540 if (objfile == symfile_objfile)
541 {
542 gdb_assert (proc_handle.pid == 0);
543 keep_thread_db = 1;
544 }
545
546 /* We can only poke around if there actually is a child process.
547 If there is no child process alive, postpone the steps below
548 until one has been created. */
549 if (proc_handle.pid != 0)
550 {
551 enable_thread_event_reporting ();
552 thread_db_find_new_threads ();
553 }
554 break;
555
556 default:
557 warning ("Cannot initialize thread debugging library: %s",
558 thread_db_err_str (err));
559 break;
560 }
561
562 quit:
563 if (target_new_objfile_chain)
564 target_new_objfile_chain (objfile);
565 }
566
567 static void
568 attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
569 const td_thrinfo_t *ti_p, int verbose)
570 {
571 struct thread_info *tp;
572 td_err_e err;
573
574 check_thread_signals ();
575
576 if (verbose)
577 printf_unfiltered ("[New %s]\n", target_pid_to_str (ptid));
578
579 /* Add the thread to GDB's thread list. */
580 tp = add_thread (ptid);
581 tp->private = xmalloc (sizeof (struct private_thread_info));
582 tp->private->lwpid = ti_p->ti_lid;
583
584 if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
585 return; /* A zombie thread -- do not attach. */
586
587 /* Under GNU/Linux, we have to attach to each and every thread. */
588 #ifdef ATTACH_LWP
589 ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
590 #endif
591
592 /* Enable thread event reporting for this thread. */
593 err = td_thr_event_enable_p (th_p, 1);
594 if (err != TD_OK)
595 error ("Cannot enable thread event reporting for %s: %s",
596 target_pid_to_str (ptid), thread_db_err_str (err));
597 }
598
599 static void
600 thread_db_attach (char *args, int from_tty)
601 {
602 target_beneath->to_attach (args, from_tty);
603
604 /* Destroy thread info; it's no longer valid. */
605 init_thread_list ();
606
607 /* The child process is now the actual multi-threaded
608 program. Snatch its process ID... */
609 proc_handle.pid = GET_PID (inferior_ptid);
610
611 /* ...and perform the remaining initialization steps. */
612 enable_thread_event_reporting ();
613 thread_db_find_new_threads();
614 }
615
616 static void
617 detach_thread (ptid_t ptid, int verbose)
618 {
619 if (verbose)
620 printf_unfiltered ("[%s exited]\n", target_pid_to_str (ptid));
621 }
622
623 static void
624 thread_db_detach (char *args, int from_tty)
625 {
626 disable_thread_event_reporting ();
627
628 /* There's no need to save & restore inferior_ptid here, since the
629 inferior is supposed to be survive this function call. */
630 inferior_ptid = lwp_from_thread (inferior_ptid);
631
632 /* Forget about the child's process ID. We shouldn't need it
633 anymore. */
634 proc_handle.pid = 0;
635
636 target_beneath->to_detach (args, from_tty);
637 }
638
639 static void
640 thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
641 {
642 struct cleanup *old_chain = save_inferior_ptid ();
643
644 if (GET_PID (ptid) == -1)
645 inferior_ptid = lwp_from_thread (inferior_ptid);
646 else if (is_thread (ptid))
647 ptid = lwp_from_thread (ptid);
648
649 target_beneath->to_resume (ptid, step, signo);
650
651 do_cleanups (old_chain);
652 }
653
654 /* Check if PID is currently stopped at the location of a thread event
655 breakpoint location. If it is, read the event message and act upon
656 the event. */
657
658 static void
659 check_event (ptid_t ptid)
660 {
661 td_event_msg_t msg;
662 td_thrinfo_t ti;
663 td_err_e err;
664 CORE_ADDR stop_pc;
665
666 /* Bail out early if we're not at a thread event breakpoint. */
667 stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
668 if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
669 return;
670
671 err = td_ta_event_getmsg_p (thread_agent, &msg);
672 if (err != TD_OK)
673 {
674 if (err == TD_NOMSG)
675 return;
676
677 error ("Cannot get thread event message: %s", thread_db_err_str (err));
678 }
679
680 err = td_thr_get_info_p (msg.th_p, &ti);
681 if (err != TD_OK)
682 error ("Cannot get thread info: %s", thread_db_err_str (err));
683
684 ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
685
686 switch (msg.event)
687 {
688 case TD_CREATE:
689 #if 0
690 /* FIXME: kettenis/2000-08-26: Since we use td_ta_event_getmsg,
691 there is no guarantee that the breakpoint will match the
692 event. Should we use td_thr_event_getmsg instead? */
693
694 if (stop_pc != td_create_bp_addr)
695 error ("Thread creation event doesn't match breakpoint.");
696 #endif
697
698 /* We may already know about this thread, for instance when the
699 user has issued the `info threads' command before the SIGTRAP
700 for hitting the thread creation breakpoint was reported. */
701 if (!in_thread_list (ptid))
702 attach_thread (ptid, msg.th_p, &ti, 1);
703 return;
704
705 case TD_DEATH:
706 #if 0
707 /* FIXME: See TD_CREATE. */
708
709 if (stop_pc != td_death_bp_addr)
710 error ("Thread death event doesn't match breakpoint.");
711 #endif
712
713 if (!in_thread_list (ptid))
714 error ("Spurious thread death event.");
715
716 detach_thread (ptid, 1);
717 return;
718
719 default:
720 error ("Spurious thread event.");
721 }
722 }
723
724 static ptid_t
725 thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
726 {
727 extern ptid_t trap_ptid;
728
729 if (GET_PID (ptid) != -1 && is_thread (ptid))
730 ptid = lwp_from_thread (ptid);
731
732 ptid = target_beneath->to_wait (ptid, ourstatus);
733
734 if (proc_handle.pid == 0)
735 /* The current child process isn't the actual multi-threaded
736 program yet, so don't try to do any special thread-specific
737 post-processing and bail out early. */
738 return ptid;
739
740 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
741 return pid_to_ptid (-1);
742
743 if (ourstatus->kind == TARGET_WAITKIND_STOPPED
744 && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
745 /* Check for a thread event. */
746 check_event (ptid);
747
748 if (!ptid_equal (trap_ptid, null_ptid))
749 trap_ptid = thread_from_lwp (trap_ptid);
750
751 return thread_from_lwp (ptid);
752 }
753
754 static int
755 thread_db_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
756 struct mem_attrib *attrib,
757 struct target_ops *target)
758 {
759 struct cleanup *old_chain = save_inferior_ptid ();
760 int xfer;
761
762 if (is_thread (inferior_ptid))
763 {
764 /* FIXME: This seems to be necessary to make sure breakpoints
765 are removed. */
766 if (!target_thread_alive (inferior_ptid))
767 inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
768 else
769 inferior_ptid = lwp_from_thread (inferior_ptid);
770 }
771
772 xfer = target_beneath->to_xfer_memory (memaddr, myaddr, len, write, attrib, target);
773
774 do_cleanups (old_chain);
775 return xfer;
776 }
777
778 static void
779 thread_db_fetch_registers (int regno)
780 {
781 td_thrhandle_t th;
782 prgregset_t gregset;
783 gdb_prfpregset_t fpregset;
784 td_err_e err;
785
786 if (!is_thread (inferior_ptid))
787 {
788 /* Pass the request to the target beneath us. */
789 target_beneath->to_fetch_registers (regno);
790 return;
791 }
792
793 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (inferior_ptid), &th);
794 if (err != TD_OK)
795 error ("Cannot find thread %ld: %s",
796 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
797
798 err = td_thr_getgregs_p (&th, gregset);
799 if (err != TD_OK)
800 error ("Cannot fetch general-purpose registers for thread %ld: %s",
801 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
802
803 err = td_thr_getfpregs_p (&th, &fpregset);
804 if (err != TD_OK)
805 error ("Cannot get floating-point registers for thread %ld: %s",
806 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
807
808 /* Note that we must call supply_gregset after calling the thread_db
809 routines because the thread_db routines call ps_lgetgregs and
810 friends which clobber GDB's register cache. */
811 supply_gregset ((gdb_gregset_t *) gregset);
812 supply_fpregset (&fpregset);
813 }
814
815 static void
816 thread_db_store_registers (int regno)
817 {
818 td_thrhandle_t th;
819 prgregset_t gregset;
820 gdb_prfpregset_t fpregset;
821 td_err_e err;
822
823 if (!is_thread (inferior_ptid))
824 {
825 /* Pass the request to the target beneath us. */
826 target_beneath->to_store_registers (regno);
827 return;
828 }
829
830 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (inferior_ptid), &th);
831 if (err != TD_OK)
832 error ("Cannot find thread %ld: %s",
833 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
834
835 if (regno != -1)
836 {
837 char raw[MAX_REGISTER_RAW_SIZE];
838
839 deprecated_read_register_gen (regno, raw);
840 thread_db_fetch_registers (-1);
841 supply_register (regno, raw);
842 }
843
844 fill_gregset ((gdb_gregset_t *) gregset, -1);
845 fill_fpregset (&fpregset, -1);
846
847 err = td_thr_setgregs_p (&th, gregset);
848 if (err != TD_OK)
849 error ("Cannot store general-purpose registers for thread %ld: %s",
850 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
851 err = td_thr_setfpregs_p (&th, &fpregset);
852 if (err != TD_OK)
853 error ("Cannot store floating-point registers for thread %ld: %s",
854 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
855 }
856
857 static void
858 thread_db_kill (void)
859 {
860 /* There's no need to save & restore inferior_ptid here, since the
861 inferior isn't supposed to survive this function call. */
862 inferior_ptid = lwp_from_thread (inferior_ptid);
863 target_beneath->to_kill ();
864 }
865
866 static void
867 thread_db_create_inferior (char *exec_file, char *allargs, char **env)
868 {
869 if (!keep_thread_db)
870 {
871 unpush_target (&thread_db_ops);
872 using_thread_db = 0;
873 }
874
875 target_beneath->to_create_inferior (exec_file, allargs, env);
876 }
877
878 static void
879 thread_db_post_startup_inferior (ptid_t ptid)
880 {
881 if (proc_handle.pid == 0)
882 {
883 /* The child process is now the actual multi-threaded
884 program. Snatch its process ID... */
885 proc_handle.pid = GET_PID (ptid);
886
887 /* ...and perform the remaining initialization steps. */
888 enable_thread_event_reporting ();
889 thread_db_find_new_threads ();
890 }
891 }
892
893 static void
894 thread_db_mourn_inferior (void)
895 {
896 remove_thread_event_breakpoints ();
897
898 /* Forget about the child's process ID. We shouldn't need it
899 anymore. */
900 proc_handle.pid = 0;
901
902 target_beneath->to_mourn_inferior ();
903 }
904
905 static int
906 thread_db_thread_alive (ptid_t ptid)
907 {
908 td_thrhandle_t th;
909 td_thrinfo_t ti;
910 td_err_e err;
911
912 if (is_thread (ptid))
913 {
914 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
915 if (err != TD_OK)
916 return 0;
917
918 err = td_thr_validate_p (&th);
919 if (err != TD_OK)
920 return 0;
921
922 err = td_thr_get_info_p (&th, &ti);
923 if (err != TD_OK)
924 return 0;
925
926 if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
927 return 0; /* A zombie thread. */
928
929 return 1;
930 }
931
932 if (target_beneath->to_thread_alive)
933 return target_beneath->to_thread_alive (ptid);
934
935 return 0;
936 }
937
938 static int
939 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
940 {
941 td_thrinfo_t ti;
942 td_err_e err;
943 ptid_t ptid;
944
945 err = td_thr_get_info_p (th_p, &ti);
946 if (err != TD_OK)
947 error ("Cannot get thread info: %s", thread_db_err_str (err));
948
949 if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
950 return 0; /* A zombie -- ignore. */
951
952 ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
953
954 if (!in_thread_list (ptid))
955 attach_thread (ptid, th_p, &ti, 1);
956
957 return 0;
958 }
959
960 static void
961 thread_db_find_new_threads (void)
962 {
963 td_err_e err;
964
965 /* Iterate over all user-space threads to discover new threads. */
966 err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
967 TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
968 TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
969 if (err != TD_OK)
970 error ("Cannot find new threads: %s", thread_db_err_str (err));
971 }
972
973 static char *
974 thread_db_pid_to_str (ptid_t ptid)
975 {
976 if (is_thread (ptid))
977 {
978 static char buf[64];
979 td_thrhandle_t th;
980 td_thrinfo_t ti;
981 td_err_e err;
982
983 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
984 if (err != TD_OK)
985 error ("Cannot find thread %ld: %s",
986 (long) GET_THREAD (ptid), thread_db_err_str (err));
987
988 err = td_thr_get_info_p (&th, &ti);
989 if (err != TD_OK)
990 error ("Cannot get thread info for thread %ld: %s",
991 (long) GET_THREAD (ptid), thread_db_err_str (err));
992
993 if (ti.ti_state == TD_THR_ACTIVE && ti.ti_lid != 0)
994 {
995 snprintf (buf, sizeof (buf), "Thread %ld (LWP %d)",
996 (long) ti.ti_tid, ti.ti_lid);
997 }
998 else
999 {
1000 snprintf (buf, sizeof (buf), "Thread %ld (%s)",
1001 (long) ti.ti_tid, thread_db_state_str (ti.ti_state));
1002 }
1003
1004 return buf;
1005 }
1006
1007 if (target_beneath->to_pid_to_str (ptid))
1008 return target_beneath->to_pid_to_str (ptid);
1009
1010 return normal_pid_to_str (ptid);
1011 }
1012
1013 /* Get the address of the thread local variable in OBJFILE which is
1014 stored at OFFSET within the thread local storage for thread PTID. */
1015
1016 static CORE_ADDR
1017 thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
1018 CORE_ADDR offset)
1019 {
1020 if (is_thread (ptid))
1021 {
1022 int objfile_is_library = (objfile->flags & OBJF_SHARED);
1023 td_err_e err;
1024 td_thrhandle_t th;
1025 void *address;
1026 CORE_ADDR lm;
1027
1028 /* glibc doesn't provide the needed interface. */
1029 if (! td_thr_tls_get_addr_p)
1030 error ("Cannot find thread-local variables in this thread library.");
1031
1032 /* Get the address of the link map for this objfile. */
1033 lm = svr4_fetch_objfile_link_map (objfile);
1034
1035 /* Whoops, we couldn't find one. Bail out. */
1036 if (!lm)
1037 {
1038 if (objfile_is_library)
1039 error ("Cannot find shared library `%s' link_map in dynamic"
1040 " linker's module list", objfile->name);
1041 else
1042 error ("Cannot find executable file `%s' link_map in dynamic"
1043 " linker's module list", objfile->name);
1044 }
1045
1046 /* Get info about the thread. */
1047 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
1048 if (err != TD_OK)
1049 error ("Cannot find thread %ld: %s",
1050 (long) GET_THREAD (ptid), thread_db_err_str (err));
1051
1052 /* Finally, get the address of the variable. */
1053 err = td_thr_tls_get_addr_p (&th, (void *) lm, offset, &address);
1054
1055 #ifdef THREAD_DB_HAS_TD_NOTALLOC
1056 /* The memory hasn't been allocated, yet. */
1057 if (err == TD_NOTALLOC)
1058 {
1059 /* Now, if libthread_db provided the initialization image's
1060 address, we *could* try to build a non-lvalue value from
1061 the initialization image. */
1062 if (objfile_is_library)
1063 error ("The inferior has not yet allocated storage for"
1064 " thread-local variables in\n"
1065 "the shared library `%s'\n"
1066 "for the thread %ld",
1067 objfile->name, (long) GET_THREAD (ptid));
1068 else
1069 error ("The inferior has not yet allocated storage for"
1070 " thread-local variables in\n"
1071 "the executable `%s'\n"
1072 "for the thread %ld",
1073 objfile->name, (long) GET_THREAD (ptid));
1074 }
1075 #endif
1076
1077 /* Something else went wrong. */
1078 if (err != TD_OK)
1079 {
1080 if (objfile_is_library)
1081 error ("Cannot find thread-local storage for thread %ld, "
1082 "shared library %s:\n%s",
1083 (long) GET_THREAD (ptid),
1084 objfile->name,
1085 thread_db_err_str (err));
1086 else
1087 error ("Cannot find thread-local storage for thread %ld, "
1088 "executable file %s:\n%s",
1089 (long) GET_THREAD (ptid),
1090 objfile->name,
1091 thread_db_err_str (err));
1092 }
1093
1094 /* Cast assuming host == target. Joy. */
1095 return (CORE_ADDR) address;
1096 }
1097
1098 if (target_beneath->to_get_thread_local_address)
1099 return target_beneath->to_get_thread_local_address (ptid, objfile, offset);
1100
1101 error ("Cannot find thread-local values on this target.");
1102 }
1103
1104 static void
1105 init_thread_db_ops (void)
1106 {
1107 thread_db_ops.to_shortname = "multi-thread";
1108 thread_db_ops.to_longname = "multi-threaded child process.";
1109 thread_db_ops.to_doc = "Threads and pthreads support.";
1110 thread_db_ops.to_attach = thread_db_attach;
1111 thread_db_ops.to_detach = thread_db_detach;
1112 thread_db_ops.to_resume = thread_db_resume;
1113 thread_db_ops.to_wait = thread_db_wait;
1114 thread_db_ops.to_fetch_registers = thread_db_fetch_registers;
1115 thread_db_ops.to_store_registers = thread_db_store_registers;
1116 thread_db_ops.to_xfer_memory = thread_db_xfer_memory;
1117 thread_db_ops.to_kill = thread_db_kill;
1118 thread_db_ops.to_create_inferior = thread_db_create_inferior;
1119 thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;
1120 thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
1121 thread_db_ops.to_thread_alive = thread_db_thread_alive;
1122 thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
1123 thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
1124 thread_db_ops.to_stratum = thread_stratum;
1125 thread_db_ops.to_has_thread_control = tc_schedlock;
1126 thread_db_ops.to_get_thread_local_address
1127 = thread_db_get_thread_local_address;
1128 thread_db_ops.to_magic = OPS_MAGIC;
1129 }
1130
1131 void
1132 _initialize_thread_db (void)
1133 {
1134 /* Only initialize the module if we can load libthread_db. */
1135 if (thread_db_load ())
1136 {
1137 init_thread_db_ops ();
1138 add_target (&thread_db_ops);
1139
1140 /* Add ourselves to objfile event chain. */
1141 target_new_objfile_chain = target_new_objfile_hook;
1142 target_new_objfile_hook = thread_db_new_objfile;
1143 }
1144 }