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