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