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