OSDN Git Service

ee82841338ae21cd198f7a4cd5745532be191673
[pf3gnuchains/pf3gnuchains3x.git] / rda / unix / thread-db.c
1 /* thread-db.c
2
3    Copyright 2001, 2002 Red Hat, Inc.
4
5    This file is part of RDA, the Red Hat Debug Agent (and library).
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 2 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, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.
21    
22    Alternative licenses for RDA may be arranged by contacting Red Hat,
23    Inc.  */
24
25 #include "config.h"
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <dlfcn.h>
30 #include <thread_db.h>
31 #include <signal.h>
32 #include <errno.h>
33 #include <sys/wait.h>
34
35 #include "gdbserv.h"
36 #include "gdbserv-target.h"
37 #include "server.h"
38 #include "gdb_proc_service.h"
39 #include "gdbserv-thread-db.h"
40
41 /* Make lots of noise (debugging output). */
42 int thread_db_noisy = 0;
43 int proc_service_noisy = 0;
44
45 /*
46  * A tiny local symbol table.
47  *
48  * This is used by ps_pglobal_lookup, and is really just a 
49  * local cache of symbols whose values we have obtained from gdb.
50  *
51  * Since the cache is expected to be small, and infrequently used,
52  * there is no effort to sort or hash it.  Symbols may be added 
53  * in an "undefined" state, and then defined later.
54  */
55
56 struct symbol_cache {
57   char *name;
58   paddr_t value;
59   int  defined_p;
60   struct symbol_cache *next;
61 } *symbol_list;
62
63 /* The "defined_p" field may have one of the following three values. */
64 enum { UNDEFINED, REQUESTED, DEFINED };
65
66 /* Function: add_symbol_to_list
67    Add a symbol to the symbol cache.  First checks to see if 
68    an entry is already in there, and re-uses it if so.  This way
69    the cache may be used for symbols awaiting lookup as well as
70    for those that have already been defined by the debugger. */
71
72 static void
73 add_symbol_to_list (char *name, paddr_t value, int defined_p)
74 {
75   struct symbol_cache *tmp;
76
77   for (tmp = symbol_list; tmp; tmp = tmp->next)
78     {
79       if (strcmp (name, tmp->name) == 0)
80         {
81           /* Symbol is already in cache -- set its value and definedness. */
82           tmp->value = value;
83           if (defined_p == DEFINED)
84             tmp->defined_p = defined_p;
85           return;
86         }
87     }
88
89   /* Symbol is not in cache -- add it. */
90   tmp = malloc (sizeof (struct symbol_cache));
91
92   tmp->value = value;
93   tmp->defined_p = defined_p;
94   tmp->name = malloc (strlen (name) + 1);
95   strcpy (tmp->name, name);
96   /* LIFO */
97   tmp->next = symbol_list;
98   symbol_list = tmp;
99 }
100
101 /* Function: free_symbol_list
102    Empty the symbol cache. */
103
104 static void
105 free_symbol_list (void)
106 {
107   struct symbol_cache *tmp;
108
109   for (tmp = symbol_list; tmp; tmp = symbol_list)
110     {
111       symbol_list = tmp->next;
112       free (tmp->name);
113       free (tmp);
114     }
115 }
116
117 /* Function: sync_symbol_list
118    Return all "requested" symbols to the "undefined" state
119    (so they can be "requested" again).  Called when a new
120    source of symbols becomes available (eg. a new shared object). */
121
122 static void
123 sync_symbol_list (void)
124 {
125   struct symbol_cache *tmp;
126
127   for (tmp = symbol_list; tmp; tmp = tmp->next)
128     if (tmp->defined_p == REQUESTED)
129       tmp->defined_p = UNDEFINED;
130 }
131
132 /* Function: lookup_cached_symbol
133    If symbol is defined and cached, return its value in VALUE.
134    Return:  0 if not found, 1 if found.  */
135
136 static int 
137 lookup_cached_symbol (char *name, paddr_t *value)
138 {
139   struct symbol_cache *tmp;
140
141   for (tmp = symbol_list; tmp; tmp = tmp->next)
142     if (strcmp (name, tmp->name) == 0 && tmp->defined_p == DEFINED)
143       {
144         *value = tmp->value;    /* known and defined */
145         return 1;
146       }
147
148   return 0;     /* not found */
149 }
150
151 /* Function: next_undefined_symbol
152    Find a symbol in the cache that needs lookup by GDB.
153    On returning a symbol, mark it REQUESTED, so that it won't
154    be requested again until a new source of symbols opens up
155    (eg. a new shared object). */
156
157 static char *
158 next_undefined_symbol (void)
159 {
160   struct symbol_cache *tmp;
161   /* Make a pass thru the list, and return the first symbol that
162      hasn't been either requested or defined. */
163   for (tmp = symbol_list; tmp; tmp = tmp->next)
164     if (tmp->defined_p == UNDEFINED)
165       {
166         tmp->defined_p = REQUESTED;
167         return tmp->name;
168       }
169   return NULL;
170 }
171
172 /*
173  * A tiny local thread list.
174  *
175  * This local list of threads is used for gdbserv operations that
176  * require a struct gdbserv_thread.  Its first use will be to 
177  * implement "info threads" for gdb.
178  */
179
180 /* Define the struct gdbserv_thread object. */
181
182 struct gdbserv_thread {
183   td_thrinfo_t ti;
184   int attached : 1;
185   int stopped : 1;
186   int waited : 1;
187   int stepping : 1;
188   struct gdbserv_thread *next;
189 } *thread_list;
190
191 /* Function: add_thread_to_list 
192    Add a thread (provided by libthread_db) to the local list. */
193
194 static struct gdbserv_thread *
195 add_thread_to_list (td_thrinfo_t *ti)
196 {
197   struct gdbserv_thread *new = malloc (sizeof (struct gdbserv_thread));
198
199   /* First cut -- add to start of list. */
200   memcpy (&new->ti, ti, sizeof (td_thrinfo_t));
201   new->next = thread_list;
202   thread_list = new;
203   return new;
204 }
205
206 static struct gdbserv_thread *
207 first_thread_in_list (void)
208 {
209   return thread_list;
210 }
211
212 static struct gdbserv_thread *
213 next_thread_in_list (struct gdbserv_thread *thread)
214 {
215   if (thread == NULL)
216     return thread_list;
217   else
218     return thread->next;
219 }
220
221 static void
222 delete_thread_from_list (struct gdbserv_thread *thread)
223 {
224   struct gdbserv_thread *tmp;
225
226   for (tmp = thread_list; tmp; tmp = tmp->next)
227     {
228       if (tmp->next == thread)
229         {
230           tmp->next = tmp->next->next;          /* unlink */
231           free (thread);                        /* discard */
232           return;                               /* finished */
233         }
234     }
235   /* Special case -- delete first element of list. */
236   if (thread == thread_list)
237     {
238       thread_list = thread->next;               /* unlink */
239       free (thread);                            /* discard */
240       return;                                   /* finished */
241     }
242   /* If we reach this point, the thread wasn't in the list. */
243 }
244
245 static void
246 free_thread_list (void)
247 {
248   struct gdbserv_thread *tmp;
249
250   for (tmp = thread_list; tmp; tmp = thread_list)
251     {
252       thread_list = tmp->next;
253       free (tmp);
254     }
255 }
256
257 static struct gdbserv_thread *
258 thread_list_lookup_by_tid (thread_t tid)
259 {
260   struct gdbserv_thread *tmp;
261
262   for (tmp = thread_list; tmp; tmp = tmp->next)
263     if (tmp->ti.ti_tid == tid)
264       break;
265
266   return tmp;
267 }
268
269 static struct gdbserv_thread *
270 thread_list_lookup_by_lid (lwpid_t pid)
271 {
272   struct gdbserv_thread *tmp;
273
274   for (tmp = thread_list; tmp; tmp = tmp->next)
275     if (tmp->ti.ti_lid == pid)
276       break;
277
278   return tmp;
279 }
280
281 /* A copy of the next lower layer's target vector, before we modify it. */
282 static struct gdbserv_target parentvec;
283
284 /* A pointer to the current target vector. */
285 static struct gdbserv_target *currentvec;
286
287 /* 
288  * proc_service callback functions, called by thread_db.
289  */
290
291 void
292 ps_plog (const char *fmt, ...)
293 {
294   fprintf (stderr, "<ps_plog: %s>\n", fmt);
295   return;
296 }
297
298 /* Look up a symbol in GDB's global symbol table.
299    Return the symbol's address.
300    FIXME: it would be more correct to look up the symbol in the context 
301    of the LD_OBJECT_NAME provided.  However we're probably fairly safe 
302    as long as there aren't name conflicts with other libraries.  */
303
304 ps_err_e
305 ps_pglobal_lookup (gdb_ps_prochandle_t ph,
306                    const char *ld_object_name,  /* the library name */
307                    const char *ld_symbol_name,  /* the symbol name */
308                    paddr_t    *ld_symbol_addr)  /* return the symbol addr */
309 {
310   paddr_t value;
311
312   if (lookup_cached_symbol ((char *) ld_symbol_name, &value) == 0)
313     {
314       /* Symbol not in cache -- ask GDB to look it up. 
315          Add the symbol to the cache as undefined. */
316       add_symbol_to_list ((char *) ld_symbol_name, 0, UNDEFINED);
317       return PS_NOSYM;
318     }
319   else
320     {
321       /* Symbol is in the cache and defined -- return its value. */
322       *ld_symbol_addr = value;
323       return PS_OK;
324     }
325 }
326
327
328 /* Connection to the libthread_db library.  */
329 static struct ps_prochandle  proc_handle;
330 static td_thragent_t *thread_agent = NULL;
331
332 /* Pointers to the libthread_db functions.  */
333 static td_err_e (*td_init_p) (void);
334
335 static td_err_e (*td_ta_new_p)           (struct ps_prochandle *ps, 
336                                           td_thragent_t **ta);
337 static td_err_e (*td_ta_delete_p)        (td_thragent_t *ta);
338 static td_err_e (*td_ta_map_id2thr_p)    (const td_thragent_t *ta, 
339                                           thread_t pt, 
340                                           td_thrhandle_t *__th);
341 static td_err_e (*td_ta_map_lwp2thr_p)   (const td_thragent_t *ta, 
342                                           lwpid_t lwpid, 
343                                           td_thrhandle_t *th);
344 static td_err_e (*td_ta_thr_iter_p)      (const td_thragent_t *ta, 
345                                           td_thr_iter_f *callback, 
346                                           void *cbdata, 
347                                           td_thr_state_e state, 
348                                           int ti_pri, 
349                                           sigset_t *ti_sigmask, 
350                                           unsigned int ti_user_flags);
351 static td_err_e (*td_ta_event_addr_p)    (const td_thragent_t *ta, 
352                                           td_event_e event, 
353                                           td_notify_t *ptr);
354 static td_err_e (*td_ta_set_event_p)     (const td_thragent_t *ta, 
355                                           td_thr_events_t *event);
356 static td_err_e (*td_ta_event_getmsg_p)  (const td_thragent_t *ta, 
357                                           td_event_msg_t *msg);
358 static td_err_e (*td_thr_validate_p)     (const td_thrhandle_t *th);
359 static td_err_e (*td_thr_get_info_p)     (const td_thrhandle_t *th, 
360                                           td_thrinfo_t *infop);
361 static td_err_e (*td_thr_getfpregs_p)    (const td_thrhandle_t *th, 
362                                           FPREGSET_T *regset);
363 static td_err_e (*td_thr_getgregs_p)     (const td_thrhandle_t *th, 
364                                           GREGSET_T gregs);
365 static td_err_e (*td_thr_setfpregs_p)    (const td_thrhandle_t *th, 
366                                           const FPREGSET_T *fpregs);
367 static td_err_e (*td_thr_setgregs_p)     (const td_thrhandle_t *th, 
368                                           GREGSET_T gregs);
369 static td_err_e (*td_thr_getxregsize_p)  (const td_thrhandle_t *th,
370                                           int *sizep);
371 static td_err_e (*td_thr_getxregs_p)     (const td_thrhandle_t *th, 
372                                           void *xregs);
373 static td_err_e (*td_thr_setxregs_p)     (const td_thrhandle_t *th, 
374                                           void *xregs);
375 static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, 
376                                           int event);
377
378 /* Function: thread_db_state_str
379    Convert a thread_db state code to a string.
380    If state code is unknown, return an <unknown> message. */
381
382 static char *
383 thread_db_state_str (td_thr_state_e statecode)
384 {
385   static char buf[64];
386
387   switch (statecode) {
388   case TD_THR_ANY_STATE:        return "<any state>";
389   case TD_THR_UNKNOWN:          return "<officially unknown>";
390   case TD_THR_STOPPED:          return "<stopped>";
391   case TD_THR_RUN:              return "<running>";
392   case TD_THR_ACTIVE:           return "<active> ";
393   case TD_THR_ZOMBIE:           return "<zombie> ";
394   case TD_THR_SLEEP:            return "<sleep>  ";
395   case TD_THR_STOPPED_ASLEEP:   return "<stopped asleep>";
396   default:
397     sprintf (buf, "<unknown state code %d>", statecode);
398     return buf;
399   }
400 }
401
402 static char *
403 thread_db_type_str (td_thr_type_e type)
404 {
405   switch (type) {
406   case TD_THR_USER:             return "<user>  ";
407   case TD_THR_SYSTEM:           return "<system>";
408   default:                      return "<unknown>";
409   }
410 }
411
412 /* Function: thread_db_err_string
413    Convert a thread_db error code to a string.
414    If errcode is unknown, then return an <unknown> message. */
415
416 static char *
417 thread_db_err_str (td_err_e errcode)
418 {
419   static char buf[64];
420
421   switch (errcode) {
422   case TD_OK:           return "generic 'call succeeded'";
423   case TD_ERR:          return "generic error";
424   case TD_NOTHR:        return "no thread to satisfy query";
425   case TD_NOSV:         return "no sync handle to satisfy query";
426   case TD_NOLWP:        return "no lwp to satisfy query";
427   case TD_BADPH:        return "invalid process handle";
428   case TD_BADTH:        return "invalid thread handle";
429   case TD_BADSH:        return "invalid synchronization handle";
430   case TD_BADTA:        return "invalid thread agent";
431   case TD_BADKEY:       return "invalid key";
432   case TD_NOMSG:        return "no event message for getmsg";
433   case TD_NOFPREGS:     return "FPU register set not available";
434   case TD_NOLIBTHREAD:  return "application not linked with libthread";
435   case TD_NOEVENT:      return "requested event is not supported";
436   case TD_NOCAPAB:      return "capability not available";
437   case TD_DBERR:        return "debugger service failed";
438   case TD_NOAPLIC:      return "operation not applicable to";
439   case TD_NOTSD:        return "no thread-specific data for this thread";
440   case TD_MALLOC:       return "malloc failed";
441   case TD_PARTIALREG:   return "only part of register set was written/read";
442   case TD_NOXREGS:      return "X register set not available for this thread";
443   default:
444     sprintf (buf, "unknown thread_db error '%d'", errcode);
445     return buf;
446   }
447 }
448
449 /* flag which indicates if the map_id2thr cache is valid.  See below.  */
450 static int thread_db_map_id2thr_cache_valid;
451
452 /* Function: thread_db_map_id2thr
453    Calling td_ta_map_id2thr() is expensive.  This function invokes
454    td_ta_map_id2thr() and caches the value for future reference.  The
455    cache may be invalidated by calling thread_db_invalidate_cache().
456    Returns: TD_OK on success, an appropriate error code otherwise.  */
457
458 static td_err_e
459 thread_db_map_id2thr (const td_thragent_t *ta, thread_t pt,
460                       td_thrhandle_t *th)
461 {
462   static td_thrhandle_t cached_handle;
463   static thread_t input_pt;
464
465   if (pt == input_pt && thread_db_map_id2thr_cache_valid)
466     {
467       *th = cached_handle;
468       return TD_OK;
469     }
470   else
471     {
472       td_err_e status;
473
474       status = td_ta_map_id2thr_p (ta, pt, th);
475       if (status == TD_OK)
476         {
477           thread_db_map_id2thr_cache_valid = 1;
478           input_pt = pt;
479           cached_handle = *th;
480         }
481       else
482         thread_db_map_id2thr_cache_valid = 0;
483       return status;
484     }
485 }
486
487 /* Invalidate the map_id2thr cache.  */
488 static void
489 thread_db_invalidate_map_id2thr_cache (void)
490 {
491   thread_db_map_id2thr_cache_valid = 0;
492 }
493
494 /* The regset cache object.  This object keeps track of the most
495    recently fetched or set gregset (of a particular type) and whether
496    or not it needs to still needs to be synchronized with the target.  */
497 struct regset_cache
498 {
499   /* Are the cache contents valid?  */
500   int valid;
501
502   /* Does cache need to be flushed?  */
503   int needs_flush;
504
505   /* Handle corresponding to cached regset.  */
506   td_thrhandle_t handle;
507
508   /* Size of memory area used to hold regset.  */
509   int regset_size;
510
511   /* Memory area used to hold regset.  */
512   void *regset_buffer;
513
514   /* Functions used to get/set regset.  */
515   td_err_e (*getregset) (const td_thrhandle_t *th, void *regset);
516   td_err_e (*setregset) (const td_thrhandle_t *th, const void *regset);
517 };
518
519 /* Declare fpregset and gregset cache objects.  */
520 static struct regset_cache fpregset_cache;
521 static struct regset_cache gregset_cache;
522
523 /* Wrappers for td_thr_getfpregs_p, td_thr_setfpregs_p, td_thr_getgregs_p,
524    and td_thr_setgregs_p.  These simply allow us to pass a void * for the
525    regset parameter.  */
526
527 static td_err_e
528 td_thr_getfpregs_wrapper (const td_thrhandle_t *th, void *fpregs)
529 {
530   return td_thr_getfpregs_p (th, fpregs);
531 }
532
533 static td_err_e td_thr_getgregs_wrapper (const td_thrhandle_t *th, void *gregs)
534 {
535   return td_thr_getgregs_p (th, gregs);
536 }
537
538 static td_err_e td_thr_setfpregs_wrapper (const td_thrhandle_t *th,
539                                           const void *fpregs)
540 {
541   return td_thr_setfpregs_p (th, fpregs);
542 }
543
544 static td_err_e td_thr_setgregs_wrapper (const td_thrhandle_t *th,
545                                          const void *gregs)
546 {
547   void * gregs_nonconst = (void *) gregs;
548
549   return td_thr_setgregs_p (th, gregs_nonconst);
550 }
551
552 /* Initialize a regset cache object.  */
553 static void
554 initialize_regset_cache (struct regset_cache *regset_cache,
555                          const int regset_size,
556                          void * const regset_buffer,
557                          td_err_e (* const getregset) (const td_thrhandle_t *th,
558                                                        void *regset),
559                          td_err_e (* const setregset) (const td_thrhandle_t *th,
560                                                        const void *regset))
561 {
562   regset_cache->valid = 0;
563   regset_cache->needs_flush = 0;
564   regset_cache->regset_size = regset_size;
565   regset_cache->regset_buffer = regset_buffer;
566   regset_cache->getregset = getregset;
567   regset_cache->setregset = setregset;
568 }
569
570 /* Initialize the fpregset and gregset cache objects.  Space for
571    the regset buffer is statically allocated to avoid calls to malloc().  */
572 static void
573 initialize_regset_caches (void)
574 {
575   static FPREGSET_T fpregset;
576   static GREGSET_T gregset;
577
578   initialize_regset_cache (&fpregset_cache, sizeof fpregset, &fpregset,
579                            td_thr_getfpregs_wrapper, td_thr_setfpregs_wrapper);
580   initialize_regset_cache (&gregset_cache, sizeof gregset, gregset,
581                            td_thr_getgregs_wrapper, td_thr_setgregs_wrapper);
582 }
583
584 /* Synchronize a cached regset with the target.  */
585 static td_err_e
586 thread_db_flush_regset_cache (struct regset_cache *regset_cache)
587 {
588   td_err_e status = TD_OK;
589   if (regset_cache->valid && regset_cache->needs_flush)
590     {
591       status = regset_cache->setregset (&regset_cache->handle,
592                                         regset_cache->regset_buffer);
593       if (status != TD_OK)
594         regset_cache->valid = 0;
595       regset_cache->needs_flush = 0;
596     }
597   return status;
598 }
599
600 /* Synchronize the gregset and fpregset caches with the target.  */
601 static td_err_e
602 thread_db_flush_regset_caches (void)
603 {
604   td_err_e status;
605   td_err_e ret_status = TD_OK;
606
607   status = thread_db_flush_regset_cache (&fpregset_cache);
608   if (status != TD_OK)
609     ret_status = status;
610
611   status = thread_db_flush_regset_cache (&gregset_cache);
612   if (status != TD_OK)
613     ret_status = status;
614
615   return status;
616 }
617
618 /* Fetch a regset, using a previously cached copy if possible.  */
619 static td_err_e
620 thread_db_get_regset (struct regset_cache *regset_cache,
621                      const td_thrhandle_t *th,
622                      void *regset)
623 {
624   if (regset_cache->valid
625       && memcmp (&regset_cache->handle, th, sizeof *th) == 0)
626     {
627       /* Cache is valid and handles match.  Copy the cached regset.  */
628       memcpy (regset, regset_cache->regset_buffer, regset_cache->regset_size);
629       return TD_OK;
630     }
631   else
632     {
633       td_err_e status;
634
635       /* Handles don't match.  Write out old cache contents before
636          fetching contents w/ new handle if necessary.  */
637       if (regset_cache->valid && regset_cache->needs_flush)
638         {
639           status = regset_cache->setregset (&regset_cache->handle,
640                                             regset_cache->regset_buffer);
641           if (status != TD_OK)
642             {
643               regset_cache->needs_flush = 0;
644               regset_cache->valid = 0;
645               return status;
646             }
647         }
648       
649
650       /* Fetch the regset.  */
651       status = regset_cache->getregset (th, regset);
652       if (status == TD_OK)
653         {
654           /* Preserve it in the cache.  */
655           regset_cache->needs_flush = 0;
656           regset_cache->valid = 1;
657           memcpy (&regset_cache->handle, th, sizeof (*th));
658           memcpy (regset_cache->regset_buffer, regset,
659                   regset_cache->regset_size);
660         }
661       else
662         regset_cache->valid = 0;
663       return status;
664     }
665 }
666
667 /* Set a regset deferring synchronization with the target until
668    later.  */
669 static td_err_e
670 thread_db_set_regset (struct regset_cache *regset_cache,
671                      const td_thrhandle_t *th,
672                      const void *regset)
673 {
674   td_err_e ret_status = TD_OK;
675
676   if (regset_cache->valid && regset_cache->needs_flush
677       && memcmp (&regset_cache->handle, th, sizeof *th) != 0)
678     {
679       /* Cached regset needs to be flushed because handles don't
680          match.  */
681       ret_status = thread_db_flush_regset_cache (regset_cache);
682     }
683
684   memcpy (&regset_cache->handle, th, sizeof *th);
685   memcpy (regset_cache->regset_buffer, regset, regset_cache->regset_size);
686   regset_cache->valid = 1;
687   regset_cache->needs_flush = 1;
688
689   return ret_status;
690 }
691
692 /* Mark a regset cache as invalid.  */
693 static void
694 thread_db_invalidate_regset_cache (struct regset_cache *regset_cache)
695 {
696   regset_cache->valid = 0;
697 }
698
699 /* Mark the gregset and fpregset caches as invalid.  */
700 static void
701 thread_db_invalidate_regset_caches (void)
702 {
703   thread_db_invalidate_regset_cache (&fpregset_cache);
704   thread_db_invalidate_regset_cache (&gregset_cache);
705 }
706
707 /* Invalidate all caches.  */
708 static void
709 thread_db_invalidate_caches (void)
710 {
711   thread_db_invalidate_regset_caches ();
712   thread_db_invalidate_map_id2thr_cache ();
713 }
714
715 /* Fetch the floating point registers via the fpregset cache.  */
716 static td_err_e
717 thread_db_getfpregs (const td_thrhandle_t *th, FPREGSET_T *fpregset)
718 {
719   return thread_db_get_regset (&fpregset_cache, th, fpregset);
720 }
721
722 /* Set the floating point registers via the fpregset cache.  */
723 static td_err_e
724 thread_db_setfpregs (const td_thrhandle_t *th, const FPREGSET_T *fpregset)
725 {
726   return thread_db_set_regset (&fpregset_cache, th, fpregset);
727 }
728
729 /* Fetch the general purpose registers via the gregset cache.  */
730 static td_err_e
731 thread_db_getgregs (const td_thrhandle_t *th, GREGSET_T gregset)
732 {
733   return thread_db_get_regset (&gregset_cache, th, gregset);
734 }
735
736 /* Set the general purpose registers via the gregset cache.  */
737 static td_err_e
738 thread_db_setgregs (const td_thrhandle_t *th, const GREGSET_T gregset)
739 {
740   return thread_db_set_regset (&gregset_cache, th, gregset);
741 }
742
743 /* Call dlsym() to find the address of a symbol.  If symbol lookup fails,
744    print the reason to stderr.  */
745
746 static void *
747 lookup_sym (void *dlhandle, char *symbol)
748 {
749   void *addr;
750
751   addr = dlsym (dlhandle, symbol);
752
753   if (addr == NULL)
754     fprintf (stderr, "Symbol lookup of %s failed: %s\n",
755              symbol, dlerror ());
756
757   return addr;
758 }
759
760 /* Function: thread_db_dlopen
761    Attach to the libthread_db library.  
762    This function does all the dynamic library stuff (dlopen, dlsym).
763    Return: -1 for failure, zero for success.  */
764
765 static int
766 thread_db_dlopen (void)
767 {
768   void *dlhandle;
769
770 #ifndef LIBTHREAD_DB_SO
771 #define LIBTHREAD_DB_SO "libthread_db.so.1"
772 #endif
773
774   if ((dlhandle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW)) == NULL)
775     {
776       fprintf (stderr, "Unable to open %s: %s\n",
777                LIBTHREAD_DB_SO, dlerror ());
778       return -1;                /* fail */
779     }
780
781   /* Initialize pointers to the dynamic library functions we will use.
782    */
783
784   if ((td_init_p = lookup_sym (dlhandle, "td_init")) == NULL)
785     return -1;          /* fail */
786
787   if ((td_ta_new_p = lookup_sym (dlhandle, "td_ta_new")) == NULL)
788     return -1;          /* fail */
789
790   if ((td_ta_delete_p = lookup_sym (dlhandle, "td_ta_delete")) == NULL)
791     return -1;          /* fail */
792
793   if ((td_ta_map_id2thr_p = lookup_sym (dlhandle, "td_ta_map_id2thr")) == NULL)
794     return -1;          /* fail */
795
796   if ((td_ta_map_lwp2thr_p = lookup_sym (dlhandle, "td_ta_map_lwp2thr")) == NULL)
797     return -1;          /* fail */
798
799   if ((td_ta_thr_iter_p = lookup_sym (dlhandle, "td_ta_thr_iter")) == NULL)
800     return -1;          /* fail */
801
802   if ((td_thr_validate_p = lookup_sym (dlhandle, "td_thr_validate")) == NULL)
803     return -1;          /* fail */
804
805   if ((td_thr_get_info_p = lookup_sym (dlhandle, "td_thr_get_info")) == NULL)
806     return -1;          /* fail */
807
808   if ((td_thr_getfpregs_p = lookup_sym (dlhandle, "td_thr_getfpregs")) == NULL)
809     return -1;          /* fail */
810
811   if ((td_thr_getgregs_p = lookup_sym (dlhandle, "td_thr_getgregs")) == NULL)
812     return -1;          /* fail */
813
814   if ((td_thr_setfpregs_p = lookup_sym (dlhandle, "td_thr_setfpregs")) == NULL)
815     return -1;          /* fail */
816
817   if ((td_thr_setgregs_p = lookup_sym (dlhandle, "td_thr_setgregs")) == NULL)
818     return -1;          /* fail */
819
820   /* These are not essential.  */
821   td_ta_event_addr_p    = dlsym (dlhandle, "td_ta_event_addr");
822   td_ta_set_event_p     = dlsym (dlhandle, "td_ta_set_event");
823   td_ta_event_getmsg_p  = dlsym (dlhandle, "td_ta_event_getmsg");
824   td_thr_event_enable_p = dlsym (dlhandle, "td_thr_event_enable");
825   td_thr_getxregsize_p  = dlsym (dlhandle, "td_thr_getxregsize");
826   td_thr_getxregs_p     = dlsym (dlhandle, "td_thr_getxregs");
827   td_thr_setxregs_p     = dlsym (dlhandle, "td_thr_setxregs");
828
829   return 0;             /* success */
830 }
831
832 /* Function: thread_db_open
833    Open a channel to the child's thread library.
834    Returns: -1 for failure, 0 for success
835    FIXME: closure.
836    FIXME: where should we be called from?  We will not succeed
837    until the thread shlib is loaded.  The call from attach will not
838    succeed even if the target is statically linked, 'cause there's 
839    no symbol lookup handshake on attach.  Therefore I can't handle
840    a statically linked threaded process.  */
841
842 static int
843 thread_db_open (struct gdbserv *serv, int pid)
844 { /* FIXME: once we have the serv, we can derive the pid. 
845      No, not true -- not when we're called from attach. 
846      But then, there isn't much use in the call from attach unles
847      I make GDB respond to symbol callbacks from there somehow. */
848   td_err_e ret;
849
850   if (thread_agent == NULL)
851     {
852       proc_handle.pid = pid;
853       proc_handle.serv = serv;
854       
855       ret = td_ta_new_p (&proc_handle, &thread_agent);
856       if (ret == TD_OK)
857         {
858           return -1;    /* success */
859         }
860       else if (thread_db_noisy)
861         {
862           fprintf (stderr, "< -- failed, thread_agent = 0x%08x>\n", 
863                    (long) thread_agent);
864         }
865       return 0;         /* failure */
866     }
867   return -1;            /* success */
868 }
869
870 /* Function: thread_db_detach
871    FIXME: gdbserv kills the inferior and exits when gdb detaches.
872    This is the best place I have from which to shut down the 
873    thread_db interface, but it's not really where this should
874    be done. */
875
876 static void
877 thread_db_detach (struct gdbserv *serv, struct gdbserv_target *target)
878 {
879   struct child_process *process = gdbserv_target_data (serv);
880
881   /* FIXME: this isn't really enough, and detach isn't really the
882      right place for this anyway.  Do this in exit_program. */
883   td_ta_delete_p (thread_agent);
884   thread_agent = NULL;
885   currentvec = NULL;
886
887   if (process->debug_informational)
888     fprintf (stderr, "<thread_db_detach>\n");
889   if (parentvec.detach)
890     parentvec.detach (serv, target);
891 }
892
893 static void
894 attach_thread (struct gdbserv_thread *thread)
895 {
896   if (thread->ti.ti_lid   != 0 &&
897       thread->ti.ti_state != TD_THR_ZOMBIE)     /* Don't attach a zombie. */
898     {
899       if (attach_lwp (thread->ti.ti_lid) == 0)
900         thread->attached = 1;
901       else
902         thread->attached = 0;
903     }
904 }
905
906 /* Function: find_new_threads_callback
907    Enter threads into a local thread database. */
908
909 static int
910 find_new_threads_callback (const td_thrhandle_t *thandle, void *data)
911 {
912   struct gdbserv_thread *thread;
913   td_thrinfo_t ti;
914   td_err_e     ret;
915
916   if ((ret = td_thr_get_info_p (thandle, &ti)) != TD_OK)
917     {
918       fprintf (stderr, "<find_new_threads_callback: get_info failed! %s>\n", 
919                thread_db_err_str (ret));
920       return -1;
921     }
922
923   /* Enter the thread into a local list
924      (unless it is TD_THR_UNKNOWN, which means its defunct). */
925   if ((thread = thread_list_lookup_by_tid (ti.ti_tid)) == NULL)
926     {
927       if (ti.ti_state != TD_THR_UNKNOWN)
928         {
929           thread = add_thread_to_list (&ti);
930           /* Now make sure we've attached to it.  
931              Skip the main pid (already attached). */
932           if (thread->ti.ti_lid != proc_handle.pid)
933             {
934               attach_thread (thread);
935             }
936         }
937     }
938   else
939     {
940       /* Already in list -- cache new thread info */
941       memcpy (&thread->ti, &ti, sizeof (ti));
942     }
943
944   return 0;
945 }
946
947 /* Function: update_thread_list
948
949    First run td_ta_thr_iter to find all threads.
950    Then walk the list and validate that each thread is still running.
951    If not, prune it from the list. */
952
953 static void
954 update_thread_list (void)
955 {
956   struct gdbserv_thread *thread, *next;
957   td_thrhandle_t handle;
958
959   /* First make sure all libthread threads are in the list. */
960   td_ta_thr_iter_p (thread_agent, find_new_threads_callback, 
961                     (void *) 0, 
962                     TD_THR_ANY_STATE, 
963                     TD_THR_LOWEST_PRIORITY,
964                     TD_SIGNO_MASK,
965                     TD_THR_ANY_USER_FLAGS);
966
967   /* Next, remove any defunct threads from the list. */
968   for (thread = first_thread_in_list ();
969        thread;
970        thread = next)
971     {
972       /* Thread may be deleted, so find its successor first! */
973       next = next_thread_in_list (thread);
974
975       /* Now ask if thread is still valid, and if not, delete it. */
976       if (thread_db_map_id2thr (thread_agent, 
977                                 thread->ti.ti_tid, 
978                                 &handle) != TD_OK
979           || td_thr_validate_p (&handle) != TD_OK)
980         {
981           if (thread->ti.ti_state == TD_THR_UNKNOWN)
982             {
983               /* Thread is no longer "valid".
984                  By the time this happens, it's too late for us to 
985                  detach from it.  Just delete it from the list.  */
986               
987               delete_thread_from_list (thread);
988             }
989         }
990     }
991 }
992
993 /* Function: thread_db_thread_next
994    Exported to gdbserv to implement "info threads" request from GDB. */
995
996 static struct gdbserv_thread *
997 thread_db_thread_next (struct gdbserv *serv, struct gdbserv_thread *thread)
998 {
999   if (thread == NULL)
1000     {
1001       /* First request -- build up thread list using td_ta_thr_iter. */
1002       /* NOTE: this should be unnecessary, once we begin to keep the
1003          list up to date all the time. */
1004       update_thread_list ();
1005     }
1006   return next_thread_in_list (thread);
1007 }
1008
1009
1010 /* Function: thread_db_get_gen
1011    Handle 'q' requests:
1012      qSymbol
1013 */
1014
1015 static void
1016 thread_db_get_gen (struct gdbserv *serv)
1017 {
1018   struct child_process *process = gdbserv_target_data (serv);
1019   char tempname[1024], *symbol_query;
1020   unsigned long tempval;
1021   int len;
1022
1023   if (gdbserv_input_string_match (serv, "Symbol:") >= 0)
1024     {
1025       /* Message: qSymbol:<optional value>:<optional name hexified>
1026          Reply:   OK
1027          Reply:   qSymbol:<name hexified>
1028
1029          This message from GDB has three possible forms:
1030
1031          1) "qSymbol::" (no value, no name).
1032          This means the start of a symbol query session.
1033          GDB is offering to serve up symbols.
1034          The target should reply with the FIRST symbol whose value 
1035          it wants (or "OK" if it doesn't want any).
1036
1037          2) "qSymbol:<value>:<name hexified>
1038          This means "here is the value of the symbol you requested".
1039          The target should reply with the NEXT symbol whose value
1040          it wants (or "OK" if it doesn't want any more).
1041
1042          3) "qSymbol::<name hexified>" (no value)
1043          This means "I have no value for the symbol you requested".
1044          The target should reply with the NEXT symbol whose value
1045          it wants (or "OK" if it doesn't want any more).
1046       */
1047          
1048       if (gdbserv_input_string_match (serv, ":") >= 0)
1049         {
1050           /* So far we've matched "qSymbol::".  We're looking at either 
1051              form #1 ("qSymbol::", open a symbol lookup session), or
1052              form #2 ("qSymbol::<name>", a reply that "this symbol is
1053              not defined".  */
1054
1055           len = gdbserv_input_bytes (serv, tempname, sizeof (tempname));
1056
1057           if (len == 0)
1058             {
1059               /* Form #1, open a new symbol lookup session.
1060                  Prepare to request the first symbol in the list. */
1061               sync_symbol_list ();
1062             }
1063           else
1064             {
1065               /* Form #2, this symbol not currently defined.
1066                  Nothing to do, since we already have it marked undefined. */
1067             }
1068         }
1069       else if (gdbserv_input_hex_ulong (serv, &tempval) >= 0 &&
1070                gdbserv_input_string_match (serv, ":") >= 0 &&
1071                (len = gdbserv_input_bytes (serv, tempname, sizeof (tempname))) 
1072                > 0)
1073         {
1074           /* Message contains a symbol and a value (form #3). */
1075
1076           tempname[len] = '\0';
1077           add_symbol_to_list (tempname, (paddr_t) tempval, DEFINED);
1078           if (thread_agent != NULL)
1079             {
1080               /* We now have a new symbol in the cache, which was
1081                  requested by the last td_ta_new call.  Delete the
1082                  current (not-completely-valid) thread agent, so that
1083                  a new one will have to be opened.  */
1084               td_ta_delete_p (thread_agent);
1085               thread_agent = NULL;
1086             }
1087         }
1088
1089       /* Now the reply depends on whether there is another 
1090          symbol in need of lookup.  */
1091       thread_db_open (serv, process->pid);
1092       if ((symbol_query = next_undefined_symbol ()) == NULL)
1093         {
1094           gdbserv_output_string (serv, "OK");
1095         }
1096       else
1097         {
1098           gdbserv_output_string (serv, "qSymbol:");
1099           gdbserv_output_bytes (serv, symbol_query, strlen (symbol_query));
1100         }
1101     }
1102   else if (parentvec.process_get_gen)
1103     parentvec.process_get_gen (serv);
1104 }
1105
1106 /* Function: thread_db_set_gen
1107    Handle 'Q' requests:
1108 */
1109
1110 static void
1111 thread_db_set_gen (struct gdbserv *serv)
1112 {
1113     if (parentvec.process_set_gen)
1114       parentvec.process_set_gen (serv);
1115 }
1116
1117 static void
1118 thread_db_thread_id (struct gdbserv *serv, 
1119                      struct gdbserv_thread *thread,
1120                      struct gdbserv_reg *id)
1121 {
1122   gdbserv_ulonglong_to_reg (serv, 
1123                             (unsigned long long) thread->ti.ti_tid, 
1124                             id);
1125 }
1126
1127 static int
1128 thread_db_thread_lookup_by_id (struct gdbserv *serv,
1129                                const struct gdbserv_reg *thread_id,
1130                                struct gdbserv_thread **thread)
1131 {
1132   unsigned long id;
1133
1134   gdbserv_reg_to_ulong (serv, thread_id, &id);
1135   if (id == 0)                  /* any thread */
1136     {
1137       *thread = next_thread_in_list (NULL);     /* FIXME curthread? */
1138       return 0;
1139     }
1140   else
1141     {
1142       *thread = thread_list_lookup_by_tid ((thread_t) id);
1143       if (*thread == NULL)      /* bad thread id */
1144         {
1145           *thread = next_thread_in_list (NULL); /* FIXME curthread? */
1146           return -1;
1147         }
1148       else
1149         {
1150           return 1;             /* success */
1151         }
1152     }
1153 }
1154
1155 static char *
1156 thread_db_thread_info (struct gdbserv *serv, struct gdbserv_thread *thread)
1157 {
1158   char *info = malloc (128);
1159
1160   sprintf (info, "PID %d Type %s State %s",
1161            thread->ti.ti_lid, 
1162            thread_db_type_str (thread->ti.ti_type),
1163            thread_db_state_str (thread->ti.ti_state));
1164   return info;
1165 }
1166
1167 /* Function: get_target_int_by_name
1168    Read the value of a target integer, given its name and size.
1169    Returns -1 for failure, zero for success. */
1170
1171 static int
1172 get_target_int_by_name (char *name, void *value, int size)
1173 {
1174   paddr_t addr;
1175
1176   if (ps_pglobal_lookup (&proc_handle, NULL, name, &addr) == PS_OK)
1177     {
1178       if (ps_pdread (&proc_handle, addr,
1179                      (gdb_ps_read_buf_t) value,
1180                      (gdb_ps_size_t) size) == PS_OK)
1181         return 0;
1182     }
1183   return -1;            /* fail */
1184 }
1185
1186 /* Function: set_target_int_by_name
1187    Read the value of a target integer, given its name and size.
1188    Returns -1 for failure, zero for success. */
1189
1190 static int
1191 set_target_int_by_name (char *name, void *value, int size)
1192 {
1193   paddr_t addr;
1194
1195   if (ps_pglobal_lookup (&proc_handle, NULL, name, &addr) == PS_OK)
1196     {
1197       if (ps_pdwrite (&proc_handle, addr,
1198                       (gdb_ps_write_buf_t) value,
1199                       (gdb_ps_size_t) size) == PS_OK)
1200         return 0;
1201     }
1202   return -1;            /* fail */
1203 }
1204
1205 /* Function: get_thread_signals
1206    Obtain the values of the "cancel", "restart" and "debug" signals 
1207    used by linux threads, and store them in a set of global variables
1208    for use by check_child_state and friends. */
1209
1210 static int cancel_signal;
1211 static int restart_signal;
1212 static int debug_signal;
1213 static int got_thread_signals;
1214
1215 static void
1216 get_thread_signals (void)
1217 {
1218   int cancel, restart, debug, debug_flag;
1219
1220   if (!got_thread_signals)
1221     {
1222       if (get_target_int_by_name ("__pthread_sig_cancel", 
1223                                   &cancel, sizeof (cancel)) == 0 &&
1224           get_target_int_by_name ("__pthread_sig_restart",
1225                                   &restart, sizeof (restart)) == 0 &&
1226           get_target_int_by_name ("__pthread_sig_debug", 
1227                                   &debug, sizeof (debug)) == 0)
1228         {
1229           restart_signal = restart;
1230           cancel_signal  = cancel;
1231           debug_signal   = debug;
1232           got_thread_signals = 1;
1233         }
1234       debug_flag = 1;
1235       set_target_int_by_name ("__pthread_threads_debug", 
1236                               &debug_flag, sizeof (debug_flag));
1237     }
1238 }
1239
1240 /* Function: stop_thread 
1241    Use SIGSTOP to force a thread to stop. */
1242
1243 static void
1244 stop_thread (struct gdbserv_thread *thread)
1245 {
1246   if (thread->ti.ti_lid != 0)
1247     {
1248       if (stop_lwp (thread->ti.ti_lid) == 0)
1249         thread->stopped = 1;
1250       else
1251         thread->stopped = 0;
1252     }
1253 }
1254
1255 /* Function: stop_all_threads
1256    Use SIGSTOP to make sure all child threads are stopped.
1257    Do not send SIGSTOP to the event thread, or to any 
1258    new threads that have just been attached. */
1259
1260 static void
1261 stop_all_threads (struct child_process *process)
1262 {
1263   struct gdbserv_thread *thread;
1264
1265   for (thread = first_thread_in_list ();
1266        thread;
1267        thread = next_thread_in_list (thread))
1268     {
1269       if (thread->ti.ti_lid == process->pid)
1270         {
1271           /* HACK mark him signalled. */
1272           thread->stopped = 1;
1273           continue;     /* This thread is already stopped. */
1274         }
1275       /* All threads must be stopped, unles
1276          a) they have only just been attached, or 
1277          b) they're already stopped. */
1278       if (!thread->attached && !thread->stopped &&
1279           thread->ti.ti_state != TD_THR_ZOMBIE &&
1280           thread->ti.ti_state != TD_THR_UNKNOWN)
1281         {
1282           stop_thread (thread);
1283         }
1284     }
1285 }
1286
1287 /* A list of signals that have been prematurely sucked out of the threads.
1288    Because of the complexities of linux threads, we must send SIGSTOP to
1289    every thread, and then call waitpid on the thread to retrieve the 
1290    SIGSTOP event.  Sometimes another signal is pending on the thread,
1291    and we get that one by mistake.  Throw all such signals into this
1292    list, and send them back to their respective threads once we're
1293    finished calling waitpid. */
1294
1295 static struct event_list {
1296   struct gdbserv_thread *thread;
1297   union wait waited;
1298   int selected;
1299 } *pending_events;
1300 static int pending_events_listsize;
1301 static int pending_events_top;
1302
1303 /* Function: add_pending_event
1304    Helper function for wait_all_threads.
1305
1306    When we call waitpid for each thread (trying to consume the SIGSTOP
1307    events that we sent from stop_all_threads), we sometimes inadvertantly
1308    get other events that we didn't send.  We pend these to a list, and 
1309    then resend them to the child threads after our own SIGSTOP events
1310    have been consumed.  
1311
1312    This list will be used to choose which of the possible events 
1313    will be returned to the debugger by check_child_status. */
1314
1315 static void
1316 add_pending_event (struct gdbserv_thread *thread, union wait waited)
1317 {
1318   if (pending_events_top >= pending_events_listsize)
1319     {
1320       pending_events_listsize += 64;
1321       pending_events = 
1322         realloc (pending_events, 
1323                  pending_events_listsize * sizeof (*pending_events));
1324     }
1325   pending_events [pending_events_top].thread = thread;
1326   pending_events [pending_events_top].waited = waited;
1327   pending_events [pending_events_top].selected = 0;
1328   pending_events_top ++;
1329 }
1330
1331 /* Function: select_pending_event
1332    Helper function for wait_all_threads.
1333
1334    Having collected a list of events from various threads, 
1335    choose one "favored event" to be returned to the debugger. */
1336
1337
1338 static void
1339 select_pending_event (struct child_process *process)
1340 {
1341   int i = 0;
1342   int num_wifstopped_events = 0;
1343   int random_key;
1344
1345   /* Select the event that will be returned to the debugger. */
1346
1347   /* Selection criterion #0:
1348      If there are no events, don't do anything!  (paranoia) */
1349   if (pending_events_top == 0)
1350     return;
1351
1352   /* Selection criterion #1: 
1353      If the thread pointer is null, then the thread library is
1354      not in play yet, so this is the only thread and the only event. */
1355   if (pending_events[0].thread == NULL)
1356     {
1357       i = 0;
1358       goto selected;
1359     }
1360
1361   /* Selection criterion #2:
1362      Exit and terminate events take priority. */
1363   for (i = 0; i < pending_events_top; i++)
1364     if (WIFEXITED (pending_events[i].waited) ||
1365         WIFSIGNALED (pending_events[i].waited))
1366       {
1367         goto selected;
1368       }
1369
1370   /* Selection criterion #3: 
1371      Give priority to a stepping SIGTRAP. */
1372   for (i = 0; i < pending_events_top; i++)
1373     if (pending_events[i].thread->stepping &&
1374         WIFSTOPPED (pending_events[i].waited) &&
1375         WSTOPSIG (pending_events[i].waited) == SIGTRAP)
1376       {
1377         /* We don't actually know whether this sigtrap was the result
1378            of a singlestep, or of executing a trap instruction.  But
1379            GDB has a better chance of figuring it out than we do. */
1380         goto selected;
1381       }
1382
1383   /* Selection criterion #4:
1384      Count the WIFSTOPPED events and choose one at random. */
1385   for (i = 0; i < pending_events_top; i++)
1386     if (WIFSTOPPED (pending_events[i].waited))
1387       num_wifstopped_events ++;
1388
1389   random_key = (int) 
1390     ((num_wifstopped_events * (double) rand ()) / (RAND_MAX + 1.0));
1391
1392   for (i = pending_events_top - 1; i >= 0; i--)
1393     if (WIFSTOPPED (pending_events[i].waited))
1394       {
1395         if (random_key == --num_wifstopped_events)
1396           {
1397             goto selected;
1398           }
1399         else if (WSTOPSIG (pending_events[i].waited) == SIGINT)
1400           {
1401             goto selected;      /* Give preference to SIGINT. */
1402           }
1403       }
1404
1405   /* Selection criterion #4 (should never get here):
1406      If all else fails, take the first event in the list. */
1407   i = 0;
1408
1409  selected:      /* Got our favored event. */
1410   pending_events[i].selected = 1;
1411   process->event_thread = pending_events[i].thread;
1412   if (pending_events[i].thread)
1413     process->pid = pending_events[i].thread->ti.ti_lid;
1414
1415   handle_waitstatus (process, pending_events[i].waited);
1416   if (thread_db_noisy)
1417     fprintf (stderr, "<select_pending_event: pid %d '%c' %d>\n",
1418             process->pid, process->stop_status, process->stop_signal);
1419   return;
1420 }
1421
1422 /* Function: send_pending_signals
1423    Helper function for wait_all_threads.
1424
1425    When we call waitpid for each thread (trying to consume the SIGSTOP
1426    events that we sent from stop_all_threads), we sometimes inadvertantly
1427    get other events that we didn't send.  We pend these to a list, and 
1428    then resend them to the child threads after our own SIGSTOP events
1429    have been consumed. 
1430
1431    Some events in the list require special treatment:
1432     * One event is "selected" to be returned to the debugger. 
1433       Skip that one.
1434     * Trap events may represent breakpoints.  We can't just resend
1435       the signal.  Instead we must arrange for the breakpoint to be
1436       hit again when the thread resumes.  */
1437
1438 static void
1439 send_pending_signals (struct child_process *process)
1440 {
1441   int i;
1442   int signum;
1443
1444   for (i = 0; i < pending_events_top; i++)
1445     {
1446       if (WIFSTOPPED (pending_events[i].waited) &&
1447           ! pending_events[i].selected)
1448         {
1449           signum = WSTOPSIG (pending_events[i].waited);
1450           if (signum == SIGTRAP &&
1451               pending_events[i].thread->stepping == 0)
1452             {
1453               /* Breakpoint.  Push it back.  */
1454               if (thread_db_noisy)
1455                 fprintf (stderr, "<send_pending_events: pushing back SIGTRAP for %d>\n",
1456                         pending_events[i].thread->ti.ti_lid);
1457               decr_pc_after_break (process->serv,
1458                                    pending_events[i].thread->ti.ti_lid);
1459             }
1460           else /* FIXME we're letting SIGINT go thru as normal */
1461             {
1462               /* Put the signal back into the child's queue. */
1463               kill (pending_events[i].thread->ti.ti_lid, 
1464                     WSTOPSIG (pending_events[i].waited));
1465             }
1466         }
1467     }
1468   pending_events_top = 0;
1469 }
1470
1471 /* Function: wait_all_threads
1472    Use waitpid to close the loop on all threads that have been
1473    attached or SIGSTOP'd.  Skip the eventpid -- it's already been waited. 
1474
1475    Special considerations:
1476      The debug signal does not go into the event queue, 
1477      does not get forwarded to the thread etc. */
1478
1479 static void
1480 wait_all_threads (struct child_process *process)
1481 {
1482   struct gdbserv_thread *thread;
1483   union  wait w;
1484   int    ret, stopsig;
1485
1486   for (thread = first_thread_in_list ();
1487        thread;
1488        thread = next_thread_in_list (thread))
1489     {
1490       /* Special handling for the thread that has already been waited. */
1491       if (thread->ti.ti_lid == process->pid)
1492         {
1493           /* HACK mark him waited. */
1494           thread->waited = 1;
1495           continue;
1496         }
1497
1498       while ((thread->stopped || thread->attached) &&
1499              !thread->waited)
1500         {
1501           errno = 0;
1502           ret = waitpid (thread->ti.ti_lid, (int *) &w, 
1503                          thread->ti.ti_lid == proc_handle.pid ? 0 : __WCLONE);
1504           if (ret == -1)
1505             {
1506               if (errno == ECHILD)
1507                 fprintf (stderr, "<wait_all_threads: %d has disappeared>\n", 
1508                         thread->ti.ti_lid);
1509               else
1510                 fprintf (stderr, "<wait_all_threads: waitpid %d failed, '%s'>\n", 
1511                         thread->ti.ti_lid, strerror (errno));
1512               break;
1513             }
1514           if (WIFEXITED (w))
1515             {
1516               add_pending_event (thread, w);
1517               fprintf (stderr, "<wait_all_threads: %d has exited>\n", 
1518                       thread->ti.ti_lid);
1519               break;
1520             }
1521           if (WIFSIGNALED (w))
1522             {
1523               add_pending_event (thread, w);
1524               fprintf (stderr, "<wait_all_threads: %d died with signal %d>\n", 
1525                       thread->ti.ti_lid, WTERMSIG (w));
1526               break;
1527             }
1528           stopsig = WSTOPSIG (w);
1529           switch (stopsig) {
1530           case SIGSTOP:
1531             /* This is the one we're looking for.
1532                Mark the thread as 'waited' and move on to the next thread. */
1533 #if 0 /* too noisy! */
1534             if (thread_db_noisy)
1535               fprintf (stderr, "<waitpid (%d, SIGSTOP)>\n", thread->ti.ti_lid);
1536 #endif
1537             thread->waited = 1;
1538             break;
1539           default:
1540             if (stopsig == debug_signal)
1541               {
1542                 /* This signal does not need to be forwarded. */
1543                 if (thread_db_noisy)
1544                   fprintf (stderr, "<wait_all_threads: ignoring SIGDEBUG (%d) for %d>\n",
1545                           debug_signal,
1546                           thread->ti.ti_lid);
1547               }
1548             else
1549               {
1550                 if (thread_db_noisy)
1551                   fprintf (stderr, "<wait_all_threads: stash sig %d for %d at 0x%08x>\n",
1552                            stopsig, thread->ti.ti_lid,
1553                           (unsigned long) debug_get_pc (process->serv,
1554                                                         thread->ti.ti_lid));
1555                 add_pending_event (thread, w);
1556               }
1557           }
1558
1559           if (!thread->waited)  /* Signal was something other than STOP. */
1560             {
1561               /* Continue the thread so it can stop on the next signal. */
1562               continue_lwp (thread->ti.ti_lid, 0);
1563             }
1564         }
1565     }
1566   select_pending_event (process);
1567   send_pending_signals (process);
1568 }
1569
1570 /* Function: continue_thread
1571    Send continue to a struct gdbserv_thread. */
1572
1573 static void
1574 continue_thread (struct gdbserv_thread *thread, int signal)
1575 {
1576   thread_db_flush_regset_caches();
1577
1578   /* Continue thread only if (a) it was just attached, or 
1579      (b) we stopped it and waited for it. */
1580   if (thread->ti.ti_lid != 0)
1581     if (thread->attached || (thread->stopped && thread->waited))
1582       {
1583         continue_lwp (thread->ti.ti_lid, signal);
1584         thread->stopped = thread->attached = thread->waited = 0;
1585       }
1586   thread_db_invalidate_caches ();
1587 }
1588
1589 /* Function: continue_all_threads 
1590    Send continue to all stopped or attached threads
1591    except the event thread (which will be continued separately). */
1592
1593 static void
1594 continue_all_threads (struct gdbserv *serv)
1595 {
1596   struct child_process *process = gdbserv_target_data (serv);
1597   struct gdbserv_thread *thread;
1598   int signal;
1599
1600   for (thread = first_thread_in_list ();
1601        thread;
1602        thread = next_thread_in_list (thread))
1603     {
1604       /* Send any newly attached thread the restart signal. */
1605       if (thread->attached)
1606         continue_thread (thread, restart_signal);
1607       else
1608         continue_thread (thread, 0);
1609     }
1610 }
1611
1612 /* Function: continue_program
1613    Make sure every thread is running, starting with the event thread. */
1614
1615 static void
1616 thread_db_continue_program (struct gdbserv *serv)
1617 {
1618   struct child_process *process = gdbserv_target_data (serv);
1619
1620   /* Synchronize the regset caches.  */
1621   thread_db_flush_regset_caches();
1622
1623   /* First resume the event thread. */
1624   if (process->event_thread)
1625     continue_thread (process->event_thread, process->signal_to_send);
1626   else
1627     continue_lwp (process->pid, process->signal_to_send);
1628
1629   process->stop_signal = process->stop_status = 
1630     process->signal_to_send = 0;
1631
1632   /* Then resume everyone else. */
1633   continue_all_threads (serv);
1634   process->running = 1;
1635   thread_db_invalidate_caches ();
1636 }
1637
1638 /* Function: singlestep_thread
1639    Send SINGLESTEP to a struct gdbserv_thread. */
1640
1641 static void
1642 singlestep_thread (struct gdbserv *serv,
1643                    struct gdbserv_thread *thread,
1644                    int signal)
1645 {
1646   singlestep_lwp (serv, thread->ti.ti_lid, signal);
1647   thread->stopped = thread->attached = thread->waited = 0;
1648   thread->stepping = 1;
1649 }
1650
1651 /* Function: singlestep_program
1652    Make sure every thread is runnable, while the event thread gets to 
1653    do a singlestep. */
1654
1655 static void
1656 thread_db_singlestep_program (struct gdbserv *serv)
1657 {
1658   struct child_process *process = gdbserv_target_data (serv);
1659
1660   /* Synchronize the regset caches.  */
1661   thread_db_flush_regset_caches();
1662
1663   /* First singlestep the event thread. */
1664   if (process->event_thread)
1665     singlestep_thread (serv, process->event_thread, process->signal_to_send);
1666   else
1667     singlestep_lwp (serv, process->pid, process->signal_to_send);
1668
1669   process->stop_status = process->stop_signal =
1670     process->signal_to_send = 0;
1671
1672   /* Then resume everyone else. */
1673   continue_all_threads (serv);          /* All but the event thread. */
1674   process->running = 1;
1675   thread_db_invalidate_caches ();
1676 }
1677
1678 /* Function: thread_db_continue_thread
1679    Let a single thread continue, while everyone else waits. */
1680
1681 static void
1682 thread_db_continue_thread (struct gdbserv *serv,
1683                            struct gdbserv_thread *thread,
1684                            const struct gdbserv_reg *signum)
1685 {
1686   struct child_process *process = gdbserv_target_data (serv);
1687   unsigned long sig;
1688
1689   /* Synchronize the regset caches.  */
1690   thread_db_flush_regset_caches();
1691
1692   /* Handle the signal value. */
1693   if (parentvec.process_signal && signum)
1694     {
1695       gdbserv_reg_to_ulong (serv, signum, &sig);
1696       parentvec.process_signal (serv, (int) sig);
1697     }
1698
1699   /* A null thread argument is to be taken as a continue for all. */
1700   if (thread == NULL)
1701     thread_db_continue_program (serv);
1702   else
1703     {
1704       process->pid = thread->ti.ti_lid;         /* thread to be continued */
1705       continue_thread (thread, process->signal_to_send);
1706       process->stop_status = process->stop_signal =
1707         process->signal_to_send = 0;
1708       process->running = 1;
1709     }
1710   thread_db_invalidate_caches ();
1711 }
1712
1713 /* Function: singlestep_thread
1714    Let a single thread step, while everyone else waits. */
1715
1716 static void
1717 thread_db_singlestep_thread (struct gdbserv *serv,
1718                              struct gdbserv_thread *thread,
1719                              const struct gdbserv_reg *signum)
1720 {
1721   struct child_process *process = gdbserv_target_data (serv);
1722   unsigned long sig;
1723
1724   /* Synchronize the regset caches.  */
1725   thread_db_flush_regset_caches();
1726
1727   /* Handle the signal value. */
1728   if (parentvec.process_signal && signum)
1729     {
1730       gdbserv_reg_to_ulong (serv, signum, &sig);
1731       parentvec.process_signal (serv, (int) sig);
1732     }
1733
1734   /* A null thread argument is to be taken as a singlestep for all. */
1735   if (thread == NULL)
1736     thread_db_singlestep_program (serv);
1737   else
1738     {
1739       singlestep_thread (serv, thread, process->signal_to_send);
1740       process->stop_status = process->stop_signal =
1741         process->signal_to_send = 0;
1742       process->running = 1;
1743     }
1744   thread_db_invalidate_caches ();
1745 }
1746
1747 /* Function: exit_program
1748    Called by main loop when child exits. */
1749
1750 static void
1751 thread_db_exit_program (struct gdbserv *serv)
1752 {
1753   /* FIXME: stop and kill all threads. */
1754
1755   /* Shut down the thread_db library interface. */
1756   td_ta_delete_p (thread_agent);
1757   thread_agent = NULL;
1758   currentvec = NULL;
1759   /* Discard all cached symbol lookups. */
1760   free_symbol_list ();
1761   /* Discard all cached threads. */
1762   free_thread_list ();
1763   /* Call underlying exit_program method. */
1764   parentvec.exit_program (serv);
1765 }
1766
1767 /* Function: check_child_state
1768
1769    This function checks for signal events in the running child processes.
1770    It does not block if there is no event in any child, but if there is
1771    an event, it selectively calls other functions that will, if appropriate,
1772    make sure that all the other children are stopped as well. 
1773
1774    This is a polling (non-blocking) function, and may be called when 
1775    the child is already stopped. */
1776
1777 static int
1778 thread_db_check_child_state (struct child_process *process)
1779 {
1780   struct gdbserv *serv = process->serv;
1781   int eventpid;
1782   union wait w;
1783
1784   /* The "process" is likely to be the parent thread.
1785      We will have to manage a list of threads/pids. */
1786
1787   /* Since this is a polling call, and threads don't all stop at once, 
1788      it is possible for a subsequent call to intercept a new wait event
1789      before we've resumed from the previous wait event.  Prevent this
1790      with a resume flag. */
1791
1792   if (process->running)
1793     {
1794       eventpid = waitpid (-1, (int *) &w, WNOHANG);
1795       /* If no event on main thread, check clone threads. 
1796          It doesn't matter what event we find first, since we now have
1797          a fair algorithm for choosing which event to handle next. */
1798       if (eventpid <= 0)
1799         eventpid = waitpid (-1, (int *) &w, WNOHANG | __WCLONE);
1800
1801       if (eventpid > 0) /* found an event */
1802         {
1803           /* Allow underlying target to use the event process by default,
1804              since it is stopped and the others are still running. */
1805           process->pid = eventpid;
1806
1807           handle_waitstatus (process, w);
1808
1809           /* Look for thread exit. 
1810              This has to be done now -- if the eventpid has exited, I can't
1811              run update_thread_list because there is no stopped process 
1812              thru which I can read memory.  I could find another one to 
1813              stop, but it's not really worth it. */
1814           if (process->stop_status == 'W')
1815             {
1816               if (eventpid == proc_handle.pid)
1817                 return 1;       /* Main thread exited! */
1818               else
1819                 return 0;       /* Just a thread exit, don't tell GDB. */
1820             }
1821
1822           /* FIXME: this debugging output will be removed soon, but 
1823              putting it here before the update_thread_list etc. is
1824              bad from the point of view of synchronization. */
1825           handle_waitstatus (process, w);
1826           if (thread_db_noisy)
1827             fprintf (stderr, "<check_child_state: %d got '%c' - %d at 0x%08x>\n", 
1828                      process->pid, process->stop_status, process->stop_signal,
1829                      (unsigned long) debug_get_pc (process->serv, process->pid));
1830
1831           /* Update the thread list. */
1832           update_thread_list ();
1833
1834           /* For now, call get_thread_signals from here (FIXME:) */
1835           get_thread_signals ();
1836
1837           /* Put this child's event into the pending list. */
1838           add_pending_event (thread_list_lookup_by_lid ((lwpid_t) eventpid), 
1839                              w);
1840
1841           stop_all_threads (process);
1842           wait_all_threads (process);
1843           /* Note: if more than one thread has an event ready to be
1844              handled, wait_all_threads will have chosen one at random. */
1845
1846           if (got_thread_signals && process->stop_status == 'T')
1847             {
1848               /* Child stopped with a signal.  
1849                  See if it was one of our special signals. */
1850
1851               if (process->stop_signal == cancel_signal  ||     /* ignore */
1852                   process->stop_signal == restart_signal ||     /* ignore */
1853                   process->stop_signal == debug_signal   ||     /* ignore */
1854                   process->stop_signal == SIGCHLD)              /* ignore */
1855                 {
1856                   /* Ignore this signal, restart the child. */
1857                   if (thread_db_noisy)
1858                     fprintf (stderr, "<check_child_state: ignoring signal %d for %d>\n",
1859                              process->stop_signal, process->pid);
1860                   if (process->stop_signal == debug_signal)
1861                     {
1862                       /* The debug signal arrives under two circumstances:
1863                          1) The main thread raises it once, upon the first call
1864                          to pthread_create.  This lets us detect the manager
1865                          thread.  The main thread MUST be given the restart
1866                          signal when this occurs. 
1867                          2) The manager thread raises it each time a new
1868                          child thread is created.  The child thread will be
1869                          in sigsuspend, and MUST be sent the restart signal.
1870                          However, the manager thread, which raised the debug
1871                          signal, does not need to be restarted.  
1872
1873                          Sending the restart signal to the newly attached
1874                          child thread (which is not the event thread) is
1875                          handled in continue_all_threads.  */
1876
1877                       if (process->pid == proc_handle.pid)  /* main thread */
1878                         process->stop_signal = restart_signal;
1879                       else                              /* not main thread */
1880                         process->stop_signal = 0;
1881                     }
1882                   process->signal_to_send = process->stop_signal;
1883                   currentvec->continue_program (serv);
1884                   return 0;
1885                 }
1886             }
1887           if (process->stop_status == 'W')
1888             {
1889               if (process->pid == proc_handle.pid)
1890                 return 1;       /* Main thread exited! */
1891               else
1892                 {
1893                   currentvec->continue_program (serv);
1894                   return 0;     /* Just a thread exit, don't tell GDB. */
1895                 }
1896             }
1897
1898           process->running = 0;
1899
1900           /* This is the place to cancel its 'stepping' flag. */
1901           if (process && process->event_thread)
1902             process->event_thread->stepping = 0;
1903
1904           /* Pass this event back to GDB. */
1905           if (process->debug_backend)
1906             fprintf (stderr, "wait returned '%c' (%d) for %d.\n", 
1907                      process->stop_status, process->stop_signal, eventpid);
1908           return 1;
1909         }
1910     }
1911
1912   /* NOTE: this function is called in a polling loop, so it
1913      probably (?) should not block.  Return when there's no event. */
1914   return 0;
1915 }
1916
1917 /* Function: fromtarget_thread_break
1918    Called from the main loop when one of the child processes stops.
1919    Notifies the RDA library and lets it know which thread took the event. */
1920
1921 static void
1922 thread_db_fromtarget_thread_break (struct child_process *process)
1923 {
1924   int gdb_signal = parentvec.compute_signal (process->serv,
1925                                              process->stop_signal);
1926
1927   gdbserv_fromtarget_thread_break (process->serv, 
1928                                    process->event_thread,
1929                                    gdb_signal);
1930 }
1931
1932 /* Function: get_thread_reg
1933    Get a register value for a specific thread. */
1934
1935 static int
1936 thread_db_get_thread_reg (struct gdbserv *serv, 
1937                           struct gdbserv_thread *thread, 
1938                           int regnum, 
1939                           struct gdbserv_reg *reg)
1940 {
1941   struct child_process *process = gdbserv_target_data (serv);
1942   td_thrhandle_t thread_handle;
1943   td_thrinfo_t   ti;
1944   FPREGSET_T fpregset;
1945   GREGSET_T gregset;
1946   td_err_e ret;
1947
1948   if (thread == NULL)
1949     thread = process->event_thread;     /* Default to the event thread. */
1950
1951   if (thread_agent == NULL ||           /* Thread layer not alive yet? */
1952       thread       == NULL)             /* No thread specified? */
1953     {
1954       /* Fall back on parentvec non-threaded method. */
1955       if (parentvec.get_reg)
1956         return parentvec.get_reg (serv, regnum, reg);
1957       else
1958         return -1;      /* give up. */
1959     }
1960
1961   /* Thread_db active, thread_agent valid.
1962      The request goes to the thread_db library. 
1963      From there it will be dispatched to ps_lgetregs,
1964      and from there it will be kicked back to the parent. */
1965
1966   if (thread->ti.ti_state == TD_THR_ZOMBIE ||
1967       thread->ti.ti_state == TD_THR_UNKNOWN)
1968     {
1969       /* This thread is dead!  Can't get its registers. */
1970       return -1;
1971     }
1972
1973   ret = thread_db_map_id2thr (thread_agent, 
1974                               thread->ti.ti_tid,
1975                               &thread_handle);
1976   if (ret == TD_NOTHR)
1977     {
1978       /* Thread has exited, no registers. */
1979       return -1;
1980     }
1981   else if (ret != TD_OK)
1982     {
1983       fprintf (stderr, "<<< ERROR get_thread_reg map_id2thr %d >>>\n",
1984                thread->ti.ti_tid);
1985       return -1;        /* fail */
1986     }
1987
1988   if (is_fp_reg (regnum))
1989     {
1990       if (thread_db_getfpregs (&thread_handle, &fpregset) != TD_OK)
1991         {
1992           /* Failure to get the fpregs isn't necessarily an error.
1993              Assume that the target just doesn't support fpregs. */
1994           return 0;
1995         }
1996       /* Now extract the register from the fpregset. */
1997       if (reg_from_fpregset (serv, reg, regnum, &fpregset) < 0)
1998         {
1999           fprintf (stderr, "<<< ERROR reg_from_fpregset %d %d>>>\n",
2000                    thread->ti.ti_tid, regnum);
2001           return -1;
2002         }
2003     }
2004   else if (td_thr_getxregsize_p != NULL
2005            && td_thr_getxregs_p != NULL
2006            && is_extended_reg (regnum))
2007     {
2008       int xregsize;
2009       void *xregset;
2010
2011       if (td_thr_getxregsize_p (&thread_handle, &xregsize) != TD_OK)
2012         {
2013           /* Failure to get the size of the extended regs isn't
2014              necessarily an error.  Assume that the target just
2015              doesn't support them.  */
2016           return 0;
2017         }
2018
2019       if (xregsize <= 0)
2020         {
2021           /* Another form of not being supported...  */
2022           return 0;
2023         }
2024
2025       /* Allocate space for the extended registers.  */
2026       xregset = alloca (xregsize);
2027       
2028       /* Fetch the extended registers.  */
2029       if (td_thr_getxregs_p (&thread_handle, xregset) != TD_OK)
2030         {
2031           /* Failure to get the extended regs isn't necessarily an error.
2032              Assume that the target just doesn't support them.  */
2033           return 0;
2034         }
2035
2036       /* Now extract the register from the extended regset.  */
2037       if (reg_from_xregset (serv, reg, regnum, xregset) < 0)
2038         {
2039           fprintf (stderr, "<<< ERROR reg_from_xregset %d %d>>>\n",
2040                    thread->ti.ti_tid, regnum);
2041           return -1;
2042         }
2043     }
2044   else if (is_gp_reg (regnum)) /* GP reg */
2045     {
2046       if (thread_db_getgregs (&thread_handle, gregset) != TD_OK)
2047         {
2048           fprintf (stderr, "<<< ERROR get_thread_reg td_thr_getgregs %d >>>\n",
2049                    thread->ti.ti_tid);
2050           return -1;    /* fail */
2051         }
2052       /* Now extract the requested register from the gregset. */
2053       if (reg_from_gregset (serv, reg, regnum, gregset) < 0)
2054         {
2055           fprintf (stderr, "<<< ERROR reg_from_gregset %d %d>>>\n", 
2056                    thread->ti.ti_tid, regnum);
2057           return -1;    /* fail */
2058         }
2059     }
2060   else
2061     {
2062       /* Register not supported by this target.  This shouldn't be
2063          construed as an error though.  */
2064       return 0;
2065     }
2066
2067   return 0;             /* success */
2068 }
2069
2070 /* Function: set_thread_reg
2071    Set a register value for a specific thread. */
2072
2073 static int
2074 thread_db_set_thread_reg (struct gdbserv *serv, 
2075                           struct gdbserv_thread *thread, 
2076                           int regnum, 
2077                           const struct gdbserv_reg *reg)
2078 {
2079   struct child_process *process = gdbserv_target_data (serv);
2080   td_thrhandle_t thread_handle;
2081   FPREGSET_T fpregset;
2082   GREGSET_T gregset;
2083   td_err_e ret;
2084
2085   if (thread == NULL)
2086     thread = process->event_thread;     /* Default to the event thread. */
2087
2088   if (thread_agent == NULL ||           /* Thread layer not alive yet? */
2089       thread       == NULL)             /* No thread specified? */
2090     {
2091       /* Fall back on parentvec non-threaded method. */
2092       if (parentvec.set_reg)
2093         return parentvec.set_reg (serv, regnum, (struct gdbserv_reg *) reg);
2094       else
2095         return -1;      /* give up. */
2096     }
2097
2098   /* Thread_db active, thread_agent valid.
2099      The request goes to the thread_db library. 
2100      From there it will be dispatched to ps_lsetregs,
2101      and from there it will be kicked back to the parent. */
2102
2103   if (thread->ti.ti_state == TD_THR_ZOMBIE ||
2104       thread->ti.ti_state == TD_THR_UNKNOWN)
2105     {
2106       /* This thread is dead!  Can't get its registers. */
2107       return -1;
2108     }
2109
2110   ret = thread_db_map_id2thr (thread_agent, 
2111                               thread->ti.ti_tid,
2112                               &thread_handle);
2113   if (ret == TD_NOTHR)
2114     {
2115       /* Thread has exited, no registers. */
2116       return -1;
2117     }
2118   else if (ret != TD_OK)
2119     {
2120       fprintf (stderr, "<<< ERROR set_thread_reg map_id2thr %d >>>\n",
2121                thread->ti.ti_tid);
2122       return -1;        /* fail */
2123     }
2124
2125   if (is_fp_reg (regnum))
2126     {
2127       /* Get the current fpregset.  */
2128       if (thread_db_getfpregs (&thread_handle, &fpregset) != TD_OK)
2129         {
2130           /* Failing to get the fpregs is not necessarily an error.
2131              Assume it simply means that this target doesn't support
2132              fpregs. */
2133           return 0;
2134         }
2135       /* Now write the new reg value into the fpregset. */
2136       if (reg_to_fpregset (serv, reg, regnum, &fpregset) < 0)
2137         {
2138           fprintf (stderr, "<<< ERROR reg_to_fpregset %d %d >>>\n",
2139                    thread->ti.ti_tid, regnum);
2140           return -1;    /* fail */
2141         }
2142       /* Now write the fpregset back to the child. */
2143       if (thread_db_setfpregs (&thread_handle, &fpregset) != TD_OK)
2144         {
2145           fprintf (stderr, "<<< ERROR set_thread_reg td_thr_setfpregs %d>>>\n",
2146                    thread->ti.ti_tid);
2147           return -1;    /* fail */
2148         }
2149     }
2150   else if (td_thr_getxregsize_p != NULL
2151            && td_thr_getxregs_p != NULL
2152            && td_thr_setxregs_p != NULL
2153            && is_extended_reg (regnum))
2154     {
2155       int xregsize;
2156       void *xregset;
2157
2158       if (td_thr_getxregsize_p (&thread_handle, &xregsize) != TD_OK)
2159         {
2160           /* Failure to get the size of the extended regs isn't
2161              necessarily an error.  Assume that the target just
2162              doesn't support them.  */
2163           return 0;
2164         }
2165
2166       if (xregsize <= 0)
2167         {
2168           /* Another form of not being supported...  */
2169           return 0;
2170         }
2171
2172       /* Allocate space for the extended registers.  */
2173       xregset = alloca (xregsize);
2174
2175       /* Fetch the extended registers.  */
2176       if (td_thr_getxregs_p (&thread_handle, xregset) != TD_OK)
2177         {
2178           /* Failure to get the extended regs isn't necessarily an error.
2179              Assume that the target just doesn't support them.  */
2180           return 0;
2181         }
2182       /* Now write the new reg value into the extended regset. */
2183       if (reg_to_xregset (serv, reg, regnum, xregset) < 0)
2184         {
2185           fprintf (stderr, "<<< ERROR reg_to_xregset %d %d >>>\n", 
2186                    thread->ti.ti_tid, regnum);
2187           return -1;    /* fail */
2188         }
2189       /* Now write the extended regset back to the child. */
2190       if (td_thr_setxregs_p (&thread_handle, gregset) != TD_OK)
2191         {
2192           fprintf (stderr, "<<< ERROR set_thread_reg td_thr_setxregs %d >>>\n",
2193                    thread->ti.ti_tid);
2194           return -1;    /* fail */
2195         }
2196     }
2197   else if (is_gp_reg (regnum))
2198     {
2199       /* First get the current gregset.  */
2200       if (thread_db_getgregs (&thread_handle, gregset) != TD_OK)
2201         {
2202           fprintf (stderr, "<<< ERROR set_thread_reg td_thr_getgregs %d >>>\n",
2203                    thread->ti.ti_tid);
2204           return -1;    /* fail */
2205         }
2206       /* Now write the new reg value into the gregset. */
2207       if (reg_to_gregset (serv, reg, regnum, gregset) < 0)
2208         {
2209           fprintf (stderr, "<<< ERROR reg_to_gregset %d %d >>>\n", 
2210                    thread->ti.ti_tid, regnum);
2211           return -1;    /* fail */
2212         }
2213       /* Now write the gregset back to the child. */
2214       if (thread_db_setgregs (&thread_handle, gregset) != TD_OK)
2215         {
2216           fprintf (stderr, "<<< ERROR set_thread_reg td_thr_setgregs %d >>>\n",
2217                    thread->ti.ti_tid);
2218           return -1;    /* fail */
2219         }
2220     }
2221
2222   return 0;     /* success */
2223 }
2224
2225 /* Function: thread_db_attach
2226    gdbserv target function called upon attaching to gdb. 
2227    Return -1 for failure, zero for success. 
2228    Note that this has nothing to do with attaching to a running process
2229    (which in fact we don't even know how to do), or a running thread. */
2230
2231 int
2232 thread_db_attach (struct gdbserv *serv, struct gdbserv_target *target)
2233 {
2234   td_err_e ret;
2235   struct child_process *process = target->data;
2236   extern struct server_vector gdbserver;
2237   paddr_t dummy;
2238
2239   if ((thread_db_dlopen ()) < 0)
2240     return -1;                  /* fail */
2241
2242   /* Save a copy of the existing target vector before we modify it. */
2243   memcpy (&parentvec, target, sizeof (parentvec));
2244   /* Save a pointer to the actual target vector. */
2245   currentvec = target;
2246
2247   /* Initialize the library.  */
2248   if ((ret = td_init_p ()) != TD_OK)
2249     {
2250       fprintf (stderr, 
2251                "Cannot initialize libthread_db: %s", thread_db_err_str (ret));
2252       currentvec = NULL;
2253       return -1;                /* fail */
2254     }
2255
2256   /* Initialize threadish target methods. */
2257   target->thread_info         = thread_db_thread_info;
2258   target->thread_next         = thread_db_thread_next;
2259   target->thread_id           = thread_db_thread_id;
2260   target->thread_lookup_by_id = thread_db_thread_lookup_by_id;
2261   target->process_set_gen     = thread_db_set_gen;
2262   target->process_get_gen     = thread_db_get_gen;
2263   target->detach              = thread_db_detach;
2264
2265   /* Take over selected target methods. */
2266   target->exit_program        = thread_db_exit_program;
2267   target->continue_program    = thread_db_continue_program;
2268   target->singlestep_program  = thread_db_singlestep_program;
2269
2270   target->continue_thread     = thread_db_continue_thread;
2271   target->singlestep_thread   = thread_db_singlestep_thread;
2272
2273   /* Take over get_reg / set_reg methods with threaded versions. */
2274   if (target->next_gg_reg != NULL &&
2275       target->reg_format  != NULL &&
2276       target->output_reg  != NULL &&
2277       target->input_reg   != NULL)
2278     {
2279       target->get_thread_reg      = thread_db_get_thread_reg;
2280       target->set_thread_reg      = thread_db_set_thread_reg;
2281     }
2282   else
2283     fprintf (stderr, "< ERROR attach: GDB will not read thread regs. >>>\n");
2284
2285   /* KLUDGE: Insert some magic symbols into the cached symbol list,
2286      to be looked up later.  This is badly wrong -- we should be 
2287      obtaining these values thru the thread_db interface.  Their names
2288      should not be hard-coded here <sob>. */
2289   add_symbol_to_list ("__pthread_sig_restart",   0, UNDEFINED);
2290   add_symbol_to_list ("__pthread_sig_cancel",    0, UNDEFINED);
2291   add_symbol_to_list ("__pthread_sig_debug",     0, UNDEFINED);
2292   add_symbol_to_list ("__pthread_threads_debug", 0, UNDEFINED);
2293
2294   /* Attempt to open the thread_db interface.  This attempt will 
2295      most likely fail (unles the child is statically linked). */
2296   thread_db_open (serv, process->pid);  /* Don't test return value */
2297
2298   /* Take over the "wait" vector. FIXME global object */
2299   gdbserver.check_child_state = thread_db_check_child_state;
2300   /* Take over the "fromtarget_break" vector. FIXME global object */
2301   gdbserver.fromtarget_break = thread_db_fromtarget_thread_break;
2302   /* FIXME what about terminate and exit? */
2303
2304   /* Set up the regset caches.  */
2305   initialize_regset_caches ();
2306   return 0;             /* success */
2307 }