OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [lin-thread.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Multi-threaded debugging support for the thread_db interface,
2
   used on operating systems such as Solaris and Linux.
3
   Copyright 1999 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 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
/* This module implements a thread_stratum target that sits on top of
23
   a normal process_stratum target (such as procfs or ptrace).  The
24
   process_stratum target must install this thread_stratum target when
25
   it detects the presence of the thread_db shared library.
26
 
27
   This module will then use the thread_db API to add thread-awareness
28
   to the functionality provided by the process_stratum target (or in
29
   some cases, to add user-level thread awareness on top of the
30
   kernel-level thread awareness that is already provided by the
31
   process_stratum target).
32
 
33
   Solaris threads (for instance) are a multi-level thread implementation;
34
   the kernel provides a Light Weight Process (LWP) which the procfs
35
   process_stratum module is aware of.  This module must then mediate
36
   the relationship between kernel LWP threads and user (eg. posix)
37
   threads.
38
 
39
   Linux threads are likely to be different -- but the thread_db
40
   library API should make the difference largely transparent to GDB.
41
 
42
   */
43
 
44
/* The thread_db API provides a number of functions that give the caller
45
   access to the inner workings of the child process's thread library.
46
   We will be using the following (others may be added):
47
 
48
   td_thr_validate              Confirm valid "live" thread
49
   td_thr_get_info              Get info about a thread
50
   td_thr_getgregs              Get thread's general registers
51
   td_thr_getfpregs             Get thread's floating point registers
52
   td_thr_setgregs              Set thread's general registers
53
   td_thr_setfpregs             Set thread's floating point registers
54
   td_ta_map_id2thr             Get thread handle from thread id
55
   td_ta_map_lwp2thr            Get thread handle from LWP id
56
   td_ta_thr_iter               Iterate over all threads (with callback)
57
 
58
   In return, the debugger has to provide certain services to the
59
   thread_db library.  Some of these aren't actually required to do
60
   anything in practice.  For instance, the thread_db expects to be
61
   able to stop the child process and start it again: but in our
62
   context, the child process will always be stopped already when we
63
   invoke the thread_db library, so the functions that we provide for
64
   the library to stop and start the child process are no-ops.
65
 
66
   Here is the list of functions which we export to the thread_db
67
   library, divided into no-op functions vs. functions that actually
68
   have to do something:
69
 
70
   No-op functions:
71
 
72
   ps_pstop                     Stop the child process
73
   ps_pcontinue                 Continue the child process
74
   ps_lstop                     Stop a specific LWP (kernel thread)
75
   ps_lcontinue                 Continue an LWP
76
   ps_lgetxregsize              Get size of LWP's xregs (sparc)
77
   ps_lgetxregs                 Get LWP's xregs (sparc)
78
   ps_lsetxregs                 Set LWP's xregs (sparc)
79
 
80
   Functions that have to do useful work:
81
 
82
   ps_pglobal_lookup            Get the address of a global symbol
83
   ps_pdread                    Read memory, data segment
84
   ps_ptread                    Read memory, text segment
85
   ps_pdwrite                   Write memory, data segment
86
   ps_ptwrite                   Write memory, text segment
87
   ps_lgetregs                  Get LWP's general registers
88
   ps_lgetfpregs                Get LWP's floating point registers
89
   ps_lsetregs                  Set LWP's general registers
90
   ps_lsetfpregs                Set LWP's floating point registers
91
   ps_lgetLDT                   Get LWP's Local Descriptor Table (x86)
92
 
93
   Thus, if we ask the thread_db library to give us the general registers
94
   for user thread X, thread_db may figure out that user thread X is
95
   actually mapped onto kernel thread Y.  Thread_db does not know how
96
   to obtain the registers for kernel thread Y, but GDB does, so thread_db
97
   turns the request right back to us via the ps_lgetregs callback.  */
98
 
99
#include "defs.h"
100
#include "gdbthread.h"
101
#include "target.h"
102
#include "inferior.h"
103
#include "gdbcmd.h"
104
 
105
#include "gdb_wait.h"
106
 
107
#include <time.h>
108
 
109
#if defined(USE_PROC_FS) || defined(HAVE_GREGSET_T)
110
#include <sys/procfs.h>
111
#endif
112
 
113
#if defined (HAVE_PROC_SERVICE_H)
114
#include <proc_service.h>       /* defines incoming API (ps_* callbacks) */
115
#else
116
#include "gdb_proc_service.h"
117
#endif
118
 
119
#if defined HAVE_STDINT_H       /* Pre-5.2 systems don't have this header */
120
#if defined (HAVE_THREAD_DB_H)
121
#include <thread_db.h>          /* defines outgoing API (td_thr_* calls) */
122
#else
123
#include "gdb_thread_db.h"
124
#endif
125
 
126
#include <dlfcn.h>              /* dynamic library interface */
127
 
128
#ifndef TIDGET
129
#define TIDGET(PID)             (((PID) & 0x7fffffff) >> 16)
130
#define PIDGET(PID)             (((PID) & 0xffff))
131
#define MERGEPID(PID, TID)      (((PID) & 0xffff) | ((TID) << 16))
132
#endif
133
 
134
/* Macros for superimposing PID and TID into inferior_pid.  */
135
#define THREAD_FLAG             0x80000000
136
#define is_thread(ARG)          (((ARG) & THREAD_FLAG) != 0)
137
#define is_lwp(ARG)             (((ARG) & THREAD_FLAG) == 0)
138
#define GET_LWP(PID)            TIDGET (PID)
139
#define GET_THREAD(PID)         TIDGET (PID)
140
#define BUILD_LWP(TID, PID)     MERGEPID (PID, TID)
141
#define BUILD_THREAD(TID, PID)  (MERGEPID (PID, TID) | THREAD_FLAG)
142
 
143
/*
144
 * target_beneath is a pointer to the target_ops underlying this one.
145
 */
146
 
147
static struct target_ops *target_beneath;
148
 
149
 
150
/*
151
 * target vector defined in this module:
152
 */
153
 
154
static struct target_ops thread_db_ops;
155
 
156
/*
157
 * Typedefs required to resolve differences between the thread_db
158
 * and proc_service API defined on different versions of Solaris:
159
 */
160
 
161
#if defined(PROC_SERVICE_IS_OLD)
162
typedef const struct ps_prochandle *gdb_ps_prochandle_t;
163
typedef char *gdb_ps_read_buf_t;
164
typedef char *gdb_ps_write_buf_t;
165
typedef int gdb_ps_size_t;
166
#else
167
typedef struct ps_prochandle *gdb_ps_prochandle_t;
168
typedef void *gdb_ps_read_buf_t;
169
typedef const void *gdb_ps_write_buf_t;
170
typedef size_t gdb_ps_size_t;
171
#endif
172
 
173
/* Unfortunately glibc 2.1.3 was released with a broken prfpregset_t
174
   type.  We let configure check for this lossage, and make
175
   appropriate typedefs here.  */
176
 
177
#ifdef PRFPREGSET_T_BROKEN
178
typedef elf_fpregset_t gdb_prfpregset_t;
179
#else
180
typedef prfpregset_t gdb_prfpregset_t;
181
#endif
182
 
183
/*
184
 * proc_service callback functions, called by thread_db.
185
 */
186
 
187
ps_err_e
188
ps_pstop (gdb_ps_prochandle_t ph)               /* Process stop */
189
{
190
  return PS_OK;
191
}
192
 
193
ps_err_e
194
ps_pcontinue (gdb_ps_prochandle_t ph)           /* Process continue */
195
{
196
  return PS_OK;
197
}
198
 
199
ps_err_e
200
ps_lstop (gdb_ps_prochandle_t ph,               /* LWP stop */
201
          lwpid_t lwpid)
202
{
203
  return PS_OK;
204
}
205
 
206
ps_err_e
207
ps_lcontinue (gdb_ps_prochandle_t ph,           /* LWP continue */
208
              lwpid_t lwpid)
209
{
210
  return PS_OK;
211
}
212
 
213
ps_err_e
214
ps_lgetxregsize (gdb_ps_prochandle_t ph,        /* Get XREG size */
215
                 lwpid_t lwpid,
216
                 int *xregsize)
217
{
218
  return PS_OK;
219
}
220
 
221
ps_err_e
222
ps_lgetxregs (gdb_ps_prochandle_t ph,           /* Get XREGS */
223
              lwpid_t lwpid,
224
              caddr_t xregset)
225
{
226
  return PS_OK;
227
}
228
 
229
ps_err_e
230
ps_lsetxregs (gdb_ps_prochandle_t ph,           /* Set XREGS */
231
              lwpid_t lwpid,
232
              caddr_t xregset)
233
{
234
  return PS_OK;
235
}
236
 
237
void
238
ps_plog (const char *fmt, ...)
239
{
240
  va_list args;
241
 
242
  va_start (args, fmt);
243
  vfprintf_filtered (gdb_stderr, fmt, args);
244
}
245
 
246
/* Look up a symbol in GDB's global symbol table.
247
   Return the symbol's address.
248
   FIXME: it would be more correct to look up the symbol in the context
249
   of the LD_OBJECT_NAME provided.  However we're probably fairly safe
250
   as long as there aren't name conflicts with other libraries.  */
251
 
252
ps_err_e
253
ps_pglobal_lookup (gdb_ps_prochandle_t ph,
254
                   const char *ld_object_name,  /* the library name */
255
                   const char *ld_symbol_name,  /* the symbol name */
256
                   paddr_t    *ld_symbol_addr)  /* return the symbol addr */
257
{
258
  struct minimal_symbol *ms;
259
 
260
  ms = lookup_minimal_symbol (ld_symbol_name, NULL, NULL);
261
 
262
  if (!ms)
263
    return PS_NOSYM;
264
 
265
  *ld_symbol_addr = SYMBOL_VALUE_ADDRESS (ms);
266
 
267
  return PS_OK;
268
}
269
 
270
/* Worker function for all memory reads and writes: */
271
static ps_err_e rw_common (const struct ps_prochandle *ph,
272
                           paddr_t addr,
273
                           char *buf,
274
                           int size,
275
                           int write_p);
276
 
277
/* target_xfer_memory direction consts */
278
enum {PS_READ = 0, PS_WRITE = 1};
279
 
280
ps_err_e
281
ps_pdread (gdb_ps_prochandle_t ph,      /* read from data segment */
282
           paddr_t             addr,
283
           gdb_ps_read_buf_t   buf,
284
           gdb_ps_size_t       size)
285
{
286
  return rw_common (ph, addr, buf, size, PS_READ);
287
}
288
 
289
ps_err_e
290
ps_pdwrite (gdb_ps_prochandle_t ph,     /* write to data segment */
291
            paddr_t             addr,
292
            gdb_ps_write_buf_t  buf,
293
            gdb_ps_size_t       size)
294
{
295
  return rw_common (ph, addr, (char *) buf, size, PS_WRITE);
296
}
297
 
298
ps_err_e
299
ps_ptread (gdb_ps_prochandle_t ph,      /* read from text segment */
300
           paddr_t             addr,
301
           gdb_ps_read_buf_t   buf,
302
           gdb_ps_size_t       size)
303
{
304
  return rw_common (ph, addr, buf, size, PS_READ);
305
}
306
 
307
ps_err_e
308
ps_ptwrite (gdb_ps_prochandle_t ph,     /* write to text segment */
309
            paddr_t             addr,
310
            gdb_ps_write_buf_t  buf,
311
            gdb_ps_size_t       size)
312
{
313
  return rw_common (ph, addr, (char *) buf, size, PS_WRITE);
314
}
315
 
316
static struct cleanup *save_inferior_pid    (void);
317
static void            restore_inferior_pid (void *saved_pid);
318
static char *thr_err_string   (td_err_e);
319
static char *thr_state_string (td_thr_state_e);
320
 
321
struct ps_prochandle {
322
  int pid;
323
};
324
 
325
struct ps_prochandle main_prochandle;
326
td_thragent_t *      main_threadagent;
327
 
328
/*
329
 * Common proc_service routine for reading and writing memory.
330
 */
331
 
332
/* FIXME: once we've munged the inferior_pid, why can't we
333
   simply call target_read/write_memory and return?  */
334
 
335
 
336
static ps_err_e
337
rw_common (const struct ps_prochandle *ph,
338
           paddr_t addr,
339
           char   *buf,
340
           int     size,
341
           int     write_p)
342
{
343
  struct cleanup *old_chain = save_inferior_pid ();
344
  int to_do = size;
345
  int done  = 0;
346
 
347
  inferior_pid = main_prochandle.pid;
348
 
349
  while (to_do > 0)
350
    {
351
      done = current_target.to_xfer_memory (addr, buf, size, write_p,
352
                                            &current_target);
353
      if (done <= 0)
354
        {
355
          if (write_p == PS_READ)
356
            print_sys_errmsg ("rw_common (): read", errno);
357
          else
358
            print_sys_errmsg ("rw_common (): write", errno);
359
 
360
          return PS_ERR;
361
        }
362
      to_do -= done;
363
      buf   += done;
364
    }
365
  do_cleanups (old_chain);
366
  return PS_OK;
367
}
368
 
369
/* Cleanup functions used by the register callbacks
370
   (which have to manipulate the global inferior_pid).  */
371
 
372
ps_err_e
373
ps_lgetregs (gdb_ps_prochandle_t ph,            /* Get LWP general regs */
374
             lwpid_t     lwpid,
375
             prgregset_t gregset)
376
{
377
  struct cleanup *old_chain = save_inferior_pid ();
378
 
379
  inferior_pid = BUILD_LWP (lwpid, main_prochandle.pid);
380
  current_target.to_fetch_registers (-1);
381
 
382
  fill_gregset (gregset, -1);
383
  do_cleanups (old_chain);
384
 
385
  return PS_OK;
386
}
387
 
388
ps_err_e
389
ps_lsetregs (gdb_ps_prochandle_t ph,            /* Set LWP general regs */
390
             lwpid_t           lwpid,
391
             const prgregset_t gregset)
392
{
393
  struct cleanup *old_chain = save_inferior_pid ();
394
 
395
  inferior_pid = BUILD_LWP (lwpid, main_prochandle.pid);
396
  supply_gregset (gregset);
397
  current_target.to_store_registers (-1);
398
  do_cleanups (old_chain);
399
  return PS_OK;
400
}
401
 
402
ps_err_e
403
ps_lgetfpregs (gdb_ps_prochandle_t ph,          /* Get LWP float regs */
404
               lwpid_t       lwpid,
405
               gdb_prfpregset_t *fpregset)
406
{
407
  struct cleanup *old_chain = save_inferior_pid ();
408
 
409
  inferior_pid = BUILD_LWP (lwpid, main_prochandle.pid);
410
  current_target.to_fetch_registers (-1);
411
  fill_fpregset (fpregset, -1);
412
  do_cleanups (old_chain);
413
  return PS_OK;
414
}
415
 
416
ps_err_e
417
ps_lsetfpregs (gdb_ps_prochandle_t ph,          /* Set LWP float regs */
418
               lwpid_t             lwpid,
419
               const gdb_prfpregset_t *fpregset)
420
{
421
  struct cleanup *old_chain = save_inferior_pid ();
422
 
423
  inferior_pid = BUILD_LWP (lwpid, main_prochandle.pid);
424
  supply_fpregset (fpregset);
425
  current_target.to_store_registers (-1);
426
  do_cleanups (old_chain);
427
  return PS_OK;
428
}
429
 
430
/*
431
 * ps_getpid
432
 *
433
 * return the main pid for the child process
434
 * (special for Linux -- not used on Solaris)
435
 */
436
 
437
pid_t
438
ps_getpid (gdb_ps_prochandle_t ph)
439
{
440
  return ph->pid;
441
}
442
 
443
#ifdef TM_I386SOL2_H
444
 
445
/* Reads the local descriptor table of a LWP.  */
446
 
447
ps_err_e
448
ps_lgetLDT (gdb_ps_prochandle_t ph, lwpid_t lwpid,
449
            struct ssd *pldt)
450
{
451
  /* NOTE: only used on Solaris, therefore OK to refer to procfs.c */
452
  extern struct ssd *procfs_find_LDT_entry (int);
453
  struct ssd *ret;
454
 
455
  ret = procfs_find_LDT_entry (BUILD_LWP (lwpid,
456
                                          PIDGET (main_prochandle.pid)));
457
  if (ret)
458
    {
459
      memcpy (pldt, ret, sizeof (struct ssd));
460
      return PS_OK;
461
    }
462
  else  /* LDT not found. */
463
    return PS_ERR;
464
}
465
#endif /* TM_I386SOL2_H */
466
 
467
/*
468
 * Pointers to thread_db functions:
469
 *
470
 * These are a dynamic library mechanism.
471
 * The dlfcn.h interface will be used to initialize these
472
 * so that they point to the appropriate functions in the
473
 * thread_db dynamic library.  This is done dynamically
474
 * so that GDB can still run on systems that lack thread_db.
475
 */
476
 
477
static td_err_e (*p_td_init)              (void);
478
 
479
static td_err_e (*p_td_ta_new)            (const struct ps_prochandle *ph_p,
480
                                           td_thragent_t **ta_pp);
481
 
482
static td_err_e (*p_td_ta_delete)         (td_thragent_t *ta_p);
483
 
484
static td_err_e (*p_td_ta_get_nthreads)   (const td_thragent_t *ta_p,
485
                                           int *nthread_p);
486
 
487
 
488
static td_err_e (*p_td_ta_thr_iter)       (const td_thragent_t *ta_p,
489
                                           td_thr_iter_f *cb,
490
                                           void *cbdata_p,
491
                                           td_thr_state_e state,
492
                                           int ti_pri,
493
                                           sigset_t *ti_sigmask_p,
494
                                           unsigned ti_user_flags);
495
 
496
static td_err_e (*p_td_ta_event_addr)     (const td_thragent_t *ta_p,
497
                                           u_long event,
498
                                           td_notify_t *notify_p);
499
 
500
static td_err_e (*p_td_ta_event_getmsg)   (const td_thragent_t *ta_p,
501
                                           td_event_msg_t *msg);
502
 
503
static td_err_e (*p_td_ta_set_event)      (const td_thragent_t *ta_p,
504
                                           td_thr_events_t *events);
505
 
506
static td_err_e (*p_td_thr_validate)      (const td_thrhandle_t *th_p);
507
 
508
static td_err_e (*p_td_thr_event_enable)  (const td_thrhandle_t *th_p,
509
                                           int on_off);
510
 
511
static td_err_e (*p_td_thr_get_info)      (const td_thrhandle_t *th_p,
512
                                           td_thrinfo_t *ti_p);
513
 
514
static td_err_e (*p_td_thr_getgregs)      (const td_thrhandle_t *th_p,
515
                                           prgregset_t regset);
516
 
517
static td_err_e (*p_td_thr_setgregs)      (const td_thrhandle_t *th_p,
518
                                           const prgregset_t regset);
519
 
520
static td_err_e (*p_td_thr_getfpregs)     (const td_thrhandle_t *th_p,
521
                                           gdb_prfpregset_t *fpregset);
522
 
523
static td_err_e (*p_td_thr_setfpregs)     (const td_thrhandle_t *th_p,
524
                                           const gdb_prfpregset_t *fpregset);
525
 
526
static td_err_e (*p_td_ta_map_id2thr)     (const td_thragent_t *ta_p,
527
                                           thread_t tid,
528
                                           td_thrhandle_t *th_p);
529
 
530
static td_err_e (*p_td_ta_map_lwp2thr)    (const td_thragent_t *ta_p,
531
                                           lwpid_t lwpid,
532
                                           td_thrhandle_t *th_p);
533
 
534
/*
535
 * API and target vector initialization function: thread_db_initialize.
536
 *
537
 * NOTE: this function is deliberately NOT named with the GDB convention
538
 * of module initializer function names that begin with "_initialize".
539
 * This module is NOT intended to be auto-initialized at GDB startup.
540
 * Rather, it will only be initialized when a multi-threaded child
541
 * process is detected.
542
 *
543
 */
544
 
545
/*
546
 * Initializer for thread_db library interface.
547
 * This function does the dynamic library stuff (dlopen, dlsym),
548
 * and then calls the thread_db library's one-time initializer
549
 * function (td_init).  If everything succeeds, this function
550
 * returns true; otherwise it returns false, and this module
551
 * cannot be used.
552
 */
553
 
554
static int
555
init_thread_db_library ()
556
{
557
  void *dlhandle;
558
  td_err_e ret;
559
 
560
  /* Open a handle to the "thread_db" dynamic library.  */
561
  if ((dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW)) == NULL)
562
    return 0;                    /* fail */
563
 
564
  /* Initialize pointers to the dynamic library functions we will use.
565
   * Note that we are not calling the functions here -- we are only
566
   * establishing pointers to them.
567
   */
568
 
569
  /* td_init: initialize thread_db library. */
570
  if ((p_td_init = dlsym (dlhandle, "td_init")) == NULL)
571
    return 0;                    /* fail */
572
  /* td_ta_new: register a target process with thread_db.  */
573
  if ((p_td_ta_new = dlsym (dlhandle, "td_ta_new")) == NULL)
574
    return 0;                    /* fail */
575
  /* td_ta_delete: un-register a target process with thread_db.  */
576
  if ((p_td_ta_delete = dlsym (dlhandle, "td_ta_delete")) == NULL)
577
    return 0;                    /* fail */
578
 
579
  /* td_ta_map_id2thr: get thread handle from thread id.  */
580
  if ((p_td_ta_map_id2thr = dlsym (dlhandle, "td_ta_map_id2thr")) == NULL)
581
    return 0;                    /* fail */
582
  /* td_ta_map_lwp2thr: get thread handle from lwp id.  */
583
  if ((p_td_ta_map_lwp2thr = dlsym (dlhandle, "td_ta_map_lwp2thr")) == NULL)
584
    return 0;                    /* fail */
585
  /* td_ta_get_nthreads: get number of threads in target process.  */
586
  if ((p_td_ta_get_nthreads = dlsym (dlhandle, "td_ta_get_nthreads")) == NULL)
587
    return 0;                    /* fail */
588
  /* td_ta_thr_iter: iterate over all thread handles.  */
589
  if ((p_td_ta_thr_iter = dlsym (dlhandle, "td_ta_thr_iter")) == NULL)
590
    return 0;                    /* fail */
591
 
592
  /* td_thr_validate: make sure a thread handle is real and alive.  */
593
  if ((p_td_thr_validate = dlsym (dlhandle, "td_thr_validate")) == NULL)
594
    return 0;                    /* fail */
595
  /* td_thr_get_info: get a bunch of info about a thread.  */
596
  if ((p_td_thr_get_info = dlsym (dlhandle, "td_thr_get_info")) == NULL)
597
    return 0;                    /* fail */
598
  /* td_thr_getgregs: get general registers for thread.  */
599
  if ((p_td_thr_getgregs = dlsym (dlhandle, "td_thr_getgregs")) == NULL)
600
    return 0;                    /* fail */
601
  /* td_thr_setgregs: set general registers for thread.  */
602
  if ((p_td_thr_setgregs = dlsym (dlhandle, "td_thr_setgregs")) == NULL)
603
    return 0;                    /* fail */
604
  /* td_thr_getfpregs: get floating point registers for thread.  */
605
  if ((p_td_thr_getfpregs = dlsym (dlhandle, "td_thr_getfpregs")) == NULL)
606
    return 0;                    /* fail */
607
  /* td_thr_setfpregs: set floating point registers for thread.  */
608
  if ((p_td_thr_setfpregs = dlsym (dlhandle, "td_thr_setfpregs")) == NULL)
609
    return 0;                    /* fail */
610
 
611
  ret = p_td_init ();
612
  if (ret != TD_OK)
613
    {
614
      warning ("init_thread_db: td_init: %s", thr_err_string (ret));
615
      return 0;
616
    }
617
 
618
  /* Optional functions:
619
     We can still debug even if the following functions are not found.  */
620
 
621
  /* td_ta_event_addr: get the breakpoint address for specified event.  */
622
  p_td_ta_event_addr = dlsym (dlhandle, "td_ta_event_addr");
623
 
624
  /* td_ta_event_getmsg: get the next event message for the process.  */
625
  p_td_ta_event_getmsg = dlsym (dlhandle, "td_ta_event_getmsg");
626
 
627
  /* td_ta_set_event: request notification of an event.  */
628
  p_td_ta_set_event = dlsym (dlhandle, "td_ta_set_event");
629
 
630
  /* td_thr_event_enable: enable event reporting in a thread.  */
631
  p_td_thr_event_enable = dlsym (dlhandle, "td_thr_event_enable");
632
 
633
  return 1;                     /* success */
634
}
635
 
636
/*
637
 * Local utility functions:
638
 */
639
 
640
 
641
/*
642
 
643
   LOCAL FUNCTION
644
 
645
   save_inferior_pid - Save inferior_pid on the cleanup list
646
   restore_inferior_pid - Restore inferior_pid from the cleanup list
647
 
648
   SYNOPSIS
649
 
650
   struct cleanup *save_inferior_pid (void);
651
   void            restore_inferior_pid (void *saved_pid);
652
 
653
   DESCRIPTION
654
 
655
   These two functions act in unison to restore inferior_pid in
656
   case of an error.
657
 
658
   NOTES
659
 
660
   inferior_pid is a global variable that needs to be changed by many
661
   of these routines before calling functions in procfs.c.  In order
662
   to guarantee that inferior_pid gets restored (in case of errors),
663
   you need to call save_inferior_pid before changing it.  At the end
664
   of the function, you should invoke do_cleanups to restore it.
665
 
666
 */
667
 
668
static struct cleanup *
669
save_inferior_pid (void)
670
{
671
  int *saved_pid_ptr;
672
 
673
  saved_pid_ptr = xmalloc (sizeof (int));
674
  *saved_pid_ptr = inferior_pid;
675
  return make_cleanup (restore_inferior_pid, saved_pid_ptr);
676
}
677
 
678
static void
679
restore_inferior_pid (void *arg)
680
{
681
  int *saved_pid_ptr = arg;
682
  inferior_pid = *saved_pid_ptr;
683
  free (arg);
684
}
685
 
686
/*
687
 
688
   LOCAL FUNCTION
689
 
690
   thr_err_string - Convert a thread_db error code to a string
691
 
692
   SYNOPSIS
693
 
694
   char * thr_err_string (errcode)
695
 
696
   DESCRIPTION
697
 
698
   Return a string description of the thread_db errcode.  If errcode
699
   is unknown, then return an <unknown> message.
700
 
701
 */
702
 
703
static char *
704
thr_err_string (errcode)
705
     td_err_e errcode;
706
{
707
  static char buf[50];
708
 
709
  switch (errcode) {
710
  case TD_OK:           return "generic 'call succeeded'";
711
  case TD_ERR:          return "generic error";
712
  case TD_NOTHR:        return "no thread to satisfy query";
713
  case TD_NOSV:         return "no sync handle to satisfy query";
714
  case TD_NOLWP:        return "no lwp to satisfy query";
715
  case TD_BADPH:        return "invalid process handle";
716
  case TD_BADTH:        return "invalid thread handle";
717
  case TD_BADSH:        return "invalid synchronization handle";
718
  case TD_BADTA:        return "invalid thread agent";
719
  case TD_BADKEY:       return "invalid key";
720
  case TD_NOMSG:        return "no event message for getmsg";
721
  case TD_NOFPREGS:     return "FPU register set not available";
722
  case TD_NOLIBTHREAD:  return "application not linked with libthread";
723
  case TD_NOEVENT:      return "requested event is not supported";
724
  case TD_NOCAPAB:      return "capability not available";
725
  case TD_DBERR:        return "debugger service failed";
726
  case TD_NOAPLIC:      return "operation not applicable to";
727
  case TD_NOTSD:        return "no thread-specific data for this thread";
728
  case TD_MALLOC:       return "malloc failed";
729
  case TD_PARTIALREG:   return "only part of register set was written/read";
730
  case TD_NOXREGS:      return "X register set not available for this thread";
731
  default:
732
    sprintf (buf, "unknown thread_db error '%d'", errcode);
733
    return buf;
734
  }
735
}
736
 
737
/*
738
 
739
   LOCAL FUNCTION
740
 
741
   thr_state_string - Convert a thread_db state code to a string
742
 
743
   SYNOPSIS
744
 
745
   char *thr_state_string (statecode)
746
 
747
   DESCRIPTION
748
 
749
   Return the thread_db state string associated with statecode.
750
   If statecode is unknown, then return an <unknown> message.
751
 
752
 */
753
 
754
static char *
755
thr_state_string (statecode)
756
     td_thr_state_e statecode;
757
{
758
  static char buf[50];
759
 
760
  switch (statecode) {
761
  case TD_THR_STOPPED:          return "stopped by debugger";
762
  case TD_THR_RUN:              return "runnable";
763
  case TD_THR_ACTIVE:           return "active";
764
  case TD_THR_ZOMBIE:           return "zombie";
765
  case TD_THR_SLEEP:            return "sleeping";
766
  case TD_THR_STOPPED_ASLEEP:   return "stopped by debugger AND blocked";
767
  default:
768
    sprintf (buf, "unknown thread_db state %d", statecode);
769
    return buf;
770
  }
771
}
772
 
773
/*
774
 * Local thread/event list.
775
 * This data structure will be used to hold a list of threads and
776
 * pending/deliverable events.
777
 */
778
 
779
typedef struct THREADINFO {
780
  thread_t       tid;           /* thread ID */
781
  pid_t          lid;           /* process/lwp ID */
782
  td_thr_state_e state;         /* thread state (a la thread_db) */
783
  td_thr_type_e  type;          /* thread type (a la thread_db) */
784
  int            pending;       /* true if holding a pending event */
785
  int            status;        /* wait status of any interesting event */
786
} threadinfo;
787
 
788
threadinfo * threadlist;
789
int threadlist_max = 0;          /* current size of table */
790
int threadlist_top = 0;          /* number of threads now in table */
791
#define THREADLIST_ALLOC 100    /* chunk size by which to expand table */
792
 
793
static threadinfo *
794
insert_thread (tid, lid, state, type)
795
     int            tid;
796
     int            lid;
797
     td_thr_state_e state;
798
     td_thr_type_e  type;
799
{
800
  if (threadlist_top >= threadlist_max)
801
    {
802
      threadlist_max += THREADLIST_ALLOC;
803
      threadlist      = realloc (threadlist,
804
                                 threadlist_max * sizeof (threadinfo));
805
      if (threadlist == NULL)
806
        return NULL;
807
    }
808
  threadlist[threadlist_top].tid     = tid;
809
  threadlist[threadlist_top].lid     = lid;
810
  threadlist[threadlist_top].state   = state;
811
  threadlist[threadlist_top].type    = type;
812
  threadlist[threadlist_top].pending = 0;
813
  threadlist[threadlist_top].status  = 0;
814
 
815
  return &threadlist[threadlist_top++];
816
}
817
 
818
static void
819
empty_threadlist ()
820
{
821
  threadlist_top = 0;
822
}
823
 
824
static threadinfo *
825
next_pending_event ()
826
{
827
  int i;
828
 
829
  for (i = 0; i < threadlist_top; i++)
830
    if (threadlist[i].pending)
831
      return &threadlist[i];
832
 
833
  return NULL;
834
}
835
 
836
static void
837
threadlist_iter (func, data, state, type)
838
     int (*func) ();
839
     void *data;
840
     td_thr_state_e state;
841
     td_thr_type_e  type;
842
{
843
  int i;
844
 
845
  for (i = 0; i < threadlist_top; i++)
846
    if ((state == TD_THR_ANY_STATE || state == threadlist[i].state) &&
847
        (type  == TD_THR_ANY_TYPE  || type  == threadlist[i].type))
848
      if ((*func) (&threadlist[i], data) != 0)
849
        break;
850
 
851
  return;
852
}
853
 
854
/*
855
 * Global state
856
 *
857
 * Here we keep state information all collected in one place.
858
 */
859
 
860
/* This flag is set when we activate, so that we don't do it twice.
861
   Defined in linux-thread.c and used for inter-target syncronization.  */
862
extern int using_thread_db;
863
 
864
/* The process id for which we've stopped.
865
 * This is only set when we actually stop all threads.
866
 * Otherwise it's zero.
867
 */
868
static int event_pid;
869
 
870
/*
871
 * The process id for a new thread to which we've just attached.
872
 * This process needs special handling at resume time.
873
 */
874
static int attach_pid;
875
 
876
 
877
/*
878
 * thread_db event handling:
879
 *
880
 * The mechanism for event notification via the thread_db API.
881
 * These events are implemented as breakpoints.  The thread_db
882
 * library gives us an address where we can set a breakpoint.
883
 * When the breakpoint is hit, it represents an event of interest
884
 * such as:
885
 *   Thread creation
886
 *   Thread death
887
 *   Thread reap
888
 */
889
 
890
/* Location of the thread creation event breakpoint.  The code at this
891
   location in the child process will be called by the pthread library
892
   whenever a new thread is created.  By setting a special breakpoint
893
   at this location, GDB can detect when a new thread is created.  We
894
   obtain this location via the td_ta_event_addr call.  */
895
 
896
static CORE_ADDR thread_creation_bkpt_address;
897
 
898
/* Location of the thread death event breakpoint.  The code at this
899
   location in the child process will be called by the pthread library
900
   whenever a thread is destroyed.  By setting a special breakpoint at
901
   this location, GDB can detect when a new thread is created.  We
902
   obtain this location via the td_ta_event_addr call.  */
903
 
904
static CORE_ADDR thread_death_bkpt_address;
905
 
906
/* This function handles the global parts of enabling thread events.
907
   The thread-specific enabling is handled per-thread elsewhere.  */
908
 
909
static void
910
enable_thread_event_reporting (ta)
911
     td_thragent_t *ta;
912
{
913
  td_thr_events_t events;
914
  td_notify_t     notify;
915
  CORE_ADDR       addr;
916
 
917
  if (p_td_ta_set_event     == NULL ||
918
      p_td_ta_event_addr    == NULL ||
919
      p_td_ta_event_getmsg  == NULL ||
920
      p_td_thr_event_enable == NULL)
921
    return;     /* can't do thread event reporting without these funcs */
922
 
923
  /* set process wide mask saying which events we are interested in */
924
  td_event_emptyset (&events);
925
  td_event_addset (&events, TD_CREATE);
926
  td_event_addset (&events, TD_DEATH);
927
 
928
  if (p_td_ta_set_event (ta, &events) != TD_OK)
929
    {
930
      warning ("unable to set global thread event mask");
931
      return;
932
    }
933
 
934
  /* Delete previous thread event breakpoints, if any.  */
935
  remove_thread_event_breakpoints ();
936
 
937
  /* create breakpoints -- thread creation and death */
938
  /* thread creation */
939
  /* get breakpoint location */
940
  if (p_td_ta_event_addr (ta, TD_CREATE, &notify) != TD_OK)
941
    {
942
      warning ("unable to get location for thread creation breakpoint");
943
      return;
944
    }
945
 
946
  /* Set up the breakpoint. */
947
  create_thread_event_breakpoint (notify.u.bptaddr);
948
 
949
  /* Save it's location. */
950
  thread_creation_bkpt_address = notify.u.bptaddr;
951
 
952
  /* thread death */
953
  /* get breakpoint location */
954
  if (p_td_ta_event_addr (ta, TD_DEATH, &notify) != TD_OK)
955
    {
956
      warning ("unable to get location for thread death breakpoint");
957
      return;
958
    }
959
  /* Set up the breakpoint. */
960
  create_thread_event_breakpoint (notify.u.bptaddr);
961
 
962
  /* Save it's location. */
963
  thread_death_bkpt_address = notify.u.bptaddr;
964
}
965
 
966
/* This function handles the global parts of disabling thread events.
967
   The thread-specific enabling is handled per-thread elsewhere.  */
968
 
969
static void
970
disable_thread_event_reporting (ta)
971
     td_thragent_t *ta;
972
{
973
  td_thr_events_t events;
974
 
975
  /* set process wide mask saying we aren't interested in any events */
976
  td_event_emptyset (&events);
977
  p_td_ta_set_event (main_threadagent, &events);
978
 
979
  /* Delete thread event breakpoints, if any.  */
980
  remove_thread_event_breakpoints ();
981
  thread_creation_bkpt_address = 0;
982
  thread_death_bkpt_address = 0;
983
}
984
 
985
/* check_for_thread_event
986
 
987
   if it's a thread event we recognize (currently
988
   we only recognize creation and destruction
989
   events), return 1; else return 0.  */
990
 
991
 
992
static int
993
check_for_thread_event (struct target_waitstatus *tws, int event_pid)
994
{
995
  /* FIXME: to be more efficient, we should keep a static
996
     list of threads, and update it only here (with td_ta_thr_iter). */
997
}
998
 
999
static void
1000
thread_db_push_target (void)
1001
{
1002
  /* Called ONLY from thread_db_new_objfile after td_ta_new call succeeds. */
1003
 
1004
  /* Push this target vector */
1005
  push_target (&thread_db_ops);
1006
  /* Find the underlying process-layer target for calling later.  */
1007
  target_beneath = find_target_beneath (&thread_db_ops);
1008
  using_thread_db = 1;
1009
  /* Turn on thread_db event-reporting API.  */
1010
  enable_thread_event_reporting (main_threadagent);
1011
}
1012
 
1013
static void
1014
thread_db_unpush_target (void)
1015
{
1016
  /* Must be called whenever we remove ourself from the target stack! */
1017
 
1018
  using_thread_db = 0;
1019
  target_beneath = NULL;
1020
 
1021
  /* delete local list of threads */
1022
  empty_threadlist ();
1023
  /* Turn off the thread_db API.  */
1024
  p_td_ta_delete (main_threadagent);
1025
  /* Unpush this target vector */
1026
  unpush_target (&thread_db_ops);
1027
  /* Reset linuxthreads module.  */
1028
  linuxthreads_discard_global_state ();
1029
}
1030
 
1031
/*
1032
 * New objfile hook function:
1033
 * Called for each new objfile (image, shared lib) in the target process.
1034
 *
1035
 * The purpose of this function is to detect that the target process
1036
 * is linked with the (appropriate) thread library.  So every time a
1037
 * new target shared library is detected, we will call td_ta_new.
1038
 * If it succeeds, we know we have a multi-threaded target process
1039
 * that we can debug using the thread_db API.
1040
 */
1041
 
1042
/*
1043
 * new_objfile function:
1044
 *
1045
 * connected to target_new_objfile_hook, this function gets called
1046
 * every time a new binary image is loaded.
1047
 *
1048
 * At each call, we attempt to open the thread_db connection to the
1049
 * child process.  If it succeeds, we know we have a libthread process
1050
 * and we can debug it with this target vector.  Therefore we push
1051
 * ourself onto the target stack.
1052
 */
1053
 
1054
static void (*target_new_objfile_chain)   (struct objfile *objfile);
1055
static int stop_or_attach_thread_callback (const td_thrhandle_t *th,
1056
                                           void *data);
1057
static int wait_thread_callback           (const td_thrhandle_t *th,
1058
                                           void *data);
1059
 
1060
static void
1061
thread_db_new_objfile (struct objfile *objfile)
1062
{
1063
  td_err_e   ret;
1064
 
1065
  if (using_thread_db)                  /* libthread already detected, and */
1066
    goto quit;                          /* thread target vector activated. */
1067
 
1068
  if (objfile == NULL)
1069
    goto quit;  /* un-interesting object file */
1070
 
1071
  /* Initialize our "main prochandle" with the main inferior pid.  */
1072
  main_prochandle.pid = PIDGET (inferior_pid);
1073
 
1074
  /* Now attempt to open a thread_db connection to the
1075
     thread library running in the child process.  */
1076
  ret = p_td_ta_new (&main_prochandle, &main_threadagent);
1077
  switch (ret) {
1078
  default:
1079
    warning ("Unexpected error initializing thread_db: %s",
1080
             thr_err_string (ret));
1081
    break;
1082
  case TD_NOLIBTHREAD:  /* expected: no libthread in child process (yet) */
1083
    break;
1084
  case TD_OK:           /* libthread detected in child: we go live now! */
1085
    thread_db_push_target ();
1086
    event_pid = inferior_pid;   /* for resume */
1087
 
1088
    /* Now stop everyone else, and attach any new threads you find.  */
1089
    p_td_ta_thr_iter (main_threadagent,
1090
                      stop_or_attach_thread_callback,
1091
                      (void *) 0,
1092
                      TD_THR_ANY_STATE,
1093
                      TD_THR_LOWEST_PRIORITY,
1094
                      TD_SIGNO_MASK,
1095
                      TD_THR_ANY_USER_FLAGS);
1096
 
1097
    /* Now go call wait on all the threads you've stopped:
1098
       This allows us to absorb the SIGKILL event, and to make sure
1099
       that the thread knows that it is stopped (Linux peculiarity).  */
1100
    p_td_ta_thr_iter (main_threadagent,
1101
                      wait_thread_callback,
1102
                      (void *) 0,
1103
                      TD_THR_ANY_STATE,
1104
                      TD_THR_LOWEST_PRIORITY,
1105
                      TD_SIGNO_MASK,
1106
                      TD_THR_ANY_USER_FLAGS);
1107
 
1108
    break;
1109
  }
1110
quit:
1111
  if (target_new_objfile_chain)
1112
    target_new_objfile_chain (objfile);
1113
}
1114
 
1115
 
1116
/*
1117
 
1118
   LOCAL FUNCTION
1119
 
1120
   thread_db_alive     - test thread for "aliveness"
1121
 
1122
   SYNOPSIS
1123
 
1124
   static bool thread_db_alive (int pid);
1125
 
1126
   DESCRIPTION
1127
 
1128
   returns true if thread still active in inferior.
1129
 
1130
 */
1131
 
1132
static int
1133
thread_db_alive (pid)
1134
     int pid;
1135
{
1136
  if (is_thread (pid))          /* user-space (non-kernel) thread */
1137
    {
1138
      td_thrhandle_t th;
1139
      td_err_e ret;
1140
 
1141
      pid = GET_THREAD (pid);
1142
      if ((ret = p_td_ta_map_id2thr (main_threadagent, pid, &th)) != TD_OK)
1143
        return 0;                /* thread not found */
1144
      if ((ret = p_td_thr_validate (&th)) != TD_OK)
1145
        return 0;                /* thread not valid */
1146
      return 1;                 /* known thread: return true */
1147
    }
1148
  else if (target_beneath->to_thread_alive)
1149
    return target_beneath->to_thread_alive (pid);
1150
  else
1151
    return 0;            /* default to "not alive" (shouldn't happen anyway) */
1152
}
1153
 
1154
/*
1155
 * get_lwp_from_thread_handle
1156
 */
1157
 
1158
static int      /* lwpid_t or pid_t */
1159
get_lwp_from_thread_handle (th)
1160
     td_thrhandle_t *th;
1161
{
1162
  td_thrinfo_t ti;
1163
  td_err_e     ret;
1164
 
1165
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1166
    error ("get_lwp_from_thread_handle: thr_get_info failed: %s",
1167
           thr_err_string (ret));
1168
 
1169
  return ti.ti_lid;
1170
}
1171
 
1172
/*
1173
 * get_lwp_from_thread_id
1174
 */
1175
 
1176
static int      /* lwpid_t or pid_t */
1177
get_lwp_from_thread_id (tid)
1178
     int tid;   /* thread_t? */
1179
{
1180
  td_thrhandle_t th;
1181
  td_err_e       ret;
1182
 
1183
  if ((ret = p_td_ta_map_id2thr (main_threadagent, tid, &th)) != TD_OK)
1184
    error ("get_lwp_from_thread_id: map_id2thr failed: %s",
1185
           thr_err_string (ret));
1186
 
1187
  return get_lwp_from_thread_handle (&th);
1188
}
1189
 
1190
/*
1191
 * pid_to_str has to handle user-space threads.
1192
 * If not a user-space thread, then pass the request on to the
1193
 * underlying stratum if it can handle it: else call normal_pid_to_str.
1194
 */
1195
 
1196
static char *
1197
thread_db_pid_to_str (int pid)
1198
{
1199
  static char buf[100];
1200
  td_thrhandle_t th;
1201
  td_thrinfo_t ti;
1202
  td_err_e ret;
1203
 
1204
  if (is_thread (pid))
1205
    {
1206
      if ((ret = p_td_ta_map_id2thr (main_threadagent,
1207
                                     GET_THREAD (pid),
1208
                                     &th)) != TD_OK)
1209
        error ("thread_db: map_id2thr failed: %s", thr_err_string (ret));
1210
 
1211
      if ((ret = p_td_thr_get_info (&th, &ti)) != TD_OK)
1212
        error ("thread_db: thr_get_info failed: %s", thr_err_string (ret));
1213
 
1214
      if (ti.ti_state == TD_THR_ACTIVE &&
1215
          ti.ti_lid != 0)
1216
        sprintf (buf, "Thread %d (LWP %d)", ti.ti_tid, ti.ti_lid);
1217
      else
1218
        sprintf (buf, "Thread %d (%s)", ti.ti_tid,
1219
                 thr_state_string (ti.ti_state));
1220
    }
1221
  else if (GET_LWP (pid))
1222
    sprintf (buf, "LWP %d", GET_LWP (pid));
1223
  else return normal_pid_to_str (pid);
1224
 
1225
  return buf;
1226
}
1227
 
1228
/*
1229
 * thread_db target vector functions:
1230
 */
1231
 
1232
static void
1233
thread_db_files_info (struct target_ops *tgt_vector)
1234
{
1235
  /* This function will be unnecessary in real life.  */
1236
  printf_filtered ("thread_db stratum:\n");
1237
  target_beneath->to_files_info (tgt_vector);
1238
}
1239
 
1240
/*
1241
 * xfer_memory has to munge the inferior_pid before passing the call
1242
 * down to the target layer.
1243
 */
1244
 
1245
static int
1246
thread_db_xfer_memory (memaddr, myaddr, len, dowrite, target)
1247
     CORE_ADDR memaddr;
1248
     char *myaddr;
1249
     int len;
1250
     int dowrite;
1251
     struct target_ops *target; /* ignored */
1252
{
1253
  struct cleanup *old_chain;
1254
  int ret;
1255
 
1256
  old_chain = save_inferior_pid ();
1257
 
1258
  if (is_thread (inferior_pid) ||
1259
      !target_thread_alive (inferior_pid))
1260
    {
1261
      /* FIXME: use the LID/LWP, so that underlying process layer
1262
         can read memory from specific threads?  */
1263
      inferior_pid = main_prochandle.pid;
1264
    }
1265
 
1266
  ret = target_beneath->to_xfer_memory (memaddr, myaddr, len,
1267
                                           dowrite, target);
1268
  do_cleanups (old_chain);
1269
  return ret;
1270
}
1271
 
1272
/*
1273
 * fetch_registers has to determine if inferior_pid is a user-space thread.
1274
 * If so, we use the thread_db API to get the registers.
1275
 * And if not, we call the underlying process stratum.
1276
 */
1277
 
1278
static void
1279
thread_db_fetch_registers (regno)
1280
     int regno;
1281
{
1282
  td_thrhandle_t thandle;
1283
  gdb_prfpregset_t fpregset;
1284
  prgregset_t gregset;
1285
  thread_t thread;
1286
  td_err_e ret;
1287
 
1288
  if (!is_thread (inferior_pid))        /* kernel thread */
1289
    {                   /* pass the request on to the target underneath.  */
1290
      target_beneath->to_fetch_registers (regno);
1291
      return;
1292
    }
1293
 
1294
  /* convert inferior_pid into a td_thrhandle_t */
1295
 
1296
  if ((thread = GET_THREAD (inferior_pid)) == 0)
1297
    error ("fetch_registers:  thread == 0");
1298
 
1299
  if ((ret = p_td_ta_map_id2thr (main_threadagent, thread, &thandle)) != TD_OK)
1300
    error ("fetch_registers: td_ta_map_id2thr: %s", thr_err_string (ret));
1301
 
1302
  /* Get the integer regs:
1303
     For the sparc, TD_PARTIALREG means that only i0->i7, l0->l7,
1304
     pc and sp are saved (by a thread context switch).  */
1305
  if ((ret = p_td_thr_getgregs (&thandle, gregset)) != TD_OK &&
1306
      ret != TD_PARTIALREG)
1307
    error ("fetch_registers: td_thr_getgregs %s", thr_err_string (ret));
1308
 
1309
  /* And, now the fp regs */
1310
  if ((ret = p_td_thr_getfpregs (&thandle, &fpregset)) != TD_OK &&
1311
      ret != TD_NOFPREGS)
1312
    error ("fetch_registers: td_thr_getfpregs %s", thr_err_string (ret));
1313
 
1314
/* Note that we must call supply_{g fp}regset *after* calling the td routines
1315
   because the td routines call ps_lget* which affect the values stored in the
1316
   registers array.  */
1317
 
1318
  supply_gregset (gregset);
1319
  supply_fpregset (&fpregset);
1320
 
1321
}
1322
 
1323
/*
1324
 * store_registers has to determine if inferior_pid is a user-space thread.
1325
 * If so, we use the thread_db API to get the registers.
1326
 * And if not, we call the underlying process stratum.
1327
 */
1328
 
1329
static void
1330
thread_db_store_registers (regno)
1331
     int regno;
1332
{
1333
  td_thrhandle_t thandle;
1334
  gdb_prfpregset_t fpregset;
1335
  prgregset_t  gregset;
1336
  thread_t thread;
1337
  td_err_e ret;
1338
 
1339
  if (!is_thread (inferior_pid))        /* Kernel thread: */
1340
    {           /* pass the request on to the underlying target vector.  */
1341
      target_beneath->to_store_registers (regno);
1342
      return;
1343
    }
1344
 
1345
  /* convert inferior_pid into a td_thrhandle_t */
1346
 
1347
  if ((thread = GET_THREAD (inferior_pid)) == 0)
1348
    error ("store_registers: thread == 0");
1349
 
1350
  if ((ret = p_td_ta_map_id2thr (main_threadagent, thread, &thandle)) != TD_OK)
1351
    error ("store_registers: td_ta_map_id2thr %s", thr_err_string (ret));
1352
 
1353
  if (regno != -1)
1354
    {                           /* Not writing all the regs */
1355
      /* save new register value */
1356
      /* MVS: I don't understand this... */
1357
      char old_value[REGISTER_SIZE];
1358
 
1359
      memcpy (old_value, &registers[REGISTER_BYTE (regno)], REGISTER_SIZE);
1360
 
1361
      if ((ret = p_td_thr_getgregs (&thandle, gregset)) != TD_OK)
1362
        error ("store_registers: td_thr_getgregs %s", thr_err_string (ret));
1363
      if ((ret = p_td_thr_getfpregs (&thandle, &fpregset)) != TD_OK)
1364
        error ("store_registers: td_thr_getfpregs %s", thr_err_string (ret));
1365
 
1366
      /* restore new register value */
1367
      memcpy (&registers[REGISTER_BYTE (regno)], old_value, REGISTER_SIZE);
1368
 
1369
    }
1370
 
1371
  fill_gregset  (gregset, regno);
1372
  fill_fpregset (&fpregset, regno);
1373
 
1374
  if ((ret = p_td_thr_setgregs (&thandle, gregset)) != TD_OK)
1375
    error ("store_registers: td_thr_setgregs %s", thr_err_string (ret));
1376
  if ((ret = p_td_thr_setfpregs (&thandle, &fpregset)) != TD_OK &&
1377
      ret != TD_NOFPREGS)
1378
    error ("store_registers: td_thr_setfpregs %s", thr_err_string (ret));
1379
}
1380
 
1381
static void
1382
handle_new_thread (tid, lid, verbose)
1383
     int tid;   /* user thread id */
1384
     int lid;   /* kernel thread id */
1385
     int verbose;
1386
{
1387
  int gdb_pid = BUILD_THREAD (tid, main_prochandle.pid);
1388
  int wait_pid, wait_status;
1389
 
1390
  if (verbose)
1391
    printf_filtered ("[New %s]\n", target_pid_to_str (gdb_pid));
1392
  add_thread (gdb_pid);
1393
 
1394
  if (lid != main_prochandle.pid)
1395
    {
1396
      attach_thread (lid);
1397
      /* According to the Eric Paire model, we now have to send
1398
         the restart signal to the new thread -- however, empirically,
1399
         I do not find that to be necessary.  */
1400
      attach_pid = lid;
1401
    }
1402
}
1403
 
1404
static void
1405
test_for_new_thread (tid, lid, verbose)
1406
     int tid;
1407
     int lid;
1408
     int verbose;
1409
{
1410
  if (!in_thread_list (BUILD_THREAD (tid, main_prochandle.pid)))
1411
    handle_new_thread (tid, lid, verbose);
1412
}
1413
 
1414
/*
1415
 * Callback function that gets called once per USER thread
1416
 * (i.e., not kernel) thread by td_ta_thr_iter.
1417
 */
1418
 
1419
static int
1420
find_new_threads_callback (th, ignored)
1421
     const td_thrhandle_t *th;
1422
     void *ignored;
1423
{
1424
  td_thrinfo_t ti;
1425
  td_err_e     ret;
1426
 
1427
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1428
    {
1429
      warning ("find_new_threads_callback: %s", thr_err_string (ret));
1430
      return -1;                /* bail out, get_info failed. */
1431
    }
1432
 
1433
  /* FIXME:
1434
     As things now stand, this should never detect a new thread.
1435
     But if it does, we could be in trouble because we aren't calling
1436
     wait_thread_callback for it.  */
1437
  test_for_new_thread (ti.ti_tid, ti.ti_lid, 0);
1438
  return 0;
1439
}
1440
 
1441
/*
1442
 * find_new_threads uses the thread_db iterator function to discover
1443
 * user-space threads.  Then if the underlying process stratum has a
1444
 * find_new_threads method, we call that too.
1445
 */
1446
 
1447
static void
1448
thread_db_find_new_threads ()
1449
{
1450
  if (inferior_pid == -1)       /* FIXME: still necessary? */
1451
    {
1452
      printf_filtered ("No process.\n");
1453
      return;
1454
    }
1455
  p_td_ta_thr_iter (main_threadagent,
1456
                    find_new_threads_callback,
1457
                    (void *) 0,
1458
                    TD_THR_ANY_STATE,
1459
                    TD_THR_LOWEST_PRIORITY,
1460
                    TD_SIGNO_MASK,
1461
                    TD_THR_ANY_USER_FLAGS);
1462
  if (target_beneath->to_find_new_threads)
1463
    target_beneath->to_find_new_threads ();
1464
}
1465
 
1466
/*
1467
 * Resume all threads, or resume a single thread.
1468
 * If step is true, then single-step the appropriate thread
1469
 * (or single-step inferior_pid, but continue everyone else).
1470
 * If signo is true, then send that signal to at least one thread.
1471
 */
1472
 
1473
/*
1474
 * This function is called once for each thread before resuming.
1475
 * It sends continue (no step, and no signal) to each thread except
1476
 *   the main thread, and
1477
 *   the event thread (the one that stopped at a breakpoint etc.)
1478
 *
1479
 * The event thread is handled separately so that it can be sent
1480
 * the stepping and signal args with which target_resume was called.
1481
 *
1482
 * The main thread is resumed last, so that the thread_db proc_service
1483
 * callbacks will still work during the iterator function.
1484
 */
1485
 
1486
static int
1487
resume_thread_callback (th, data)
1488
     const td_thrhandle_t *th;
1489
     void *data;
1490
{
1491
  td_thrinfo_t ti;
1492
  td_err_e     ret;
1493
 
1494
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1495
    {
1496
      warning ("resume_thread_callback: %s", thr_err_string (ret));
1497
      return -1;                /* bail out, get_info failed. */
1498
    }
1499
  /* FIXME:
1500
     As things now stand, this should never detect a new thread.
1501
     But if it does, we could be in trouble because we aren't calling
1502
     wait_thread_callback for it.  */
1503
  test_for_new_thread (ti.ti_tid, ti.ti_lid, 1);
1504
 
1505
  if (ti.ti_lid != main_prochandle.pid &&
1506
      ti.ti_lid != event_pid)
1507
    {
1508
      /* Unconditionally continue the thread with no signal.
1509
         Only the event thread will get a signal of any kind.  */
1510
 
1511
      target_beneath->to_resume (ti.ti_lid, 0, 0);
1512
    }
1513
  return 0;
1514
}
1515
 
1516
static int
1517
new_resume_thread_callback (thread, data)
1518
     threadinfo *thread;
1519
     void *data;
1520
{
1521
  if (thread->lid != event_pid &&
1522
      thread->lid != main_prochandle.pid)
1523
    {
1524
      /* Unconditionally continue the thread with no signal (for now).  */
1525
 
1526
      target_beneath->to_resume (thread->lid, 0, 0);
1527
    }
1528
  return 0;
1529
}
1530
 
1531
static int last_resume_pid;
1532
static int last_resume_step;
1533
static int last_resume_signo;
1534
 
1535
static void
1536
thread_db_resume (pid, step, signo)
1537
     int pid;
1538
     int step;
1539
     enum target_signal signo;
1540
{
1541
  last_resume_pid   = pid;
1542
  last_resume_step  = step;
1543
  last_resume_signo = signo;
1544
 
1545
  /* resuming a specific pid? */
1546
  if (pid != -1)
1547
    {
1548
      if (is_thread (pid))
1549
        pid = get_lwp_from_thread_id (GET_THREAD (pid));
1550
      else if (GET_LWP (pid))
1551
        pid = GET_LWP (pid);
1552
    }
1553
 
1554
  /* Apparently the interpretation of 'pid' is dependent on 'step':
1555
     If step is true, then a specific pid means 'step only this pid'.
1556
     But if step is not true, then pid means 'continue ALL pids, but
1557
     give the signal only to this one'.  */
1558
  if (pid != -1 && step)
1559
    {
1560
      /* FIXME: is this gonna work in all circumstances? */
1561
      target_beneath->to_resume (pid, step, signo);
1562
    }
1563
  else
1564
    {
1565
      /* 1) Continue all threads except the event thread and the main thread.
1566
         2) resume the event thread with step and signo.
1567
         3) If event thread != main thread, continue the main thread.
1568
 
1569
         Note: order of 2 and 3 may need to be reversed.  */
1570
 
1571
      threadlist_iter (new_resume_thread_callback,
1572
                        (void *) 0,
1573
                        TD_THR_ANY_STATE,
1574
                        TD_THR_ANY_TYPE);
1575
      /* now resume event thread, and if necessary also main thread. */
1576
      if (event_pid)
1577
        {
1578
          target_beneath->to_resume (event_pid, step, signo);
1579
        }
1580
      if (event_pid != main_prochandle.pid)
1581
        {
1582
          target_beneath->to_resume (main_prochandle.pid, 0, 0);
1583
        }
1584
    }
1585
}
1586
 
1587
/* All new threads will be attached.
1588
   All previously known threads will be stopped using kill (SIGKILL).  */
1589
 
1590
static int
1591
stop_or_attach_thread_callback (const td_thrhandle_t *th, void *data)
1592
{
1593
  td_thrinfo_t ti;
1594
  td_err_e     ret;
1595
  int          gdb_pid;
1596
  int on_off = 1;
1597
 
1598
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1599
    {
1600
      warning ("stop_or_attach_thread_callback: %s", thr_err_string (ret));
1601
      return -1;                /* bail out, get_info failed. */
1602
    }
1603
 
1604
  /* First add it to our internal list.
1605
     We build this list anew at every wait event.  */
1606
  insert_thread (ti.ti_tid, ti.ti_lid, ti.ti_state, ti.ti_type);
1607
  /* Now: if we've already seen it, stop it, else add it and attach it.  */
1608
  gdb_pid = BUILD_THREAD (ti.ti_tid, main_prochandle.pid);
1609
  if (!in_thread_list (gdb_pid))        /* new thread */
1610
    {
1611
      handle_new_thread (ti.ti_tid, ti.ti_lid, 1);
1612
      /* Enable thread events */
1613
      if (p_td_thr_event_enable)
1614
        if ((ret = p_td_thr_event_enable (th, on_off)) != TD_OK)
1615
          warning ("stop_or_attach_thread: %s", thr_err_string (ret));
1616
    }
1617
  else if (ti.ti_lid != event_pid &&
1618
           ti.ti_lid != main_prochandle.pid)
1619
    {
1620
      ret = (td_err_e) kill (ti.ti_lid, SIGSTOP);
1621
    }
1622
 
1623
  return 0;
1624
}
1625
 
1626
/*
1627
 * Wait for signal N from pid PID.
1628
 * If wait returns any other signals, put them back before returning.
1629
 */
1630
 
1631
static void
1632
wait_for_stop (pid)
1633
     int pid;
1634
{
1635
  int i;
1636
  int retpid;
1637
  int status;
1638
 
1639
  /* Array of wait/signal status */
1640
  /* FIXME: wrong data structure, we need a queue.
1641
     Realtime signals may be delivered more than once.
1642
     And at that, we really can't handle them (see below).  */
1643
#if defined (NSIG)
1644
  static int   wstatus [NSIG];
1645
#elif defined (_NSIG)
1646
  static int   wstatus [_NSIG];
1647
#else
1648
#error No definition for number of signals!
1649
#endif
1650
 
1651
  /* clear wait/status list */
1652
  memset (&wstatus, 0, sizeof (wstatus));
1653
 
1654
  /* Now look for SIGSTOP event on all threads except event thread.  */
1655
  do {
1656
    errno = 0;
1657
    if (pid == main_prochandle.pid)
1658
      retpid = waitpid (pid, &status, 0);
1659
    else
1660
      retpid = waitpid (pid, &status, __WCLONE);
1661
 
1662
    if (retpid > 0)
1663
      if (WSTOPSIG (status) == SIGSTOP)
1664
        {
1665
          /* Got the SIGSTOP event we're looking for.
1666
             Throw it away, and throw any other events back!  */
1667
          for (i = 0; i < sizeof(wstatus) / sizeof (wstatus[0]); i++)
1668
            if (wstatus[i])
1669
              if (i != SIGSTOP)
1670
                {
1671
                  kill (retpid, i);
1672
                }
1673
          break;        /* all done */
1674
        }
1675
      else
1676
        {
1677
          int signo;
1678
          /* Oops, got an event other than SIGSTOP.
1679
             Save it, and throw it back after we find the SIGSTOP event.  */
1680
 
1681
          /* FIXME (how?)  This method is going to fail for realtime
1682
             signals, which cannot be put back simply by using kill.  */
1683
 
1684
          if (WIFEXITED (status))
1685
            error ("Ack!  Thread Exited event.  What do I do now???");
1686
          else if (WIFSTOPPED (status))
1687
            signo = WSTOPSIG (status);
1688
          else
1689
            signo = WTERMSIG (status);
1690
 
1691
          /* If a thread other than the event thread has hit a GDB
1692
             breakpoint (as opposed to some random trap signal), then
1693
             just arrange for it to hit it again later.  Back up the
1694
             PC if necessary.  Don't forward the SIGTRAP signal to
1695
             the thread.  We will handle the current event, eventually
1696
             we will resume all the threads, and this one will get
1697
             it's breakpoint trap again.
1698
 
1699
             If we do not do this, then we run the risk that the user
1700
             will delete or disable the breakpoint, but the thread will
1701
             have already tripped on it.  */
1702
 
1703
          if (retpid != event_pid &&
1704
              signo == SIGTRAP &&
1705
              breakpoint_inserted_here_p (read_pc_pid (retpid) -
1706
                                          DECR_PC_AFTER_BREAK))
1707
            {
1708
              /* Set the pc to before the trap and DO NOT re-send the signal */
1709
              if (DECR_PC_AFTER_BREAK)
1710
                write_pc_pid (read_pc_pid (retpid) - DECR_PC_AFTER_BREAK,
1711
                              retpid);
1712
            }
1713
 
1714
          /* Since SIGINT gets forwarded to the entire process group
1715
             (in the case where ^C is typed at the tty / console),
1716
             just ignore all SIGINTs from other than the event thread.  */
1717
          else if (retpid != event_pid && signo == SIGINT)
1718
            { /* do nothing.  Signal will disappear into oblivion!  */
1719
              ;
1720
            }
1721
 
1722
          else /* This is some random signal other than a breakpoint. */
1723
            {
1724
              wstatus [signo] = 1;
1725
            }
1726
          child_resume (retpid, 0, TARGET_SIGNAL_0);
1727
          continue;
1728
        }
1729
 
1730
  } while (errno == 0 || errno == EINTR);
1731
}
1732
 
1733
/*
1734
 * wait_thread_callback
1735
 *
1736
 * Calls waitpid for each thread, repeatedly if necessary, until
1737
 * SIGSTOP is returned.  Afterward, if any other signals were returned
1738
 * by waitpid, return them to the thread's pending queue by calling kill.
1739
 */
1740
 
1741
static int
1742
wait_thread_callback (const td_thrhandle_t *th, void *data)
1743
{
1744
  td_thrinfo_t ti;
1745
  td_err_e     ret;
1746
 
1747
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1748
    {
1749
      warning ("wait_thread_callback: %s", thr_err_string (ret));
1750
      return -1;                /* bail out, get_info failed. */
1751
    }
1752
 
1753
  /* This callback to act on all threads except the event thread: */
1754
  if (ti.ti_lid == event_pid ||         /* no need to wait (no sigstop) */
1755
      ti.ti_lid == main_prochandle.pid) /* no need to wait (already waited) */
1756
    return 0;    /* don't wait on the event thread.  */
1757
 
1758
  wait_for_stop (ti.ti_lid);
1759
  return 0;      /* finished: next thread. */
1760
}
1761
 
1762
static int
1763
new_wait_thread_callback (thread, data)
1764
     threadinfo *thread;
1765
     void *data;
1766
{
1767
  /* don't wait on the event thread -- it's already stopped and waited.
1768
     Ditto the main thread.  */
1769
  if (thread->lid != event_pid &&
1770
      thread->lid != main_prochandle.pid)
1771
    {
1772
      wait_for_stop (thread->lid);
1773
    }
1774
  return 0;
1775
}
1776
 
1777
/*
1778
 * Wait for any thread to stop, by calling the underlying wait method.
1779
 * The PID returned by the underlying target may be a kernel thread,
1780
 * in which case we will want to convert it to the corresponding
1781
 * user-space thread.
1782
 */
1783
 
1784
static int
1785
thread_db_wait (int pid, struct target_waitstatus *ourstatus)
1786
{
1787
  td_thrhandle_t thandle;
1788
  td_thrinfo_t ti;
1789
  td_err_e ret;
1790
  lwpid_t lwp;
1791
  int retpid;
1792
  int status;
1793
  int save_errno;
1794
 
1795
  /* OK, we're about to wait for an event from the running inferior.
1796
     Make sure we're ignoring the right signals.  */
1797
 
1798
  check_all_signal_numbers ();  /* see if magic signals changed. */
1799
 
1800
  event_pid = 0;
1801
  attach_pid = 0;
1802
 
1803
  /* FIXME: should I do the wait right here inline?  */
1804
#if 0
1805
  if (pid == -1)
1806
    lwp = -1;
1807
  else
1808
    lwp = get_lwp_from_thread_id (GET_THREAD (pid));
1809
#endif
1810
 
1811
 
1812
  save_errno = linux_child_wait (-1, &retpid, &status);
1813
  store_waitstatus (ourstatus, status);
1814
 
1815
  /* Thread ID is irrelevant if the target process exited.
1816
     FIXME: do I have any killing to do?
1817
     Can I get this event mistakenly from a thread?  */
1818
  if (ourstatus->kind == TARGET_WAITKIND_EXITED)
1819
    return retpid;
1820
 
1821
  /* OK, we got an event of interest.
1822
     Go stop all threads and look for new ones.
1823
     FIXME: maybe don't do this for the restart signal?  Optimization...  */
1824
  event_pid = retpid;
1825
 
1826
  /* If the last call to resume was for a specific thread, then we don't
1827
     need to stop everyone else: they should already be stopped.  */
1828
  if (last_resume_step == 0 || last_resume_pid == -1)
1829
    {
1830
      /* Main thread must be stopped before calling the iterator.  */
1831
      if (retpid != main_prochandle.pid)
1832
        {
1833
          kill (main_prochandle.pid, SIGSTOP);
1834
          wait_for_stop (main_prochandle.pid);
1835
        }
1836
 
1837
      empty_threadlist ();
1838
      /* Now stop everyone else, and attach any new threads you find.  */
1839
      p_td_ta_thr_iter (main_threadagent,
1840
                        stop_or_attach_thread_callback,
1841
                        (void *) 0,
1842
                        TD_THR_ANY_STATE,
1843
                        TD_THR_LOWEST_PRIORITY,
1844
                        TD_SIGNO_MASK,
1845
                        TD_THR_ANY_USER_FLAGS);
1846
 
1847
      /* Now go call wait on all the threads we've stopped:
1848
         This allows us to absorb the SIGKILL event, and to make sure
1849
         that the thread knows that it is stopped (Linux peculiarity).  */
1850
 
1851
      threadlist_iter (new_wait_thread_callback,
1852
                       (void *) 0,
1853
                       TD_THR_ANY_STATE,
1854
                       TD_THR_ANY_TYPE);
1855
    }
1856
 
1857
  /* Convert the kernel thread id to the corresponding thread id.  */
1858
 
1859
  /* If the process layer does not furnish an lwp,
1860
     then perhaps the returned pid IS the lwp... */
1861
  if ((lwp = GET_LWP (retpid)) == 0)
1862
    lwp = retpid;
1863
 
1864
  if ((ret = p_td_ta_map_lwp2thr (main_threadagent, lwp, &thandle)) != TD_OK)
1865
    return retpid;      /* LWP is not mapped onto a user-space thread. */
1866
 
1867
  if ((ret = p_td_thr_validate (&thandle)) != TD_OK)
1868
    return retpid;      /* LWP is not mapped onto a valid thread. */
1869
 
1870
  if ((ret = p_td_thr_get_info (&thandle, &ti)) != TD_OK)
1871
    {
1872
      warning ("thread_db: thr_get_info failed ('%s')", thr_err_string (ret));
1873
      return retpid;
1874
    }
1875
 
1876
  retpid = BUILD_THREAD (ti.ti_tid, main_prochandle.pid);
1877
  /* If this is a new user thread, notify GDB about it.  */
1878
  if (!in_thread_list (retpid))
1879
    {
1880
      printf_filtered ("[New %s]\n", target_pid_to_str (retpid));
1881
      add_thread (retpid);
1882
    }
1883
 
1884
#if 0
1885
  /* Now detect if this is a thread creation/deletion event: */
1886
  check_for_thread_event (ourstatus, retpid);
1887
#endif
1888
  return retpid;
1889
}
1890
 
1891
/*
1892
 * kill has to call the underlying kill.
1893
 * FIXME: I'm not sure if it's necessary to check inferior_pid any more,
1894
 * but we might need to fix inferior_pid up if it's a user thread.
1895
 */
1896
 
1897
static int
1898
kill_thread_callback (th, data)
1899
     td_thrhandle_t *th;
1900
     void *data;
1901
{
1902
  td_thrinfo_t ti;
1903
  td_err_e     ret;
1904
 
1905
  /* Fixme:
1906
     For Linux, threads may need to be waited.  */
1907
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1908
    {
1909
      warning ("kill_thread_callback: %s", thr_err_string (ret));
1910
      return -1;                /* bail out, get_info failed. */
1911
    }
1912
 
1913
  if (ti.ti_lid != main_prochandle.pid)
1914
    {
1915
      kill (ti.ti_lid, SIGKILL);
1916
    }
1917
  return 0;
1918
}
1919
 
1920
 
1921
static void thread_db_kill (void)
1922
{
1923
  int rpid;
1924
  int status;
1925
 
1926
  /* Fixme:
1927
     For Linux, threads may need to be waited.  */
1928
  if (inferior_pid != 0)
1929
    {
1930
      /* Go kill the children first.  Save the main thread for last. */
1931
      p_td_ta_thr_iter (main_threadagent,
1932
                        kill_thread_callback,
1933
                        (void *) 0,
1934
                        TD_THR_ANY_STATE,
1935
                        TD_THR_LOWEST_PRIORITY,
1936
                        TD_SIGNO_MASK,
1937
                        TD_THR_ANY_USER_FLAGS);
1938
 
1939
      /* Turn off thread_db event-reporting API *before* killing the
1940
         main thread, since this operation requires child memory access.
1941
         Can't move this into thread_db_unpush target because then
1942
         detach would not work.  */
1943
      disable_thread_event_reporting (main_threadagent);
1944
 
1945
      inferior_pid = main_prochandle.pid;
1946
 
1947
      /*
1948
       * Since both procfs_kill and ptrace_kill call target_mourn,
1949
       * it should be sufficient for me to call one of them.
1950
       * That will result in my mourn being called, which will both
1951
       * unpush me and call the underlying mourn.
1952
       */
1953
      target_beneath->to_kill ();
1954
    }
1955
 
1956
  /* Wait for all threads. */
1957
  /* FIXME: need a universal wait_for_signal func? */
1958
  do
1959
    {
1960
      rpid = waitpid (-1, &status, __WCLONE | WNOHANG);
1961
    }
1962
  while (rpid > 0 || errno == EINTR);
1963
 
1964
  do
1965
    {
1966
      rpid = waitpid (-1, &status, WNOHANG);
1967
    }
1968
  while (rpid > 0 || errno == EINTR);
1969
}
1970
 
1971
/*
1972
 * Mourn has to remove us from the target stack,
1973
 * and then call the underlying mourn.
1974
 */
1975
 
1976
static void thread_db_mourn_inferior (void)
1977
{
1978
  thread_db_unpush_target ();
1979
  target_mourn_inferior ();     /* call the underlying mourn */
1980
}
1981
 
1982
/*
1983
 * Detach has to remove us from the target stack,
1984
 * and then call the underlying detach.
1985
 *
1986
 * But first, it has to detach all the cloned threads!
1987
 */
1988
 
1989
static int
1990
detach_thread_callback (th, data)
1991
     td_thrhandle_t *th;
1992
     void *data;
1993
{
1994
  /* Called once per thread.  */
1995
  td_thrinfo_t ti;
1996
  td_err_e     ret;
1997
 
1998
  if ((ret = p_td_thr_get_info (th, &ti)) != TD_OK)
1999
    {
2000
      warning ("detach_thread_callback: %s", thr_err_string (ret));
2001
      return -1;                /* bail out, get_info failed. */
2002
    }
2003
 
2004
  if (!in_thread_list (BUILD_THREAD (ti.ti_tid, main_prochandle.pid)))
2005
    return 0;    /* apparently we don't know this one.  */
2006
 
2007
  /* Save main thread for last, or the iterator will fail! */
2008
  if (ti.ti_lid != main_prochandle.pid)
2009
    {
2010
      struct cleanup *old_chain;
2011
      int off = 0;
2012
 
2013
      /* Time to detach this thread.
2014
         First disable thread_db event reporting for the thread.  */
2015
      if (p_td_thr_event_enable &&
2016
          (ret = p_td_thr_event_enable (th, off)) != TD_OK)
2017
        {
2018
          warning ("detach_thread_callback: %s\n", thr_err_string (ret));
2019
          return 0;
2020
        }
2021
 
2022
      /* Now cancel any pending SIGTRAPS.  FIXME!  */
2023
 
2024
      /* Call underlying detach method.  FIXME just detach it.  */
2025
      old_chain = save_inferior_pid ();
2026
      inferior_pid = ti.ti_lid;
2027
      detach (TARGET_SIGNAL_0);
2028
      do_cleanups (old_chain);
2029
    }
2030
  return 0;
2031
}
2032
 
2033
static void
2034
thread_db_detach (char *args, int from_tty)
2035
{
2036
  td_err_e ret;
2037
 
2038
  if ((ret = p_td_ta_thr_iter (main_threadagent,
2039
                               detach_thread_callback,
2040
                               (void *) 0,
2041
                               TD_THR_ANY_STATE,
2042
                               TD_THR_LOWEST_PRIORITY,
2043
                               TD_SIGNO_MASK,
2044
                               TD_THR_ANY_USER_FLAGS))
2045
      != TD_OK)
2046
    warning ("detach (thr_iter): %s", thr_err_string (ret));
2047
 
2048
  /* Turn off thread_db event-reporting API
2049
     (before detaching the main thread) */
2050
  disable_thread_event_reporting (main_threadagent);
2051
 
2052
  thread_db_unpush_target ();
2053
 
2054
  /* above call nullifies target_beneath, so don't use that! */
2055
  inferior_pid = PIDGET (inferior_pid);
2056
  target_detach (args, from_tty);
2057
}
2058
 
2059
 
2060
/*
2061
 * We never want to actually create the inferior!
2062
 *
2063
 * If this is ever called, it means we were on the target stack
2064
 * when the user said "run".  But we don't want to be on the new
2065
 * inferior's target stack until the thread_db / libthread
2066
 * connection is ready to be made.
2067
 *
2068
 * So, what shall we do?
2069
 * Unpush ourselves from the stack, and then invoke
2070
 * find_default_create_inferior, which will invoke the
2071
 * appropriate process_stratum target to do the create.
2072
 */
2073
 
2074
static void
2075
thread_db_create_inferior (exec_file, allargs, env)
2076
     char *exec_file;
2077
     char *allargs;
2078
     char **env;
2079
{
2080
  thread_db_unpush_target ();
2081
  find_default_create_inferior (exec_file, allargs, env);
2082
}
2083
 
2084
/*
2085
 * Thread_db target vector initializer.
2086
 */
2087
 
2088
void
2089
init_thread_db_ops ()
2090
{
2091
  thread_db_ops.to_shortname        = "multi-thread";
2092
  thread_db_ops.to_longname         = "multi-threaded child process.";
2093
  thread_db_ops.to_doc              = "Threads and pthreads support.";
2094
  thread_db_ops.to_files_info       = thread_db_files_info;
2095
  thread_db_ops.to_create_inferior  = thread_db_create_inferior;
2096
  thread_db_ops.to_detach           = thread_db_detach;
2097
  thread_db_ops.to_wait             = thread_db_wait;
2098
  thread_db_ops.to_resume           = thread_db_resume;
2099
  thread_db_ops.to_mourn_inferior   = thread_db_mourn_inferior;
2100
  thread_db_ops.to_kill             = thread_db_kill;
2101
  thread_db_ops.to_xfer_memory      = thread_db_xfer_memory;
2102
  thread_db_ops.to_fetch_registers  = thread_db_fetch_registers;
2103
  thread_db_ops.to_store_registers  = thread_db_store_registers;
2104
  thread_db_ops.to_thread_alive     = thread_db_alive;
2105
  thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
2106
  thread_db_ops.to_pid_to_str       = thread_db_pid_to_str;
2107
  thread_db_ops.to_stratum          = thread_stratum;
2108
  thread_db_ops.to_has_thread_control = tc_schedlock;
2109
  thread_db_ops.to_magic            = OPS_MAGIC;
2110
}
2111
#endif  /* HAVE_STDINT_H */
2112
 
2113
/*
2114
 * Module constructor / initializer function.
2115
 * If connection to thread_db dynamic library is successful,
2116
 * then initialize this module's target vectors and the
2117
 * new_objfile hook.
2118
 */
2119
 
2120
 
2121
void
2122
_initialize_thread_db ()
2123
{
2124
#ifdef HAVE_STDINT_H    /* stub out entire module, leave initializer empty */
2125
  if (init_thread_db_library ())
2126
    {
2127
      init_thread_db_ops ();
2128
      add_target (&thread_db_ops);
2129
      /*
2130
       * Hook up to the new_objfile event.
2131
       * If someone is already there, arrange for him to be called
2132
       * after we are.
2133
       */
2134
      target_new_objfile_chain = target_new_objfile_hook;
2135
      target_new_objfile_hook  = thread_db_new_objfile;
2136
    }
2137
#endif  /* HAVE_STDINT_H */
2138
}
2139
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.