* bsd-uthread.c (bsd_uthread_close): New.
[external/binutils.git] / gdb / bsd-uthread.c
1 /* BSD user-level threads support.
2
3    Copyright (C) 2005, 2007, 2008 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 #include "defs.h"
21 #include "gdbcore.h"
22 #include "gdbthread.h"
23 #include "inferior.h"
24 #include "objfiles.h"
25 #include "observer.h"
26 #include "regcache.h"
27 #include "solib.h"
28 #include "solist.h"
29 #include "symfile.h"
30 #include "target.h"
31
32 #include "gdb_assert.h"
33 #include "gdb_obstack.h"
34
35 #include "bsd-uthread.h"
36
37 /* HACK: Save the bsd_uthreads ops returned by bsd_uthread_target.  */
38 static struct target_ops *bsd_uthread_ops_hack;
39 \f
40
41 /* Architecture-specific operations.  */
42
43 /* Per-architecture data key.  */
44 static struct gdbarch_data *bsd_uthread_data;
45
46 struct bsd_uthread_ops
47 {
48   /* Supply registers for an inactive thread to a register cache.  */
49   void (*supply_uthread)(struct regcache *, int, CORE_ADDR);
50
51   /* Collect registers for an inactive thread from a register cache.  */
52   void (*collect_uthread)(const struct regcache *, int, CORE_ADDR);
53 };
54
55 static void *
56 bsd_uthread_init (struct obstack *obstack)
57 {
58   struct bsd_uthread_ops *ops;
59
60   ops = OBSTACK_ZALLOC (obstack, struct bsd_uthread_ops);
61   return ops;
62 }
63
64 /* Set the function that supplies registers from an inactive thread
65    for architecture GDBARCH to SUPPLY_UTHREAD.  */
66
67 void
68 bsd_uthread_set_supply_uthread (struct gdbarch *gdbarch,
69                                 void (*supply_uthread) (struct regcache *,
70                                                         int, CORE_ADDR))
71 {
72   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
73   ops->supply_uthread = supply_uthread;
74 }
75
76 /* Set the function that collects registers for an inactive thread for
77    architecture GDBARCH to SUPPLY_UTHREAD.  */
78
79 void
80 bsd_uthread_set_collect_uthread (struct gdbarch *gdbarch,
81                          void (*collect_uthread) (const struct regcache *,
82                                                   int, CORE_ADDR))
83 {
84   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
85   ops->collect_uthread = collect_uthread;
86 }
87
88 /* Magic number to help recognize a valid thread structure.  */
89 #define BSD_UTHREAD_PTHREAD_MAGIC       0xd09ba115
90
91 /* Check whether the thread structure at ADDR is valid.  */
92
93 static void
94 bsd_uthread_check_magic (CORE_ADDR addr)
95 {
96   ULONGEST magic = read_memory_unsigned_integer (addr, 4);
97
98   if (magic != BSD_UTHREAD_PTHREAD_MAGIC)
99     error (_("Bad magic"));
100 }
101
102 /* Thread states.  */
103 #define BSD_UTHREAD_PS_RUNNING  0
104 #define BSD_UTHREAD_PS_DEAD     18
105
106 /* Address of the pointer to the the thread structure for the running
107    thread.  */
108 static CORE_ADDR bsd_uthread_thread_run_addr;
109
110 /* Address of the list of all threads.  */
111 static CORE_ADDR bsd_uthread_thread_list_addr;
112
113 /* Offsets of various "interesting" bits in the thread structure.  */
114 static int bsd_uthread_thread_state_offset = -1;
115 static int bsd_uthread_thread_next_offset = -1;
116 static int bsd_uthread_thread_ctx_offset;
117
118 /* Name of shared threads library.  */
119 static const char *bsd_uthread_solib_name;
120
121 /* Non-zero if the thread startum implemented by this module is active.  */
122 static int bsd_uthread_active;
123
124 static CORE_ADDR
125 bsd_uthread_lookup_address (const char *name, struct objfile *objfile)
126 {
127   struct minimal_symbol *sym;
128
129   sym = lookup_minimal_symbol (name, NULL, objfile);
130   if (sym)
131     return SYMBOL_VALUE_ADDRESS (sym);
132
133   return 0;
134 }
135
136 static int
137 bsd_uthread_lookup_offset (const char *name, struct objfile *objfile)
138 {
139   CORE_ADDR addr;
140
141   addr = bsd_uthread_lookup_address (name, objfile);
142   if (addr == 0)
143     return 0;
144
145   return read_memory_unsigned_integer (addr, 4);
146 }
147
148 /* If OBJFILE contains the symbols corresponding to one of the
149    supported user-level threads libraries, activate the thread stratum
150    implemented by this module.  */
151
152 static int
153 bsd_uthread_activate (struct objfile *objfile)
154 {
155   struct gdbarch *gdbarch = current_gdbarch;
156   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
157
158   /* Skip if the thread stratum has already been activated.  */
159   if (bsd_uthread_active)
160     return 0;
161
162   /* There's no point in enabling this module if no
163      architecture-specific operations are provided.  */
164   if (!ops->supply_uthread)
165     return 0;
166
167   bsd_uthread_thread_run_addr =
168     bsd_uthread_lookup_address ("_thread_run", objfile);
169   if (bsd_uthread_thread_run_addr == 0)
170     return 0;
171
172   bsd_uthread_thread_list_addr =
173     bsd_uthread_lookup_address ("_thread_list", objfile);
174   if (bsd_uthread_thread_list_addr == 0)
175     return 0;
176
177   bsd_uthread_thread_state_offset =
178     bsd_uthread_lookup_offset ("_thread_state_offset", objfile);
179   if (bsd_uthread_thread_state_offset == 0)
180     return 0;
181
182   bsd_uthread_thread_next_offset =
183     bsd_uthread_lookup_offset ("_thread_next_offset", objfile);
184   if (bsd_uthread_thread_next_offset == 0)
185     return 0;
186
187   bsd_uthread_thread_ctx_offset =
188     bsd_uthread_lookup_offset ("_thread_ctx_offset", objfile);
189
190   push_target (bsd_uthread_ops_hack);
191   bsd_uthread_active = 1;
192   return 1;
193 }
194
195 /* Cleanup due to deactivation.  */
196
197 static void
198 bsd_uthread_close (int quitting)
199 {
200   bsd_uthread_active = 0;
201   bsd_uthread_thread_run_addr = 0;
202   bsd_uthread_thread_list_addr = 0;
203   bsd_uthread_thread_state_offset = 0;
204   bsd_uthread_thread_next_offset = 0;
205   bsd_uthread_thread_ctx_offset = 0;
206   bsd_uthread_solib_name = NULL;
207 }
208
209 /* Deactivate the thread stratum implemented by this module.  */
210
211 static void
212 bsd_uthread_deactivate (void)
213 {
214   /* Skip if the thread stratum has already been deactivated.  */
215   if (!bsd_uthread_active)
216     return;
217
218   unpush_target (bsd_uthread_ops_hack);
219 }
220
221 void
222 bsd_uthread_inferior_created (struct target_ops *ops, int from_tty)
223 {
224   bsd_uthread_activate (NULL);
225 }
226
227 /* Likely candidates for the threads library.  */
228 static const char *bsd_uthread_solib_names[] =
229 {
230   "/usr/lib/libc_r.so",         /* FreeBSD */
231   "/usr/lib/libpthread.so",     /* OpenBSD */
232   NULL
233 };
234
235 void
236 bsd_uthread_solib_loaded (struct so_list *so)
237 {
238   const char **names = bsd_uthread_solib_names;
239
240   for (names = bsd_uthread_solib_names; *names; names++)
241     {
242       if (strncmp (so->so_original_name, *names, strlen (*names)) == 0)
243         {
244           solib_read_symbols (so, so->from_tty);
245
246           if (bsd_uthread_activate (so->objfile))
247             {
248               bsd_uthread_solib_name = so->so_original_name;
249               return;
250             }
251         }
252     }
253 }
254
255 void
256 bsd_uthread_solib_unloaded (struct so_list *so)
257 {
258   if (!bsd_uthread_solib_name)
259     return;
260
261   if (strcmp (so->so_original_name, bsd_uthread_solib_name) == 0)
262     bsd_uthread_deactivate ();
263 }
264
265 static void
266 bsd_uthread_mourn_inferior (void)
267 {
268   find_target_beneath (bsd_uthread_ops_hack)->to_mourn_inferior ();
269   bsd_uthread_deactivate ();
270 }
271
272 static void
273 bsd_uthread_fetch_registers (struct regcache *regcache, int regnum)
274 {
275   struct gdbarch *gdbarch = get_regcache_arch (regcache);
276   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
277   CORE_ADDR addr = ptid_get_tid (inferior_ptid);
278   CORE_ADDR active_addr;
279
280   /* Always fetch the appropriate registers from the layer beneath.  */
281   find_target_beneath (bsd_uthread_ops_hack)->to_fetch_registers (regcache, regnum);
282
283   /* FIXME: That might have gotten us more than we asked for.  Make
284      sure we overwrite all relevant registers with values from the
285      thread structure.  This can go once we fix the underlying target.  */
286   regnum = -1;
287
288   active_addr = read_memory_typed_address (bsd_uthread_thread_run_addr,
289                                            builtin_type_void_data_ptr);
290   if (addr != 0 && addr != active_addr)
291     {
292       bsd_uthread_check_magic (addr);
293       ops->supply_uthread (regcache, regnum,
294                            addr + bsd_uthread_thread_ctx_offset);
295     }
296 }
297
298 static void
299 bsd_uthread_store_registers (struct regcache *regcache, int regnum)
300 {
301   struct gdbarch *gdbarch = get_regcache_arch (regcache);
302   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
303   CORE_ADDR addr = ptid_get_tid (inferior_ptid);
304   CORE_ADDR active_addr;
305
306   active_addr = read_memory_typed_address (bsd_uthread_thread_run_addr,
307                                            builtin_type_void_data_ptr);
308   if (addr != 0 && addr != active_addr)
309     {
310       bsd_uthread_check_magic (addr);
311       ops->collect_uthread (regcache, regnum,
312                             addr + bsd_uthread_thread_ctx_offset);
313     }
314   else
315     {
316       /* Updating the thread that is currently running; pass the
317          request to the layer beneath.  */
318       find_target_beneath (bsd_uthread_ops_hack)->to_store_registers (regcache, regnum);
319     }
320 }
321
322 /* FIXME: This function is only there because otherwise GDB tries to
323    invoke deprecate_xfer_memory.  */
324
325 static LONGEST
326 bsd_uthread_xfer_partial (struct target_ops *ops, enum target_object object,
327                           const char *annex, gdb_byte *readbuf,
328                           const gdb_byte *writebuf,
329                           ULONGEST offset, LONGEST len)
330 {
331   gdb_assert (ops->beneath->to_xfer_partial);
332   return ops->beneath->to_xfer_partial (ops->beneath, object, annex, readbuf,
333                                         writebuf, offset, len);
334 }
335
336 static ptid_t
337 bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
338 {
339   CORE_ADDR addr;
340
341   /* Pass the request to the layer beneath.  */
342   ptid = find_target_beneath (bsd_uthread_ops_hack)->to_wait (ptid, status);
343
344   /* If the process is no longer alive, there's no point in figuring
345      out the thread ID.  It will fail anyway.  */
346   if (status->kind == TARGET_WAITKIND_SIGNALLED
347       || status->kind == TARGET_WAITKIND_EXITED)
348     return ptid;
349
350   /* Fetch the corresponding thread ID, and augment the returned
351      process ID with it.  */
352   addr = read_memory_typed_address (bsd_uthread_thread_run_addr,
353                                     builtin_type_void_data_ptr);
354   if (addr != 0)
355     {
356       gdb_byte buf[4];
357
358       /* FIXME: For executables linked statically with the threads
359          library, we end up here before the program has actually been
360          executed.  In that case ADDR will be garbage since it has
361          been read from the wrong virtual memory image.  */
362       if (target_read_memory (addr, buf, 4) == 0)
363         {
364           ULONGEST magic = extract_unsigned_integer (buf, 4);
365           if (magic == BSD_UTHREAD_PTHREAD_MAGIC)
366             ptid = ptid_build (ptid_get_pid (ptid), 0, addr);
367         }
368     }
369
370   /* HACK: Twiddle INFERIOR_PTID such that the initial thread of a
371      process isn't recognized as a new thread.  */
372   if (ptid_get_tid (ptid) != 0 && !in_thread_list (ptid)
373       && ptid_get_tid (inferior_ptid) == 0)
374     {
375       add_thread_silent (ptid);
376       inferior_ptid = ptid;
377     }
378
379   return ptid;
380 }
381
382 static void
383 bsd_uthread_resume (ptid_t ptid, int step, enum target_signal sig)
384 {
385   /* Pass the request to the layer beneath.  */
386   find_target_beneath (bsd_uthread_ops_hack)->to_resume (ptid, step, sig);
387 }
388
389 static int
390 bsd_uthread_thread_alive (ptid_t ptid)
391 {
392   CORE_ADDR addr = ptid_get_tid (inferior_ptid);
393
394   if (addr != 0)
395     {
396       int offset = bsd_uthread_thread_state_offset;
397       ULONGEST state;
398
399       bsd_uthread_check_magic (addr);
400
401       state = read_memory_unsigned_integer (addr + offset, 4);
402       if (state == BSD_UTHREAD_PS_DEAD)
403         return 0;
404     }
405
406   return find_target_beneath (bsd_uthread_ops_hack)->to_thread_alive (ptid);
407 }
408
409 static void
410 bsd_uthread_find_new_threads (void)
411 {
412   pid_t pid = ptid_get_pid (inferior_ptid);
413   int offset = bsd_uthread_thread_next_offset;
414   CORE_ADDR addr;
415
416   addr = read_memory_typed_address (bsd_uthread_thread_list_addr,
417                                     builtin_type_void_data_ptr);
418   while (addr != 0)
419     {
420       ptid_t ptid = ptid_build (pid, 0, addr);
421
422       if (!in_thread_list (ptid))
423         add_thread (ptid);
424
425       addr = read_memory_typed_address (addr + offset,
426                                         builtin_type_void_data_ptr);
427     }
428 }
429
430 /* Possible states a thread can be in.  */
431 static char *bsd_uthread_state[] =
432 {
433   "RUNNING",
434   "SIGTHREAD",
435   "MUTEX_WAIT",
436   "COND_WAIT",
437   "FDLR_WAIT",
438   "FDLW_WAIT",
439   "FDR_WAIT",
440   "FDW_WAIT",
441   "FILE_WAIT",
442   "POLL_WAIT",
443   "SELECT_WAIT",
444   "SLEEP_WAIT",
445   "WAIT_WAIT",
446   "SIGSUSPEND",
447   "SIGWAIT",
448   "SPINBLOCK",
449   "JOIN",
450   "SUSPENDED",
451   "DEAD",
452   "DEADLOCK"
453 };
454
455 /* Return a string describing th state of the thread specified by
456    INFO.  */
457
458 static char *
459 bsd_uthread_extra_thread_info (struct thread_info *info)
460 {
461   CORE_ADDR addr = ptid_get_tid (info->ptid);
462
463   if (addr != 0)
464     {
465       int offset = bsd_uthread_thread_state_offset;
466       ULONGEST state;
467
468       state = read_memory_unsigned_integer (addr + offset, 4);
469       if (state < ARRAY_SIZE (bsd_uthread_state))
470         return bsd_uthread_state[state];
471     }
472
473   return NULL;
474 }
475
476 static char *
477 bsd_uthread_pid_to_str (ptid_t ptid)
478 {
479   if (ptid_get_tid (ptid) != 0)
480     {
481       static char buf[64];
482
483       xsnprintf (buf, sizeof buf, "process %d, thread 0x%lx",
484                  ptid_get_pid (ptid), ptid_get_tid (ptid));
485       return buf;
486     }
487
488   return normal_pid_to_str (ptid);
489 }
490
491 struct target_ops *
492 bsd_uthread_target (void)
493 {
494   struct target_ops *t = XZALLOC (struct target_ops);
495
496   t->to_shortname = "bsd-uthreads";
497   t->to_longname = "BSD user-level threads";
498   t->to_doc = "BSD user-level threads";
499   t->to_close = bsd_uthread_close;
500   t->to_mourn_inferior = bsd_uthread_mourn_inferior;
501   t->to_fetch_registers = bsd_uthread_fetch_registers;
502   t->to_store_registers = bsd_uthread_store_registers;
503   t->to_xfer_partial = bsd_uthread_xfer_partial;
504   t->to_wait = bsd_uthread_wait;
505   t->to_resume = bsd_uthread_resume;
506   t->to_thread_alive = bsd_uthread_thread_alive;
507   t->to_find_new_threads = bsd_uthread_find_new_threads;
508   t->to_extra_thread_info = bsd_uthread_extra_thread_info;
509   t->to_pid_to_str = bsd_uthread_pid_to_str;
510   t->to_stratum = thread_stratum;
511   t->to_magic = OPS_MAGIC;
512   bsd_uthread_ops_hack = t;
513
514   return t;
515 }
516
517 void
518 _initialize_bsd_uthread (void)
519 {
520   add_target (bsd_uthread_target ());
521
522   bsd_uthread_data = gdbarch_data_register_pre_init (bsd_uthread_init);
523
524   observer_attach_inferior_created (bsd_uthread_inferior_created);
525   observer_attach_solib_loaded (bsd_uthread_solib_loaded);
526   observer_attach_solib_unloaded (bsd_uthread_solib_unloaded);
527 }