sol-thread.c: Remove commented-out code.
[external/binutils.git] / gdb / sol-thread.c
1 /* Solaris threads debugging interface.
2
3    Copyright (C) 1996-2005, 2007-2012 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 /* This module implements a sort of half target that sits between the
21    machine-independent parts of GDB and the /proc interface (procfs.c)
22    to provide access to the Solaris user-mode thread implementation.
23
24    Solaris threads are true user-mode threads, which are invoked via
25    the thr_* and pthread_* (native and POSIX respectivly) interfaces.
26    These are mostly implemented in user-space, with all thread context
27    kept in various structures that live in the user's heap.  These
28    should not be confused with lightweight processes (LWPs), which are
29    implemented by the kernel, and scheduled without explicit
30    intervention by the process.
31
32    Just to confuse things a little, Solaris threads (both native and
33    POSIX) are actually implemented using LWPs.  In general, there are
34    going to be more threads than LWPs.  There is no fixed
35    correspondence between a thread and an LWP.  When a thread wants to
36    run, it gets scheduled onto the first available LWP and can
37    therefore migrate from one LWP to another as time goes on.  A
38    sleeping thread may not be associated with an LWP at all!
39
40    To make it possible to mess with threads, Sun provides a library
41    called libthread_db.so.1 (not to be confused with
42    libthread_db.so.0, which doesn't have a published interface).  This
43    interface has an upper part, which it provides, and a lower part
44    which we provide.  The upper part consists of the td_* routines,
45    which allow us to find all the threads, query their state, etc...
46    The lower part consists of all of the ps_*, which are used by the
47    td_* routines to read/write memory, manipulate LWPs, lookup
48    symbols, etc...  The ps_* routines actually do most of their work
49    by calling functions in procfs.c.  */
50
51 #include "defs.h"
52 #include <thread.h>
53 #include <proc_service.h>
54 #include <thread_db.h>
55 #include "gdbthread.h"
56 #include "target.h"
57 #include "inferior.h"
58 #include <fcntl.h>
59 #include "gdb_stat.h"
60 #include <dlfcn.h>
61 #include "gdbcmd.h"
62 #include "gdbcore.h"
63 #include "regcache.h"
64 #include "solib.h"
65 #include "symfile.h"
66 #include "observer.h"
67 #include "gdb_string.h"
68 #include "procfs.h"
69
70 struct target_ops sol_thread_ops;
71
72 /* Prototypes for supply_gregset etc.  */
73 #include "gregset.h"
74
75 /* This struct is defined by us, but mainly used for the proc_service
76    interface.  We don't have much use for it, except as a handy place
77    to get a real PID for memory accesses.  */
78
79 struct ps_prochandle
80 {
81   ptid_t ptid;
82 };
83
84 struct string_map
85 {
86   int num;
87   char *str;
88 };
89
90 static struct ps_prochandle main_ph;
91 static td_thragent_t *main_ta;
92 static int sol_thread_active = 0;
93
94 static void init_sol_thread_ops (void);
95
96 /* Default definitions: These must be defined in tm.h if they are to
97    be shared with a process module such as procfs.  */
98
99 #define GET_PID(ptid)           ptid_get_pid (ptid)
100 #define GET_LWP(ptid)           ptid_get_lwp (ptid)
101 #define GET_THREAD(ptid)        ptid_get_tid (ptid)
102
103 #define is_lwp(ptid)            (GET_LWP (ptid) != 0)
104 #define is_thread(ptid)         (GET_THREAD (ptid) != 0)
105
106 #define BUILD_LWP(lwp, pid)     ptid_build (pid, lwp, 0)
107 #define BUILD_THREAD(tid, pid)  ptid_build (pid, 0, tid)
108
109 /* Pointers to routines from libthread_db resolved by dlopen().  */
110
111 static void (*p_td_log)(const int on_off);
112 static td_err_e (*p_td_ta_new)(const struct ps_prochandle *ph_p,
113                                td_thragent_t **ta_pp);
114 static td_err_e (*p_td_ta_delete)(td_thragent_t *ta_p);
115 static td_err_e (*p_td_init)(void);
116 static td_err_e (*p_td_ta_get_ph)(const td_thragent_t *ta_p,
117                                   struct ps_prochandle **ph_pp);
118 static td_err_e (*p_td_ta_get_nthreads)(const td_thragent_t *ta_p,
119                                         int *nthread_p);
120 static td_err_e (*p_td_ta_tsd_iter)(const td_thragent_t *ta_p,
121                                     td_key_iter_f *cb, void *cbdata_p);
122 static td_err_e (*p_td_ta_thr_iter)(const td_thragent_t *ta_p,
123                                     td_thr_iter_f *cb, void *cbdata_p,
124                                     td_thr_state_e state, int ti_pri,
125                                     sigset_t *ti_sigmask_p,
126                                     unsigned ti_user_flags);
127 static td_err_e (*p_td_thr_validate)(const td_thrhandle_t *th_p);
128 static td_err_e (*p_td_thr_tsd)(const td_thrhandle_t * th_p,
129                                 const thread_key_t key, void **data_pp);
130 static td_err_e (*p_td_thr_get_info)(const td_thrhandle_t *th_p,
131                                      td_thrinfo_t *ti_p);
132 static td_err_e (*p_td_thr_getfpregs)(const td_thrhandle_t *th_p,
133                                       prfpregset_t *fpregset);
134 static td_err_e (*p_td_thr_getxregsize)(const td_thrhandle_t *th_p,
135                                         int *xregsize);
136 static td_err_e (*p_td_thr_getxregs)(const td_thrhandle_t *th_p,
137                                      const caddr_t xregset);
138 static td_err_e (*p_td_thr_sigsetmask)(const td_thrhandle_t *th_p,
139                                        const sigset_t ti_sigmask);
140 static td_err_e (*p_td_thr_setprio)(const td_thrhandle_t *th_p,
141                                     const int ti_pri);
142 static td_err_e (*p_td_thr_setsigpending)(const td_thrhandle_t *th_p,
143                                           const uchar_t ti_pending_flag,
144                                           const sigset_t ti_pending);
145 static td_err_e (*p_td_thr_setfpregs)(const td_thrhandle_t *th_p,
146                                       const prfpregset_t *fpregset);
147 static td_err_e (*p_td_thr_setxregs)(const td_thrhandle_t *th_p,
148                                      const caddr_t xregset);
149 static td_err_e (*p_td_ta_map_id2thr)(const td_thragent_t *ta_p,
150                                       thread_t tid,
151                                       td_thrhandle_t *th_p);
152 static td_err_e (*p_td_ta_map_lwp2thr)(const td_thragent_t *ta_p,
153                                        lwpid_t lwpid,
154                                        td_thrhandle_t *th_p);
155 static td_err_e (*p_td_thr_getgregs)(const td_thrhandle_t *th_p,
156                                      prgregset_t regset);
157 static td_err_e (*p_td_thr_setgregs)(const td_thrhandle_t *th_p,
158                                      const prgregset_t regset);
159 \f
160
161 /* Return the libthread_db error string associated with ERRCODE.  If
162    ERRCODE is unknown, return an appropriate message.  */
163
164 static char *
165 td_err_string (td_err_e errcode)
166 {
167   static struct string_map td_err_table[] =
168   {
169     { TD_OK, "generic \"call succeeded\"" },
170     { TD_ERR, "generic error." },
171     { TD_NOTHR, "no thread can be found to satisfy query" },
172     { TD_NOSV, "no synch. variable can be found to satisfy query" },
173     { TD_NOLWP, "no lwp can be found to satisfy query" },
174     { TD_BADPH, "invalid process handle" },
175     { TD_BADTH, "invalid thread handle" },
176     { TD_BADSH, "invalid synchronization handle" },
177     { TD_BADTA, "invalid thread agent" },
178     { TD_BADKEY, "invalid key" },
179     { TD_NOMSG, "td_thr_event_getmsg() called when there was no message" },
180     { TD_NOFPREGS, "FPU register set not available for given thread" },
181     { TD_NOLIBTHREAD, "application not linked with libthread" },
182     { TD_NOEVENT, "requested event is not supported" },
183     { TD_NOCAPAB, "capability not available" },
184     { TD_DBERR, "Debugger service failed" },
185     { TD_NOAPLIC, "Operation not applicable to" },
186     { TD_NOTSD, "No thread specific data for this thread" },
187     { TD_MALLOC, "Malloc failed" },
188     { TD_PARTIALREG, "Only part of register set was written/read" },
189     { TD_NOXREGS, "X register set not available for given thread" }
190   };
191   const int td_err_size = sizeof td_err_table / sizeof (struct string_map);
192   int i;
193   static char buf[50];
194
195   for (i = 0; i < td_err_size; i++)
196     if (td_err_table[i].num == errcode)
197       return td_err_table[i].str;
198
199   sprintf (buf, "Unknown libthread_db error code: %d", errcode);
200
201   return buf;
202 }
203
204 /* Return the libthread_db state string assicoated with STATECODE.
205    If STATECODE is unknown, return an appropriate message.  */
206
207 static char *
208 td_state_string (td_thr_state_e statecode)
209 {
210   static struct string_map td_thr_state_table[] =
211   {
212     { TD_THR_ANY_STATE, "any state" },
213     { TD_THR_UNKNOWN, "unknown" },
214     { TD_THR_STOPPED, "stopped" },
215     { TD_THR_RUN, "run" },
216     { TD_THR_ACTIVE, "active" },
217     { TD_THR_ZOMBIE, "zombie" },
218     { TD_THR_SLEEP, "sleep" },
219     { TD_THR_STOPPED_ASLEEP, "stopped asleep" }
220   };
221   const int td_thr_state_table_size =
222     sizeof td_thr_state_table / sizeof (struct string_map);
223   int i;
224   static char buf[50];
225
226   for (i = 0; i < td_thr_state_table_size; i++)
227     if (td_thr_state_table[i].num == statecode)
228       return td_thr_state_table[i].str;
229
230   sprintf (buf, "Unknown libthread_db state code: %d", statecode);
231
232   return buf;
233 }
234 \f
235
236 /* Convert a POSIX or Solaris thread ID into a LWP ID.  If THREAD_ID
237    doesn't exist, that's an error.  If it's an inactive thread, return
238    DEFAULT_LWP.
239
240    NOTE: This function probably shouldn't call error().  */
241
242 static ptid_t
243 thread_to_lwp (ptid_t thread_id, int default_lwp)
244 {
245   td_thrinfo_t ti;
246   td_thrhandle_t th;
247   td_err_e val;
248
249   if (is_lwp (thread_id))
250     return thread_id;           /* It's already an LWP ID.  */
251
252   /* It's a thread.  Convert to LWP.  */
253
254   val = p_td_ta_map_id2thr (main_ta, GET_THREAD (thread_id), &th);
255   if (val == TD_NOTHR)
256     return pid_to_ptid (-1);    /* Thread must have terminated.  */
257   else if (val != TD_OK)
258     error (_("thread_to_lwp: td_ta_map_id2thr %s"), td_err_string (val));
259
260   val = p_td_thr_get_info (&th, &ti);
261   if (val == TD_NOTHR)
262     return pid_to_ptid (-1);    /* Thread must have terminated.  */
263   else if (val != TD_OK)
264     error (_("thread_to_lwp: td_thr_get_info: %s"), td_err_string (val));
265
266   if (ti.ti_state != TD_THR_ACTIVE)
267     {
268       if (default_lwp != -1)
269         return pid_to_ptid (default_lwp);
270       error (_("thread_to_lwp: thread state not active: %s"),
271              td_state_string (ti.ti_state));
272     }
273
274   return BUILD_LWP (ti.ti_lid, PIDGET (thread_id));
275 }
276
277 /* Convert an LWP ID into a POSIX or Solaris thread ID.  If LWP_ID
278    doesn't exists, that's an error.
279
280    NOTE: This function probably shouldn't call error().  */
281
282 static ptid_t
283 lwp_to_thread (ptid_t lwp)
284 {
285   td_thrinfo_t ti;
286   td_thrhandle_t th;
287   td_err_e val;
288
289   if (is_thread (lwp))
290     return lwp;                 /* It's already a thread ID.  */
291
292   /* It's an LWP.  Convert it to a thread ID.  */
293
294   if (!target_thread_alive (lwp))
295     return pid_to_ptid (-1);    /* Must be a defunct LPW.  */
296
297   val = p_td_ta_map_lwp2thr (main_ta, GET_LWP (lwp), &th);
298   if (val == TD_NOTHR)
299     return pid_to_ptid (-1);    /* Thread must have terminated.  */
300   else if (val != TD_OK)
301     error (_("lwp_to_thread: td_ta_map_lwp2thr: %s."), td_err_string (val));
302
303   val = p_td_thr_validate (&th);
304   if (val == TD_NOTHR)
305     return lwp;                 /* Unknown to libthread; just return LPW,  */
306   else if (val != TD_OK)
307     error (_("lwp_to_thread: td_thr_validate: %s."), td_err_string (val));
308
309   val = p_td_thr_get_info (&th, &ti);
310   if (val == TD_NOTHR)
311     return pid_to_ptid (-1);    /* Thread must have terminated.  */
312   else if (val != TD_OK)
313     error (_("lwp_to_thread: td_thr_get_info: %s."), td_err_string (val));
314
315   return BUILD_THREAD (ti.ti_tid, PIDGET (lwp));
316 }
317 \f
318
319 /* Most target vector functions from here on actually just pass
320    through to the layer beneath, as they don't need to do anything
321    specific for threads.  */
322
323 /* Take a program previously attached to and detaches it.  The program
324    resumes execution and will no longer stop on signals, etc.  We'd
325    better not have left any breakpoints in the program or it'll die
326    when it hits one.  For this to work, it may be necessary for the
327    process to have been previously attached.  It *might* work if the
328    program was started via the normal ptrace (PTRACE_TRACEME).  */
329
330 static void
331 sol_thread_detach (struct target_ops *ops, char *args, int from_tty)
332 {
333   struct target_ops *beneath = find_target_beneath (ops);
334
335   sol_thread_active = 0;
336   inferior_ptid = pid_to_ptid (PIDGET (main_ph.ptid));
337   unpush_target (ops);
338   beneath->to_detach (beneath, args, from_tty);
339 }
340
341 /* Resume execution of process PTID.  If STEP is nozero, then just
342    single step it.  If SIGNAL is nonzero, restart it with that signal
343    activated.  We may have to convert PTID from a thread ID to an LWP
344    ID for procfs.  */
345
346 static void
347 sol_thread_resume (struct target_ops *ops,
348                    ptid_t ptid, int step, enum gdb_signal signo)
349 {
350   struct cleanup *old_chain;
351   struct target_ops *beneath = find_target_beneath (ops);
352
353   old_chain = save_inferior_ptid ();
354
355   inferior_ptid = thread_to_lwp (inferior_ptid, PIDGET (main_ph.ptid));
356   if (PIDGET (inferior_ptid) == -1)
357     inferior_ptid = procfs_first_available ();
358
359   if (PIDGET (ptid) != -1)
360     {
361       ptid_t save_ptid = ptid;
362
363       ptid = thread_to_lwp (ptid, -2);
364       if (PIDGET (ptid) == -2)          /* Inactive thread.  */
365         error (_("This version of Solaris can't start inactive threads."));
366       if (info_verbose && PIDGET (ptid) == -1)
367         warning (_("Specified thread %ld seems to have terminated"),
368                  GET_THREAD (save_ptid));
369     }
370
371   beneath->to_resume (beneath, ptid, step, signo);
372
373   do_cleanups (old_chain);
374 }
375
376 /* Wait for any threads to stop.  We may have to convert PTID from a
377    thread ID to an LWP ID, and vice versa on the way out.  */
378
379 static ptid_t
380 sol_thread_wait (struct target_ops *ops,
381                  ptid_t ptid, struct target_waitstatus *ourstatus, int options)
382 {
383   ptid_t rtnval;
384   ptid_t save_ptid;
385   struct target_ops *beneath = find_target_beneath (ops);
386   struct cleanup *old_chain;
387
388   save_ptid = inferior_ptid;
389   old_chain = save_inferior_ptid ();
390
391   inferior_ptid = thread_to_lwp (inferior_ptid, PIDGET (main_ph.ptid));
392   if (PIDGET (inferior_ptid) == -1)
393     inferior_ptid = procfs_first_available ();
394
395   if (PIDGET (ptid) != -1)
396     {
397       ptid_t save_ptid = ptid;
398
399       ptid = thread_to_lwp (ptid, -2);
400       if (PIDGET (ptid) == -2)          /* Inactive thread.  */
401         error (_("This version of Solaris can't start inactive threads."));
402       if (info_verbose && PIDGET (ptid) == -1)
403         warning (_("Specified thread %ld seems to have terminated"),
404                  GET_THREAD (save_ptid));
405     }
406
407   rtnval = beneath->to_wait (beneath, ptid, ourstatus, options);
408
409   if (ourstatus->kind != TARGET_WAITKIND_EXITED)
410     {
411       /* Map the LWP of interest back to the appropriate thread ID.  */
412       rtnval = lwp_to_thread (rtnval);
413       if (PIDGET (rtnval) == -1)
414         rtnval = save_ptid;
415
416       /* See if we have a new thread.  */
417       if (is_thread (rtnval)
418           && !ptid_equal (rtnval, save_ptid)
419           && (!in_thread_list (rtnval)
420               || is_exited (rtnval)))
421         add_thread (rtnval);
422     }
423
424   /* During process initialization, we may get here without the thread
425      package being initialized, since that can only happen after we've
426      found the shared libs.  */
427
428   do_cleanups (old_chain);
429
430   return rtnval;
431 }
432
433 static void
434 sol_thread_fetch_registers (struct target_ops *ops,
435                             struct regcache *regcache, int regnum)
436 {
437   thread_t thread;
438   td_thrhandle_t thandle;
439   td_err_e val;
440   prgregset_t gregset;
441   prfpregset_t fpregset;
442   gdb_gregset_t *gregset_p = &gregset;
443   gdb_fpregset_t *fpregset_p = &fpregset;
444   struct target_ops *beneath = find_target_beneath (ops);
445
446   if (!is_thread (inferior_ptid))
447     {
448       /* It's an LWP; pass the request on to the layer beneath.  */
449       beneath->to_fetch_registers (beneath, regcache, regnum);
450       return;
451     }
452
453   /* Solaris thread: convert INFERIOR_PTID into a td_thrhandle_t.  */
454   thread = GET_THREAD (inferior_ptid);
455   if (thread == 0)
456     error (_("sol_thread_fetch_registers: thread == 0"));
457
458   val = p_td_ta_map_id2thr (main_ta, thread, &thandle);
459   if (val != TD_OK)
460     error (_("sol_thread_fetch_registers: td_ta_map_id2thr: %s"),
461            td_err_string (val));
462
463   /* Get the general-purpose registers.  */
464
465   val = p_td_thr_getgregs (&thandle, gregset);
466   if (val != TD_OK && val != TD_PARTIALREG)
467     error (_("sol_thread_fetch_registers: td_thr_getgregs %s"),
468            td_err_string (val));
469
470   /* For SPARC, TD_PARTIALREG means that only %i0...%i7, %l0..%l7, %pc
471      and %sp are saved (by a thread context switch).  */
472
473   /* And, now the floating-point registers.  */
474
475   val = p_td_thr_getfpregs (&thandle, &fpregset);
476   if (val != TD_OK && val != TD_NOFPREGS)
477     error (_("sol_thread_fetch_registers: td_thr_getfpregs %s"),
478            td_err_string (val));
479
480   /* Note that we must call supply_gregset and supply_fpregset *after*
481      calling the td routines because the td routines call ps_lget*
482      which affect the values stored in the registers array.  */
483
484   supply_gregset (regcache, (const gdb_gregset_t *) gregset_p);
485   supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset_p);
486 }
487
488 static void
489 sol_thread_store_registers (struct target_ops *ops,
490                             struct regcache *regcache, int regnum)
491 {
492   thread_t thread;
493   td_thrhandle_t thandle;
494   td_err_e val;
495   prgregset_t gregset;
496   prfpregset_t fpregset;
497
498   if (!is_thread (inferior_ptid))
499     {
500       struct target_ops *beneath = find_target_beneath (ops);
501
502       /* It's an LWP; pass the request on to the layer beneath.  */
503       beneath->to_store_registers (beneath, regcache, regnum);
504       return;
505     }
506
507   /* Solaris thread: convert INFERIOR_PTID into a td_thrhandle_t.  */
508   thread = GET_THREAD (inferior_ptid);
509
510   val = p_td_ta_map_id2thr (main_ta, thread, &thandle);
511   if (val != TD_OK)
512     error (_("sol_thread_store_registers: td_ta_map_id2thr %s"),
513            td_err_string (val));
514
515   if (regnum != -1)
516     {
517       /* Not writing all the registers.  */
518       char old_value[MAX_REGISTER_SIZE];
519
520       /* Save new register value.  */
521       regcache_raw_collect (regcache, regnum, old_value);
522
523       val = p_td_thr_getgregs (&thandle, gregset);
524       if (val != TD_OK)
525         error (_("sol_thread_store_registers: td_thr_getgregs %s"),
526                td_err_string (val));
527       val = p_td_thr_getfpregs (&thandle, &fpregset);
528       if (val != TD_OK)
529         error (_("sol_thread_store_registers: td_thr_getfpregs %s"),
530                td_err_string (val));
531
532       /* Restore new register value.  */
533       regcache_raw_supply (regcache, regnum, old_value);
534     }
535
536   fill_gregset (regcache, (gdb_gregset_t *) &gregset, regnum);
537   fill_fpregset (regcache, (gdb_fpregset_t *) &fpregset, regnum);
538
539   val = p_td_thr_setgregs (&thandle, gregset);
540   if (val != TD_OK)
541     error (_("sol_thread_store_registers: td_thr_setgregs %s"),
542            td_err_string (val));
543   val = p_td_thr_setfpregs (&thandle, &fpregset);
544   if (val != TD_OK)
545     error (_("sol_thread_store_registers: td_thr_setfpregs %s"),
546            td_err_string (val));
547 }
548
549 /* Perform partial transfers on OBJECT.  See target_read_partial and
550    target_write_partial for details of each variant.  One, and only
551    one, of readbuf or writebuf must be non-NULL.  */
552
553 static LONGEST
554 sol_thread_xfer_partial (struct target_ops *ops, enum target_object object,
555                           const char *annex, gdb_byte *readbuf,
556                           const gdb_byte *writebuf,
557                          ULONGEST offset, LONGEST len)
558 {
559   int retval;
560   struct cleanup *old_chain;
561   struct target_ops *beneath = find_target_beneath (ops);
562
563   old_chain = save_inferior_ptid ();
564
565   if (is_thread (inferior_ptid) || !target_thread_alive (inferior_ptid))
566     {
567       /* It's either a thread or an LWP that isn't alive.  Any live
568          LWP will do so use the first available.
569
570          NOTE: We don't need to call switch_to_thread; we're just
571          reading memory.  */
572       inferior_ptid = procfs_first_available ();
573     }
574
575   retval = beneath->to_xfer_partial (beneath, object, annex,
576                                      readbuf, writebuf, offset, len);
577
578   do_cleanups (old_chain);
579
580   return retval;
581 }
582
583 static void
584 check_for_thread_db (void)
585 {
586   td_err_e err;
587   ptid_t ptid;
588
589   /* Do nothing if we couldn't load libthread_db.so.1.  */
590   if (p_td_ta_new == NULL)
591     return;
592
593   if (sol_thread_active)
594     /* Nothing to do.  The thread library was already detected and the
595        target vector was already activated.  */
596     return;
597
598   /* Now, initialize libthread_db.  This needs to be done after the
599      shared libraries are located because it needs information from
600      the user's thread library.  */
601
602   err = p_td_init ();
603   if (err != TD_OK)
604     {
605       warning (_("sol_thread_new_objfile: td_init: %s"), td_err_string (err));
606       return;
607     }
608
609   /* Now attempt to open a connection to the thread library.  */
610   err = p_td_ta_new (&main_ph, &main_ta);
611   switch (err)
612     {
613     case TD_NOLIBTHREAD:
614       /* No thread library was detected.  */
615       break;
616
617     case TD_OK:
618       printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
619
620       /* The thread library was detected.  Activate the sol_thread target.  */
621       push_target (&sol_thread_ops);
622       sol_thread_active = 1;
623
624       main_ph.ptid = inferior_ptid; /* Save for xfer_memory.  */
625       ptid = lwp_to_thread (inferior_ptid);
626       if (PIDGET (ptid) != -1)
627         inferior_ptid = ptid;
628
629       target_find_new_threads ();
630       break;
631
632     default:
633       warning (_("Cannot initialize thread debugging library: %s"),
634                td_err_string (err));
635       break;
636     }
637 }
638
639 /* This routine is called whenever a new symbol table is read in, or
640    when all symbol tables are removed.  libthread_db can only be
641    initialized when it finds the right variables in libthread.so.
642    Since it's a shared library, those variables don't show up until
643    the library gets mapped and the symbol table is read in.  */
644
645 static void
646 sol_thread_new_objfile (struct objfile *objfile)
647 {
648   if (objfile != NULL)
649     check_for_thread_db ();
650 }
651
652 /* Clean up after the inferior dies.  */
653
654 static void
655 sol_thread_mourn_inferior (struct target_ops *ops)
656 {
657   struct target_ops *beneath = find_target_beneath (ops);
658
659   sol_thread_active = 0;
660
661   unpush_target (ops);
662
663   beneath->to_mourn_inferior (beneath);
664 }
665
666 /* Return true if PTID is still active in the inferior.  */
667
668 static int
669 sol_thread_alive (struct target_ops *ops, ptid_t ptid)
670 {
671   if (is_thread (ptid))
672     {
673       /* It's a (user-level) thread.  */
674       td_err_e val;
675       td_thrhandle_t th;
676       int pid;
677
678       pid = GET_THREAD (ptid);
679       if ((val = p_td_ta_map_id2thr (main_ta, pid, &th)) != TD_OK)
680         return 0;               /* Thread not found.  */
681       if ((val = p_td_thr_validate (&th)) != TD_OK)
682         return 0;               /* Thread not valid.  */
683       return 1;                 /* Known thread.  */
684     }
685   else
686     {
687       struct target_ops *beneath = find_target_beneath (ops);
688
689       /* It's an LPW; pass the request on to the layer below.  */
690       return beneath->to_thread_alive (beneath, ptid);
691     }
692 }
693
694 \f
695 /* These routines implement the lower half of the thread_db interface,
696    i.e. the ps_* routines.  */
697
698 /* Various versions of <proc_service.h> have slightly different
699    function prototypes.  In particular, we have
700
701    NEWER                        OLDER
702    struct ps_prochandle *       const struct ps_prochandle *
703    void*                        char*
704    const void*                  char*
705    int                          size_t
706
707    Which one you have depends on the Solaris version and what patches
708    you've applied.  On the theory that there are only two major
709    variants, we have configure check the prototype of ps_pdwrite (),
710    and use that info to make appropriate typedefs here.  */
711
712 #ifdef PROC_SERVICE_IS_OLD
713 typedef const struct ps_prochandle *gdb_ps_prochandle_t;
714 typedef char *gdb_ps_read_buf_t;
715 typedef char *gdb_ps_write_buf_t;
716 typedef int gdb_ps_size_t;
717 typedef psaddr_t gdb_ps_addr_t;
718 #else
719 typedef struct ps_prochandle *gdb_ps_prochandle_t;
720 typedef void *gdb_ps_read_buf_t;
721 typedef const void *gdb_ps_write_buf_t;
722 typedef size_t gdb_ps_size_t;
723 typedef psaddr_t gdb_ps_addr_t;
724 #endif
725
726 /* The next four routines are called by libthread_db to tell us to
727    stop and stop a particular process or lwp.  Since GDB ensures that
728    these are all stopped by the time we call anything in thread_db,
729    these routines need to do nothing.  */
730
731 /* Process stop.  */
732
733 ps_err_e
734 ps_pstop (gdb_ps_prochandle_t ph)
735 {
736   return PS_OK;
737 }
738
739 /* Process continue.  */
740
741 ps_err_e
742 ps_pcontinue (gdb_ps_prochandle_t ph)
743 {
744   return PS_OK;
745 }
746
747 /* LWP stop.  */
748
749 ps_err_e
750 ps_lstop (gdb_ps_prochandle_t ph, lwpid_t lwpid)
751 {
752   return PS_OK;
753 }
754
755 /* LWP continue.  */
756
757 ps_err_e
758 ps_lcontinue (gdb_ps_prochandle_t ph, lwpid_t lwpid)
759 {
760   return PS_OK;
761 }
762
763 /* Looks up the symbol LD_SYMBOL_NAME in the debugger's symbol table.  */
764
765 ps_err_e
766 ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *ld_object_name,
767                    const char *ld_symbol_name, gdb_ps_addr_t *ld_symbol_addr)
768 {
769   struct minimal_symbol *ms;
770
771   ms = lookup_minimal_symbol (ld_symbol_name, NULL, NULL);
772   if (!ms)
773     return PS_NOSYM;
774
775   *ld_symbol_addr = SYMBOL_VALUE_ADDRESS (ms);
776   return PS_OK;
777 }
778
779 /* Common routine for reading and writing memory.  */
780
781 static ps_err_e
782 rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
783            char *buf, int size)
784 {
785   int ret;
786   struct cleanup *old_chain;
787
788   old_chain = save_inferior_ptid ();
789
790   if (is_thread (inferior_ptid) || !target_thread_alive (inferior_ptid))
791     {
792       /* It's either a thread or an LWP that isn't alive.  Any live
793          LWP will do so use the first available.
794
795          NOTE: We don't need to call switch_to_thread; we're just
796          reading memory.  */
797       inferior_ptid = procfs_first_available ();
798     }
799
800 #if defined (__sparcv9)
801   /* For Sparc64 cross Sparc32, make sure the address has not been
802      accidentally sign-extended (or whatever) to beyond 32 bits.  */
803   if (bfd_get_arch_size (exec_bfd) == 32)
804     addr &= 0xffffffff;
805 #endif
806
807   if (dowrite)
808     ret = target_write_memory (addr, buf, size);
809   else
810     ret = target_read_memory (addr, buf, size);
811
812   do_cleanups (old_chain);
813
814   return (ret == 0 ? PS_OK : PS_ERR);
815 }
816
817 /* Copies SIZE bytes from target process .data segment to debugger memory.  */
818
819 ps_err_e
820 ps_pdread (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
821            gdb_ps_read_buf_t buf, gdb_ps_size_t size)
822 {
823   return rw_common (0, ph, addr, buf, size);
824 }
825
826 /* Copies SIZE bytes from debugger memory .data segment to target process.  */
827
828 ps_err_e
829 ps_pdwrite (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
830             gdb_ps_write_buf_t buf, gdb_ps_size_t size)
831 {
832   return rw_common (1, ph, addr, (char *) buf, size);
833 }
834
835 /* Copies SIZE bytes from target process .text segment to debugger memory.  */
836
837 ps_err_e
838 ps_ptread (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
839            gdb_ps_read_buf_t buf, gdb_ps_size_t size)
840 {
841   return rw_common (0, ph, addr, buf, size);
842 }
843
844 /* Copies SIZE bytes from debugger memory .text segment to target process.  */
845
846 ps_err_e
847 ps_ptwrite (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
848             gdb_ps_write_buf_t buf, gdb_ps_size_t size)
849 {
850   return rw_common (1, ph, addr, (char *) buf, size);
851 }
852
853 /* Get general-purpose registers for LWP.  */
854
855 ps_err_e
856 ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset)
857 {
858   struct cleanup *old_chain;
859   struct regcache *regcache;
860
861   old_chain = save_inferior_ptid ();
862
863   inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
864   regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch);
865
866   target_fetch_registers (regcache, -1);
867   fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
868
869   do_cleanups (old_chain);
870
871   return PS_OK;
872 }
873
874 /* Set general-purpose registers for LWP.  */
875
876 ps_err_e
877 ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
878              const prgregset_t gregset)
879 {
880   struct cleanup *old_chain;
881   struct regcache *regcache;
882
883   old_chain = save_inferior_ptid ();
884
885   inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
886   regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch);
887
888   supply_gregset (regcache, (const gdb_gregset_t *) gregset);
889   target_store_registers (regcache, -1);
890
891   do_cleanups (old_chain);
892
893   return PS_OK;
894 }
895
896 /* Log a message (sends to gdb_stderr).  */
897
898 void
899 ps_plog (const char *fmt, ...)
900 {
901   va_list args;
902
903   va_start (args, fmt);
904
905   vfprintf_filtered (gdb_stderr, fmt, args);
906 }
907
908 /* Get floating-point registers for LWP.  */
909
910 ps_err_e
911 ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
912                prfpregset_t *fpregset)
913 {
914   struct cleanup *old_chain;
915   struct regcache *regcache;
916
917   old_chain = save_inferior_ptid ();
918
919   inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
920   regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch);
921
922   target_fetch_registers (regcache, -1);
923   fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
924
925   do_cleanups (old_chain);
926
927   return PS_OK;
928 }
929
930 /* Set floating-point regs for LWP.  */
931
932 ps_err_e
933 ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
934                const prfpregset_t * fpregset)
935 {
936   struct cleanup *old_chain;
937   struct regcache *regcache;
938
939   old_chain = save_inferior_ptid ();
940
941   inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
942   regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch);
943
944   supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
945   target_store_registers (regcache, -1);
946
947   do_cleanups (old_chain);
948
949   return PS_OK;
950 }
951
952 #ifdef PR_MODEL_LP64
953 /* Identify process as 32-bit or 64-bit.  At the moment we're using
954    BFD to do this.  There might be a more Solaris-specific
955    (e.g. procfs) method, but this ought to work.  */
956
957 ps_err_e
958 ps_pdmodel (gdb_ps_prochandle_t ph, int *data_model)
959 {
960   if (exec_bfd == 0)
961     *data_model = PR_MODEL_UNKNOWN;
962   else if (bfd_get_arch_size (exec_bfd) == 32)
963     *data_model = PR_MODEL_ILP32;
964   else
965     *data_model = PR_MODEL_LP64;
966
967   return PS_OK;
968 }
969 #endif /* PR_MODEL_LP64 */
970
971 #if (defined(__i386__) || defined(__x86_64__)) && defined (sun)
972
973 /* Reads the local descriptor table of a LWP.
974
975    This function is necessary on x86-solaris only.  Without it, the loading
976    of libthread_db would fail because of ps_lgetLDT being undefined.  */
977
978 ps_err_e
979 ps_lgetLDT (gdb_ps_prochandle_t ph, lwpid_t lwpid,
980             struct ssd *pldt)
981 {
982   /* NOTE: only used on Solaris, therefore OK to refer to procfs.c.  */
983   struct ssd *ret;
984
985   /* FIXME: can't I get the process ID from the prochandle or
986      something?  */
987
988   if (PIDGET (inferior_ptid) <= 0 || lwpid <= 0)
989     return PS_BADLID;
990
991   ret = procfs_find_LDT_entry (BUILD_LWP (lwpid, PIDGET (inferior_ptid)));
992   if (ret)
993     {
994       memcpy (pldt, ret, sizeof (struct ssd));
995       return PS_OK;
996     }
997   else
998     /* LDT not found.  */
999     return PS_ERR;
1000 }
1001 #endif
1002 \f
1003
1004 /* Convert PTID to printable form.  */
1005
1006 static char *
1007 solaris_pid_to_str (struct target_ops *ops, ptid_t ptid)
1008 {
1009   static char buf[100];
1010
1011   if (is_thread (ptid))
1012     {
1013       ptid_t lwp;
1014
1015       lwp = thread_to_lwp (ptid, -2);
1016
1017       if (PIDGET (lwp) == -1)
1018         sprintf (buf, "Thread %ld (defunct)", GET_THREAD (ptid));
1019       else if (PIDGET (lwp) != -2)
1020         sprintf (buf, "Thread %ld (LWP %ld)",
1021                  GET_THREAD (ptid), GET_LWP (lwp));
1022       else
1023         sprintf (buf, "Thread %ld        ", GET_THREAD (ptid));
1024     }
1025   else if (GET_LWP (ptid) != 0)
1026     sprintf (buf, "LWP    %ld        ", GET_LWP (ptid));
1027   else
1028     sprintf (buf, "process %d    ", PIDGET (ptid));
1029
1030   return buf;
1031 }
1032 \f
1033
1034 /* Worker bee for find_new_threads.  Callback function that gets
1035    called once per user-level thread (i.e. not for LWP's).  */
1036
1037 static int
1038 sol_find_new_threads_callback (const td_thrhandle_t *th, void *ignored)
1039 {
1040   td_err_e retval;
1041   td_thrinfo_t ti;
1042   ptid_t ptid;
1043
1044   retval = p_td_thr_get_info (th, &ti);
1045   if (retval != TD_OK)
1046     return -1;
1047
1048   ptid = BUILD_THREAD (ti.ti_tid, PIDGET (inferior_ptid));
1049   if (!in_thread_list (ptid) || is_exited (ptid))
1050     add_thread (ptid);
1051
1052   return 0;
1053 }
1054
1055 static void
1056 sol_find_new_threads (struct target_ops *ops)
1057 {
1058   struct target_ops *beneath = find_target_beneath (ops);
1059
1060   /* First Find any new LWP's.  */
1061   if (beneath->to_find_new_threads != NULL)
1062     beneath->to_find_new_threads (beneath);
1063
1064   /* Then find any new user-level threads.  */
1065   p_td_ta_thr_iter (main_ta, sol_find_new_threads_callback, (void *) 0,
1066                     TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
1067                     TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
1068 }
1069
1070 /* Worker bee for the "info sol-thread" command.  This is a callback
1071    function that gets called once for each Solaris user-level thread
1072    (i.e. not for LWPs) in the inferior.  Print anything interesting
1073    that we can think of.  */
1074
1075 static int
1076 info_cb (const td_thrhandle_t *th, void *s)
1077 {
1078   td_err_e ret;
1079   td_thrinfo_t ti;
1080
1081   ret = p_td_thr_get_info (th, &ti);
1082   if (ret == TD_OK)
1083     {
1084       printf_filtered ("%s thread #%d, lwp %d, ",
1085                        ti.ti_type == TD_THR_SYSTEM ? "system" : "user  ",
1086                        ti.ti_tid, ti.ti_lid);
1087       switch (ti.ti_state)
1088         {
1089         default:
1090         case TD_THR_UNKNOWN:
1091           printf_filtered ("<unknown state>");
1092           break;
1093         case TD_THR_STOPPED:
1094           printf_filtered ("(stopped)");
1095           break;
1096         case TD_THR_RUN:
1097           printf_filtered ("(run)    ");
1098           break;
1099         case TD_THR_ACTIVE:
1100           printf_filtered ("(active) ");
1101           break;
1102         case TD_THR_ZOMBIE:
1103           printf_filtered ("(zombie) ");
1104           break;
1105         case TD_THR_SLEEP:
1106           printf_filtered ("(asleep) ");
1107           break;
1108         case TD_THR_STOPPED_ASLEEP:
1109           printf_filtered ("(stopped asleep)");
1110           break;
1111         }
1112       /* Print thr_create start function.  */
1113       if (ti.ti_startfunc != 0)
1114         {
1115           struct minimal_symbol *msym;
1116           msym = lookup_minimal_symbol_by_pc (ti.ti_startfunc);
1117           if (msym)
1118             printf_filtered ("   startfunc: %s\n",
1119                              SYMBOL_PRINT_NAME (msym));
1120           else
1121             printf_filtered ("   startfunc: %s\n",
1122                              paddress (target_gdbarch, ti.ti_startfunc));
1123         }
1124
1125       /* If thread is asleep, print function that went to sleep.  */
1126       if (ti.ti_state == TD_THR_SLEEP)
1127         {
1128           struct minimal_symbol *msym;
1129           msym = lookup_minimal_symbol_by_pc (ti.ti_pc);
1130           if (msym)
1131             printf_filtered (" - Sleep func: %s\n",
1132                              SYMBOL_PRINT_NAME (msym));
1133           else
1134             printf_filtered (" - Sleep func: %s\n",
1135                              paddress (target_gdbarch, ti.ti_startfunc));
1136         }
1137
1138       /* Wrap up line, if necessary.  */
1139       if (ti.ti_state != TD_THR_SLEEP && ti.ti_startfunc == 0)
1140         printf_filtered ("\n"); /* don't you hate counting newlines?  */
1141     }
1142   else
1143     warning (_("info sol-thread: failed to get info for thread."));
1144
1145   return 0;
1146 }
1147
1148 /* List some state about each Solaris user-level thread in the
1149    inferior.  */
1150
1151 static void
1152 info_solthreads (char *args, int from_tty)
1153 {
1154   p_td_ta_thr_iter (main_ta, info_cb, args,
1155                     TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
1156                     TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
1157 }
1158
1159 /* Callback routine used to find a thread based on the TID part of
1160    its PTID.  */
1161
1162 static int
1163 thread_db_find_thread_from_tid (struct thread_info *thread, void *data)
1164 {
1165   long *tid = (long *) data;
1166
1167   if (ptid_get_tid (thread->ptid) == *tid)
1168     return 1;
1169
1170   return 0;
1171 }
1172
1173 static ptid_t
1174 sol_get_ada_task_ptid (long lwp, long thread)
1175 {
1176   struct thread_info *thread_info =
1177     iterate_over_threads (thread_db_find_thread_from_tid, &thread);
1178
1179   if (thread_info == NULL)
1180     {
1181       /* The list of threads is probably not up to date.  Find any
1182          thread that is missing from the list, and try again.  */
1183       sol_find_new_threads (&current_target);
1184       thread_info = iterate_over_threads (thread_db_find_thread_from_tid,
1185                                           &thread);
1186     }
1187
1188   gdb_assert (thread_info != NULL);
1189
1190   return (thread_info->ptid);
1191 }
1192
1193 static void
1194 init_sol_thread_ops (void)
1195 {
1196   sol_thread_ops.to_shortname = "solaris-threads";
1197   sol_thread_ops.to_longname = "Solaris threads and pthread.";
1198   sol_thread_ops.to_doc = "Solaris threads and pthread support.";
1199   sol_thread_ops.to_detach = sol_thread_detach;
1200   sol_thread_ops.to_resume = sol_thread_resume;
1201   sol_thread_ops.to_wait = sol_thread_wait;
1202   sol_thread_ops.to_fetch_registers = sol_thread_fetch_registers;
1203   sol_thread_ops.to_store_registers = sol_thread_store_registers;
1204   sol_thread_ops.to_xfer_partial = sol_thread_xfer_partial;
1205   sol_thread_ops.to_mourn_inferior = sol_thread_mourn_inferior;
1206   sol_thread_ops.to_thread_alive = sol_thread_alive;
1207   sol_thread_ops.to_pid_to_str = solaris_pid_to_str;
1208   sol_thread_ops.to_find_new_threads = sol_find_new_threads;
1209   sol_thread_ops.to_stratum = thread_stratum;
1210   sol_thread_ops.to_get_ada_task_ptid = sol_get_ada_task_ptid;
1211   sol_thread_ops.to_magic = OPS_MAGIC;
1212 }
1213
1214 /* Silence -Wmissing-prototypes.  */
1215 extern void _initialize_sol_thread (void);
1216
1217 void
1218 _initialize_sol_thread (void)
1219 {
1220   void *dlhandle;
1221
1222   init_sol_thread_ops ();
1223
1224   dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW);
1225   if (!dlhandle)
1226     goto die;
1227
1228 #define resolve(X) \
1229   if (!(p_##X = dlsym (dlhandle, #X))) \
1230     goto die;
1231
1232   resolve (td_log);
1233   resolve (td_ta_new);
1234   resolve (td_ta_delete);
1235   resolve (td_init);
1236   resolve (td_ta_get_ph);
1237   resolve (td_ta_get_nthreads);
1238   resolve (td_ta_tsd_iter);
1239   resolve (td_ta_thr_iter);
1240   resolve (td_thr_validate);
1241   resolve (td_thr_tsd);
1242   resolve (td_thr_get_info);
1243   resolve (td_thr_getfpregs);
1244   resolve (td_thr_getxregsize);
1245   resolve (td_thr_getxregs);
1246   resolve (td_thr_sigsetmask);
1247   resolve (td_thr_setprio);
1248   resolve (td_thr_setsigpending);
1249   resolve (td_thr_setfpregs);
1250   resolve (td_thr_setxregs);
1251   resolve (td_ta_map_id2thr);
1252   resolve (td_ta_map_lwp2thr);
1253   resolve (td_thr_getgregs);
1254   resolve (td_thr_setgregs);
1255
1256   add_target (&sol_thread_ops);
1257
1258   add_cmd ("sol-threads", class_maintenance, info_solthreads,
1259            _("Show info on Solaris user threads."), &maintenanceinfolist);
1260
1261   /* Hook into new_objfile notification.  */
1262   observer_attach_new_objfile (sol_thread_new_objfile);
1263   return;
1264
1265  die:
1266   fprintf_unfiltered (gdb_stderr, "\
1267 [GDB will not be able to debug user-mode threads: %s]\n", dlerror ());
1268
1269   if (dlhandle)
1270     dlclose (dlhandle);
1271
1272   return;
1273 }