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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [linux-thread.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Low level interface for debugging GNU/Linux threads for GDB,
2
   the GNU debugger.
3
   Copyright 1998, 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, Boston, MA 02111-1307, USA.  */
20
 
21
/* This module implements the debugging interface of the linuxthreads package
22
   of the glibc. This package implements a simple clone()-based implementation
23
   of Posix threads for Linux. To use this module, be sure that you have at
24
   least the version of the linuxthreads package that holds the support of
25
   GDB (currently 0.8 included in the glibc-2.0.7).
26
 
27
   Right now, the linuxthreads package does not care of priority scheduling,
28
   so, neither this module does; In particular, the threads are resumed
29
   in any order, which could lead to different scheduling than the one
30
   happening when GDB does not control the execution.
31
 
32
   The latest point is that ptrace(PT_ATTACH, ...) is intrusive in Linux:
33
   When a process is attached, then the attaching process becomes the current
34
   parent of the attached process, and the old parent has lost this child.
35
   If the old parent does a wait[...](), then this child is no longer
36
   considered by the kernel as a child of the old parent, thus leading to
37
   results of the call different when the child is attached and when it's not.
38
 
39
   A fix has been submitted to the Linux community to solve this problem,
40
   which consequences are not visible to the application itself, but on the
41
   process which may wait() for the completion of the application (mostly,
42
   it may consider that the application no longer exists (errno == ECHILD),
43
   although it does, and thus being unable to get the exit status and resource
44
   usage of the child. If by chance, it is able to wait() for the application
45
   after it has died (by receiving first a SIGCHILD, and then doing a wait(),
46
   then the exit status and resource usage may be wrong, because the
47
   linuxthreads package heavily relies on wait() synchronization to keep
48
   them correct.  */
49
 
50
#include "defs.h"
51
#include <sys/types.h> /* for pid_t */
52
#include <sys/ptrace.h> /* for PT_* flags */
53
#include "gdb_wait.h" /* for WUNTRACED and __WCLONE flags */
54
#include <signal.h> /* for struct sigaction and NSIG */
55
#include <sys/utsname.h>
56
 
57
#include "target.h"
58
#include "inferior.h"
59
#include "gdbcore.h"
60
#include "gdbthread.h"
61
#include "gdbcmd.h"
62
#include "breakpoint.h"
63
 
64
#ifndef PT_ATTACH
65
#define PT_ATTACH       PTRACE_ATTACH
66
#endif
67
#ifndef PT_KILL
68
#define PT_KILL         PTRACE_KILL
69
#endif
70
#ifndef PT_READ_U
71
#define PT_READ_U       PTRACE_PEEKUSR
72
#endif
73
 
74
#ifdef NSIG
75
#define LINUXTHREAD_NSIG NSIG
76
#else
77
#ifdef _NSIG
78
#define LINUXTHREAD_NSIG _NSIG
79
#endif
80
#endif
81
 
82
extern int child_suppress_run;          /* make inftarg.c non-runnable */
83
struct target_ops linuxthreads_ops;     /* Forward declaration */
84
extern struct target_ops child_ops;     /* target vector for inftarg.c */
85
 
86
static CORE_ADDR linuxthreads_handles;  /* array of linuxthreads handles */
87
static CORE_ADDR linuxthreads_manager;  /* pid of linuxthreads manager thread */
88
static CORE_ADDR linuxthreads_initial;  /* pid of linuxthreads initial thread */
89
static CORE_ADDR linuxthreads_debug;    /* linuxthreads internal debug flag */
90
static CORE_ADDR linuxthreads_num;      /* number of valid handle entries */
91
 
92
static int linuxthreads_max;            /* Maximum number of linuxthreads.
93
                                           Zero if this executable doesn't use
94
                                           threads, or wasn't linked with a
95
                                           debugger-friendly version of the
96
                                           linuxthreads library.  */
97
 
98
static int linuxthreads_sizeof_handle;  /* size of a linuxthreads handle */
99
static int linuxthreads_offset_descr;   /* h_descr offset of the linuxthreads
100
                                           handle */
101
static int linuxthreads_offset_pid;     /* p_pid offset of the linuxthreads
102
                                           descr */
103
 
104
static int linuxthreads_manager_pid;    /* manager pid */
105
static int linuxthreads_initial_pid;    /* initial pid */
106
 
107
/* These variables form a bag of threads with interesting status.  If
108
   wait_thread (PID) finds that PID stopped for some interesting
109
   reason (i.e. anything other than stopped with SIGSTOP), then it
110
   records its status in this queue.  linuxthreads_wait and
111
   linuxthreads_find_trap extract processes from here.  */
112
static int *linuxthreads_wait_pid;      /* wait array of pid */
113
static int *linuxthreads_wait_status;   /* wait array of status */
114
static int linuxthreads_wait_last;      /* index of last valid elt in
115
                                           linuxthreads_wait_{pid,status} */
116
 
117
static sigset_t linuxthreads_block_mask;  /* sigset without SIGCHLD */
118
 
119
static int linuxthreads_step_pid;       /* current stepped pid */
120
static int linuxthreads_step_signo;     /* current stepped target signal */
121
static int linuxthreads_exit_status;    /* exit status of initial thread */
122
 
123
static int linuxthreads_inferior_pid;   /* temporary internal inferior pid */
124
static int linuxthreads_breakpoint_pid; /* last pid that hit a breakpoint */
125
static int linuxthreads_attach_pending; /* attach command without wait */
126
 
127
static int linuxthreads_breakpoints_inserted;   /* any breakpoints inserted */
128
 
129
/* LinuxThreads uses certain signals for communication between
130
   processes; we need to tell GDB to pass them through silently to the
131
   inferior.  The LinuxThreads library has global variables we can
132
   read containing the relevant signal numbers, but since the signal
133
   numbers are chosen at run-time, those variables aren't initialized
134
   until the shared library's constructors have had a chance to run.  */
135
 
136
struct linuxthreads_signal {
137
 
138
  /* The name of the LinuxThreads library variable that contains
139
     the signal number.  */
140
  char *var;
141
 
142
  /* True if this variable must exist for us to debug properly.  */
143
  int required;
144
 
145
  /* The variable's address in the inferior, or zero if the
146
     LinuxThreads library hasn't been loaded into this inferior yet.  */
147
  CORE_ADDR addr;
148
 
149
  /* The signal number, or zero if we don't know yet (either because
150
     we haven't found the variable, or it hasn't been initialized).
151
     This is an actual target signal number that you could pass to
152
     `kill', not a GDB signal number.  */
153
  int signal;
154
 
155
  /* GDB's original settings for `stop' and `print' for this signal.
156
     We restore them when the user selects a different executable.
157
     Invariant: if sig->signal != 0, then sig->{stop,print} contain
158
     the original settings.  */
159
  int stop, print;
160
};
161
 
162
struct linuxthreads_signal linuxthreads_sig_restart = {
163
  "__pthread_sig_restart", 1, 0, 0, 0, 0
164
};
165
struct linuxthreads_signal linuxthreads_sig_cancel = {
166
  "__pthread_sig_cancel", 1, 0, 0, 0, 0
167
};
168
struct linuxthreads_signal linuxthreads_sig_debug = {
169
  "__pthread_sig_debug", 0, 0, 0, 0, 0
170
};
171
 
172
/* Set by thread_db module when it takes over the thread_stratum.
173
   In that case we must:
174
   a) refrain from turning on the debug signal, and
175
   b) refrain from calling add_thread.  */
176
 
177
int using_thread_db = 0;
178
 
179
/* A table of breakpoint locations, one per PID.  */
180
static struct linuxthreads_breakpoint {
181
  CORE_ADDR     pc;     /* PC of breakpoint */
182
  int           pid;    /* pid of breakpoint */
183
  int           step;   /* whether the pc has been reached after sstep */
184
} *linuxthreads_breakpoint_zombie;              /* Zombie breakpoints array */
185
static int linuxthreads_breakpoint_last;        /* Last zombie breakpoint */
186
 
187
/* linuxthreads_{insert,remove}_breakpoint pass the breakpoint address
188
   to {insert,remove}_breakpoint via this variable, since
189
   iterate_active_threads doesn't provide any way to pass values
190
   through to the worker function.  */
191
static CORE_ADDR linuxthreads_breakpoint_addr;
192
 
193
#define REMOVE_BREAKPOINT_ZOMBIE(_i) \
194
{ \
195
  if ((_i) < linuxthreads_breakpoint_last) \
196
    linuxthreads_breakpoint_zombie[(_i)] = \
197
      linuxthreads_breakpoint_zombie[linuxthreads_breakpoint_last]; \
198
  linuxthreads_breakpoint_last--; \
199
}
200
 
201
 
202
 
203
#ifndef PTRACE_XFER_TYPE
204
#define PTRACE_XFER_TYPE int
205
#endif
206
/* Check to see if the given thread is alive.  */
207
static int
208
linuxthreads_thread_alive (pid)
209
     int pid;
210
{
211
  errno = 0;
212
  return ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE)0, 0) >= 0 || errno == 0;
213
}
214
 
215
/* On detach(), find a SIGTRAP status.  If stop is non-zero, find a
216
   SIGSTOP one, too.
217
 
218
   Make sure PID is ready to run, and free of interference from our
219
   efforts to debug it (e.g., pending SIGSTOP or SIGTRAP signals).  If
220
   STOP is zero, just look for a SIGTRAP.  If STOP is non-zero, look
221
   for a SIGSTOP, too.  Return non-zero if PID is alive and ready to
222
   run; return zero if PID is dead.
223
 
224
   PID may or may not be stopped at the moment, and we may or may not
225
   have waited for it already.  We check the linuxthreads_wait bag in
226
   case we've already got a status for it.  We may possibly wait for
227
   it ourselves.
228
 
229
   PID may have signals waiting to be delivered.  If they're caused by
230
   our efforts to debug it, accept them with wait, but don't pass them
231
   through to PID.  Do pass all other signals through.  */
232
static int
233
linuxthreads_find_trap (pid, stop)
234
    int pid;
235
    int stop;
236
{
237
  int i;
238
  int rpid;
239
  int status;
240
  int found_stop = 0;
241
  int found_trap = 0;
242
 
243
  /* PID may have any number of signals pending.  The kernel will
244
     report each of them to us via wait, and then it's up to us to
245
     pass them along to the process via ptrace, if we so choose.
246
 
247
     We need to paw through the whole set until we've found a SIGTRAP
248
     (or a SIGSTOP, if `stop' is set).  We don't pass the SIGTRAP (or
249
     SIGSTOP) through, but we do re-send all the others, so PID will
250
     receive them when we resume it.  */
251
  int *wstatus = alloca (LINUXTHREAD_NSIG * sizeof (int));
252
  int last = 0;
253
 
254
  /* Look at the pending status */
255
  for (i = linuxthreads_wait_last; i >= 0; i--)
256
    if (linuxthreads_wait_pid[i] == pid)
257
      {
258
        status = linuxthreads_wait_status[i];
259
 
260
        /* Delete the i'th member of the table.  Since the table is
261
           unordered, we can do this simply by copying the table's
262
           last element to the i'th position, and shrinking the table
263
           by one element.  */
264
        if (i < linuxthreads_wait_last)
265
          {
266
            linuxthreads_wait_status[i] =
267
              linuxthreads_wait_status[linuxthreads_wait_last];
268
            linuxthreads_wait_pid[i] =
269
              linuxthreads_wait_pid[linuxthreads_wait_last];
270
          }
271
        linuxthreads_wait_last--;
272
 
273
        if (!WIFSTOPPED(status)) /* Thread has died */
274
          return 0;
275
 
276
        if (WSTOPSIG(status) == SIGTRAP)
277
          {
278
            if (stop)
279
              found_trap = 1;
280
            else
281
              return 1;
282
          }
283
        else if (WSTOPSIG(status) == SIGSTOP)
284
          {
285
            if (stop)
286
              found_stop = 1;
287
          }
288
        else
289
          {
290
            wstatus[0] = status;
291
            last = 1;
292
          }
293
 
294
        break;
295
      }
296
 
297
  if (stop)
298
    {
299
      /* Make sure that we'll find what we're looking for.  */
300
      if (!found_trap)
301
        {
302
          kill (pid, SIGTRAP);
303
        }
304
      if (!found_stop)
305
        {
306
          kill (pid, SIGSTOP);
307
        }
308
    }
309
 
310
  /* Catch all status until SIGTRAP and optionally SIGSTOP show up.  */
311
  for (;;)
312
    {
313
      /* resume the child every time... */
314
      child_resume (pid, 1, TARGET_SIGNAL_0);
315
 
316
      /* loop as long as errno == EINTR:
317
         waitpid syscall may be aborted due to GDB receiving a signal.
318
         FIXME: EINTR handling should no longer be necessary here, since
319
         we now block SIGCHLD except in an explicit sigsuspend call.  */
320
 
321
      for (;;)
322
        {
323
          rpid = waitpid (pid, &status, __WCLONE);
324
          if (rpid > 0)
325
            {
326
              break;
327
            }
328
          if (errno == EINTR)
329
            {
330
              continue;
331
            }
332
 
333
          /* There are a few reasons the wait call above may have
334
             failed.  If the thread manager dies, its children get
335
             reparented, and this interferes with GDB waiting for
336
             them, in some cases.  Another possibility is that the
337
             initial thread was not cloned, so calling wait with
338
             __WCLONE won't find it.  I think neither of these should
339
             occur in modern Linux kernels --- they don't seem to in
340
             2.0.36.  */
341
          rpid = waitpid (pid, &status, 0);
342
          if (rpid > 0)
343
            {
344
              break;
345
            }
346
          if (errno != EINTR)
347
            perror_with_name ("find_trap/waitpid");
348
        }
349
 
350
      if (!WIFSTOPPED(status)) /* Thread has died */
351
        return 0;
352
 
353
      if (WSTOPSIG(status) == SIGTRAP)
354
        if (!stop || found_stop)
355
          break;
356
        else
357
          found_trap = 1;
358
      else if (WSTOPSIG(status) != SIGSTOP)
359
        wstatus[last++] = status;
360
      else if (stop)
361
        {
362
          if (found_trap)
363
            break;
364
          else
365
            found_stop = 1;
366
        }
367
    }
368
 
369
  /* Resend any other signals we noticed to the thread, to be received
370
     when we continue it.  */
371
  while (--last >= 0)
372
    {
373
      kill (pid, WSTOPSIG(wstatus[last]));
374
    }
375
 
376
  return 1;
377
}
378
 
379
/* Cleanup stub for save_inferior_pid.  */
380
static void
381
restore_inferior_pid (void *arg)
382
{
383
  int *saved_pid_ptr = arg;
384
  inferior_pid = *saved_pid_ptr;
385
  free (arg);
386
}
387
 
388
/* Register a cleanup to restore the value of inferior_pid.  */
389
static struct cleanup *
390
save_inferior_pid (void)
391
{
392
  int *saved_pid_ptr;
393
 
394
  saved_pid_ptr = xmalloc (sizeof (int));
395
  *saved_pid_ptr = inferior_pid;
396
  return make_cleanup (restore_inferior_pid, saved_pid_ptr);
397
}
398
 
399
static void
400
sigchld_handler (signo)
401
    int signo;
402
{
403
  /* This handler is used to get an EINTR while doing waitpid()
404
     when an event is received */
405
}
406
 
407
/* Have we already collected a wait status for PID in the
408
   linuxthreads_wait bag?  */
409
static int
410
linuxthreads_pending_status (pid)
411
    int pid;
412
{
413
  int i;
414
  for (i = linuxthreads_wait_last; i >= 0; i--)
415
    if (linuxthreads_wait_pid[i] == pid)
416
      return 1;
417
  return 0;
418
}
419
 
420
 
421
/* Internal linuxthreads signal management */
422
 
423
/* Check in OBJFILE for the variable that holds the number for signal SIG.
424
   We assume that we've already found other LinuxThreads-ish variables
425
   in OBJFILE, so we complain if it's required, but not there.
426
   Return true iff things are okay.  */
427
static int
428
find_signal_var (sig, objfile)
429
     struct linuxthreads_signal *sig;
430
     struct objfile *objfile;
431
{
432
  struct minimal_symbol *ms = lookup_minimal_symbol (sig->var, NULL, objfile);
433
 
434
  if (! ms)
435
    {
436
      if (sig->required)
437
        {
438
          fprintf_unfiltered (gdb_stderr,
439
                              "Unable to find linuxthreads symbol \"%s\"\n",
440
                              sig->var);
441
          return 0;
442
        }
443
      else
444
        {
445
          sig->addr = 0;
446
          return 1;
447
        }
448
    }
449
 
450
  sig->addr = SYMBOL_VALUE_ADDRESS (ms);
451
 
452
  return 1;
453
}
454
 
455
static int
456
find_all_signal_vars (objfile)
457
     struct objfile *objfile;
458
{
459
  return (   find_signal_var (&linuxthreads_sig_restart, objfile)
460
          && find_signal_var (&linuxthreads_sig_cancel,  objfile)
461
          && find_signal_var (&linuxthreads_sig_debug,   objfile));
462
}
463
 
464
/* A struct complaint isn't appropriate here.  */
465
static int complained_cannot_determine_thread_signal_number = 0;
466
 
467
/* Check to see if the variable holding the signal number for SIG has
468
   been initialized yet.  If it has, tell GDB to pass that signal
469
   through to the inferior silently.  */
470
static void
471
check_signal_number (sig)
472
     struct linuxthreads_signal *sig;
473
{
474
  int num;
475
 
476
  if (sig->signal)
477
    /* We already know this signal number.  */
478
    return;
479
 
480
  if (! sig->addr)
481
    /* We don't know the variable's address yet.  */
482
    return;
483
 
484
  if (target_read_memory (sig->addr, (char *)&num, sizeof (num))
485
      != 0)
486
    {
487
      /* If this happens once, it'll probably happen for all the
488
         signals, so only complain once.  */
489
      if (! complained_cannot_determine_thread_signal_number)
490
        warning ("Cannot determine thread signal number; "
491
                 "GDB may report spurious signals.");
492
      complained_cannot_determine_thread_signal_number = 1;
493
      return;
494
    }
495
 
496
  if (num == 0)
497
    /* It hasn't been initialized yet.  */
498
    return;
499
 
500
  /* We know sig->signal was zero, and is becoming non-zero, so it's
501
     okay to sample GDB's original settings.  */
502
  sig->signal = num;
503
  sig->stop  = signal_stop_update  (target_signal_from_host (num), 0);
504
  sig->print = signal_print_update (target_signal_from_host (num), 0);
505
}
506
 
507
void
508
check_all_signal_numbers ()
509
{
510
  /* If this isn't a LinuxThreads program, quit early.  */
511
  if (! linuxthreads_max)
512
    return;
513
 
514
  check_signal_number (&linuxthreads_sig_restart);
515
  check_signal_number (&linuxthreads_sig_cancel);
516
  check_signal_number (&linuxthreads_sig_debug);
517
 
518
  /* handle linuxthread exit */
519
  if (linuxthreads_sig_debug.signal
520
      || linuxthreads_sig_restart.signal)
521
    {
522
      struct sigaction sact;
523
 
524
      sact.sa_handler = sigchld_handler;
525
      sigemptyset(&sact.sa_mask);
526
      sact.sa_flags = 0;
527
 
528
      if (linuxthreads_sig_debug.signal > 0)
529
        sigaction(linuxthreads_sig_cancel.signal, &sact, NULL);
530
      else
531
        sigaction(linuxthreads_sig_restart.signal, &sact, NULL);
532
    }
533
}
534
 
535
 
536
/* Restore GDB's original settings for SIG.
537
   This should only be called when we're no longer sure if we're
538
   talking to an executable that uses LinuxThreads, so we clear the
539
   signal number and variable address too.  */
540
static void
541
restore_signal (sig)
542
     struct linuxthreads_signal *sig;
543
{
544
  if (! sig->signal)
545
    return;
546
 
547
  /* We know sig->signal was non-zero, and is becoming zero, so it's
548
     okay to restore GDB's original settings.  */
549
  signal_stop_update  (target_signal_from_host (sig->signal), sig->stop);
550
  signal_print_update (target_signal_from_host (sig->signal), sig->print);
551
 
552
  sig->signal = 0;
553
  sig->addr = 0;
554
}
555
 
556
 
557
/* Restore GDB's original settings for all LinuxThreads signals.
558
   This should only be called when we're no longer sure if we're
559
   talking to an executable that uses LinuxThreads, so we clear the
560
   signal number and variable address too.  */
561
static void
562
restore_all_signals ()
563
{
564
  restore_signal (&linuxthreads_sig_restart);
565
  restore_signal (&linuxthreads_sig_cancel);
566
  restore_signal (&linuxthreads_sig_debug);
567
 
568
  /* If it happens again, we should complain again.  */
569
  complained_cannot_determine_thread_signal_number = 0;
570
}
571
 
572
 
573
 
574
 
575
/* Apply FUNC to the pid of each active thread.  This consults the
576
   inferior's handle table to find active threads.
577
 
578
   If ALL is non-zero, process all threads.
579
   If ALL is zero, skip threads with pending status.  */
580
static void
581
iterate_active_threads (func, all)
582
    void (*func)(int);
583
    int all;
584
{
585
  CORE_ADDR descr;
586
  int pid;
587
  int i;
588
  int num;
589
 
590
  read_memory (linuxthreads_num, (char *)&num, sizeof (int));
591
 
592
  for (i = 0; i < linuxthreads_max && num > 0; i++)
593
    {
594
      read_memory (linuxthreads_handles +
595
                   linuxthreads_sizeof_handle * i + linuxthreads_offset_descr,
596
                   (char *)&descr, sizeof (void *));
597
      if (descr)
598
        {
599
          num--;
600
          read_memory (descr + linuxthreads_offset_pid,
601
                       (char *)&pid, sizeof (pid_t));
602
          if (pid > 0 && pid != linuxthreads_manager_pid
603
              && (all || (!linuxthreads_pending_status (pid))))
604
            (*func)(pid);
605
        }
606
    }
607
}
608
 
609
/* Insert a thread breakpoint at linuxthreads_breakpoint_addr.
610
   This is the worker function for linuxthreads_insert_breakpoint,
611
   which passes it to iterate_active_threads.  */
612
static void
613
insert_breakpoint (pid)
614
    int pid;
615
{
616
  int j;
617
 
618
  /* Remove (if any) the positive zombie breakpoint.  */
619
  for (j = linuxthreads_breakpoint_last; j >= 0; j--)
620
    if (linuxthreads_breakpoint_zombie[j].pid == pid)
621
      {
622
        if ((linuxthreads_breakpoint_zombie[j].pc - DECR_PC_AFTER_BREAK
623
             == linuxthreads_breakpoint_addr)
624
            && !linuxthreads_breakpoint_zombie[j].step)
625
          REMOVE_BREAKPOINT_ZOMBIE(j);
626
        break;
627
      }
628
}
629
 
630
/* Note that we're about to remove a thread breakpoint at
631
   linuxthreads_breakpoint_addr.
632
 
633
   This is the worker function for linuxthreads_remove_breakpoint,
634
   which passes it to iterate_active_threads.  The actual work of
635
   overwriting the breakpoint instruction is done by
636
   child_ops.to_remove_breakpoint; here, we simply create a zombie
637
   breakpoint if the thread's PC is pointing at the breakpoint being
638
   removed.  */
639
static void
640
remove_breakpoint (pid)
641
    int pid;
642
{
643
  int j;
644
 
645
  /* Insert a positive zombie breakpoint (if needed).  */
646
  for (j = 0; j <= linuxthreads_breakpoint_last; j++)
647
    if (linuxthreads_breakpoint_zombie[j].pid == pid)
648
      break;
649
 
650
  if (in_thread_list (pid) && linuxthreads_thread_alive (pid))
651
    {
652
      CORE_ADDR pc = read_pc_pid (pid);
653
      if (linuxthreads_breakpoint_addr == pc - DECR_PC_AFTER_BREAK
654
          && j > linuxthreads_breakpoint_last)
655
        {
656
          linuxthreads_breakpoint_zombie[j].pid = pid;
657
          linuxthreads_breakpoint_zombie[j].pc = pc;
658
          linuxthreads_breakpoint_zombie[j].step = 0;
659
          linuxthreads_breakpoint_last++;
660
        }
661
    }
662
}
663
 
664
/* Kill a thread */
665
static void
666
kill_thread (pid)
667
    int pid;
668
{
669
  if (in_thread_list (pid))
670
    {
671
      ptrace (PT_KILL, pid, (PTRACE_ARG3_TYPE) 0, 0);
672
    }
673
  else
674
    {
675
      kill (pid, SIGKILL);
676
    }
677
}
678
 
679
/* Resume a thread */
680
static void
681
resume_thread (pid)
682
    int pid;
683
{
684
  if (pid != inferior_pid
685
      && in_thread_list (pid)
686
      && linuxthreads_thread_alive (pid))
687
    {
688
      if (pid == linuxthreads_step_pid)
689
        {
690
          child_resume (pid, 1, linuxthreads_step_signo);
691
        }
692
      else
693
        {
694
          child_resume (pid, 0, TARGET_SIGNAL_0);
695
        }
696
    }
697
}
698
 
699
/* Detach a thread */
700
static void
701
detach_thread (pid)
702
    int pid;
703
{
704
  if (in_thread_list (pid) && linuxthreads_thread_alive (pid))
705
    {
706
      /* Remove pending SIGTRAP and SIGSTOP */
707
      linuxthreads_find_trap (pid, 1);
708
 
709
      inferior_pid = pid;
710
      detach (TARGET_SIGNAL_0);
711
      inferior_pid = linuxthreads_manager_pid;
712
    }
713
}
714
 
715
/* Attach a thread */
716
void
717
attach_thread (pid)
718
     int pid;
719
{
720
  if (ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0) != 0)
721
    perror_with_name ("attach_thread");
722
}
723
 
724
/* Stop a thread */
725
static void
726
stop_thread (pid)
727
    int pid;
728
{
729
  if (pid != inferior_pid)
730
    {
731
      if (in_thread_list (pid))
732
        {
733
          kill (pid, SIGSTOP);
734
        }
735
      else if (ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0) == 0)
736
        {
737
          if (!linuxthreads_attach_pending)
738
            printf_filtered ("[New %s]\n", target_pid_to_str (pid));
739
          add_thread (pid);
740
          if (linuxthreads_sig_debug.signal)
741
            {
742
              /* After a new thread in glibc 2.1 signals gdb its existence,
743
                 it suspends itself and wait for linuxthreads_sig_restart,
744
                 now we can wake it up. */
745
              kill (pid, linuxthreads_sig_restart.signal);
746
            }
747
        }
748
      else
749
        perror_with_name ("ptrace in stop_thread");
750
    }
751
}
752
 
753
/* Wait for a thread */
754
static void
755
wait_thread (pid)
756
    int pid;
757
{
758
  int status;
759
  int rpid;
760
 
761
  if (pid != inferior_pid && in_thread_list (pid))
762
    {
763
      /* loop as long as errno == EINTR:
764
         waitpid syscall may be aborted if GDB receives a signal.
765
         FIXME: EINTR handling should no longer be necessary here, since
766
         we now block SIGCHLD except during an explicit sigsuspend call. */
767
      for (;;)
768
        {
769
          /* Get first pid status.  */
770
          rpid = waitpid(pid, &status, __WCLONE);
771
          if (rpid > 0)
772
            {
773
              break;
774
            }
775
          if (errno == EINTR)
776
            {
777
              continue;
778
            }
779
 
780
          /* There are two reasons this might have failed:
781
 
782
             1) PID is the initial thread, which wasn't cloned, so
783
             passing the __WCLONE flag to waitpid prevented us from
784
             finding it.
785
 
786
             2) The manager thread is the parent of all but the
787
             initial thread; if it dies, the children will all be
788
             reparented to init, which will wait for them.  This means
789
             our call to waitpid won't find them.
790
 
791
             Actually, based on a casual look at the 2.0.36 kernel
792
             code, I don't think either of these cases happen.  But I
793
             don't have things set up for remotely debugging the
794
             kernel, so I'm not sure.  And perhaps older kernels
795
             didn't work.  */
796
          rpid = waitpid(pid, &status, 0);
797
          if (rpid > 0)
798
            {
799
              break;
800
            }
801
          if (errno != EINTR && linuxthreads_thread_alive (pid))
802
            perror_with_name ("wait_thread/waitpid");
803
 
804
          /* the thread is dead.  */
805
          return;
806
        }
807
      if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
808
        {
809
          linuxthreads_wait_pid[++linuxthreads_wait_last] = pid;
810
          linuxthreads_wait_status[linuxthreads_wait_last] = status;
811
        }
812
    }
813
}
814
 
815
/* Walk through the linuxthreads handles in order to detect all
816
   threads and stop them */
817
static void
818
update_stop_threads (test_pid)
819
    int test_pid;
820
{
821
  struct cleanup *old_chain = NULL;
822
 
823
  check_all_signal_numbers ();
824
 
825
  if (linuxthreads_manager_pid == 0)
826
    {
827
      if (linuxthreads_manager)
828
        {
829
          if (test_pid > 0 && test_pid != inferior_pid)
830
            {
831
              old_chain = save_inferior_pid ();
832
              inferior_pid = test_pid;
833
            }
834
          read_memory (linuxthreads_manager,
835
                       (char *)&linuxthreads_manager_pid, sizeof (pid_t));
836
        }
837
      if (linuxthreads_initial)
838
        {
839
          if (test_pid > 0 && test_pid != inferior_pid)
840
            {
841
              old_chain = save_inferior_pid ();
842
              inferior_pid = test_pid;
843
            }
844
          read_memory(linuxthreads_initial,
845
                      (char *)&linuxthreads_initial_pid, sizeof (pid_t));
846
        }
847
    }
848
 
849
  if (linuxthreads_manager_pid != 0)
850
    {
851
      if (old_chain == NULL && test_pid > 0 &&
852
          test_pid != inferior_pid && linuxthreads_thread_alive (test_pid))
853
        {
854
          old_chain = save_inferior_pid ();
855
          inferior_pid = test_pid;
856
        }
857
 
858
      if (linuxthreads_thread_alive (inferior_pid))
859
        {
860
          if (test_pid > 0)
861
            {
862
              if (test_pid != linuxthreads_manager_pid
863
                  && !linuxthreads_pending_status (linuxthreads_manager_pid))
864
                {
865
                  stop_thread (linuxthreads_manager_pid);
866
                  wait_thread (linuxthreads_manager_pid);
867
                }
868
              if (!in_thread_list (test_pid))
869
                {
870
                  if (!linuxthreads_attach_pending)
871
                    printf_filtered ("[New %s]\n",
872
                                     target_pid_to_str (test_pid));
873
                  add_thread (test_pid);
874
                  if (linuxthreads_sig_debug.signal
875
                      && inferior_pid == test_pid)
876
                    {
877
                      /* After a new thread in glibc 2.1 signals gdb its
878
                         existence, it suspends itself and wait for
879
                         linuxthreads_sig_restart, now we can wake it up. */
880
                      kill (test_pid, linuxthreads_sig_restart.signal);
881
                    }
882
                }
883
            }
884
          iterate_active_threads (stop_thread, 0);
885
          iterate_active_threads (wait_thread, 0);
886
        }
887
    }
888
 
889
  if (old_chain != NULL)
890
    do_cleanups (old_chain);
891
}
892
 
893
/* This routine is called whenever a new symbol table is read in, or
894
   when all symbol tables are removed.  linux-thread event handling
895
   can only be initialized when we find the right variables in
896
   libpthread.so.  Since it's a shared library, those variables don't
897
   show up until the library gets mapped and the symbol table is read
898
   in.  */
899
 
900
/* This new_objfile event is now managed by a chained function pointer.
901
 * It is the callee's responsability to call the next client on the chain.
902
 */
903
 
904
/* Saved pointer to previous owner of the new_objfile event. */
905
static void (*target_new_objfile_chain) PARAMS ((struct objfile *));
906
 
907
void
908
linuxthreads_new_objfile (objfile)
909
    struct objfile *objfile;
910
{
911
  struct minimal_symbol *ms;
912
 
913
  /* Call predecessor on chain, if any.
914
     Calling the new module first allows it to dominate,
915
     if it finds its compatible libraries.  */
916
 
917
  if (target_new_objfile_chain)
918
    target_new_objfile_chain (objfile);
919
 
920
  if (!objfile)
921
    {
922
      /* We're starting an entirely new executable, so we can no
923
         longer be sure that it uses LinuxThreads.  Restore the signal
924
         flags to their original states.  */
925
      restore_all_signals ();
926
 
927
      /* Indicate that we don't know anything's address any more.  */
928
      linuxthreads_max = 0;
929
 
930
      goto quit;
931
    }
932
 
933
  /* If we've already found our variables in another objfile, don't
934
     bother looking for them again.  */
935
  if (linuxthreads_max)
936
    goto quit;
937
 
938
  if (! lookup_minimal_symbol ("__pthread_initial_thread", NULL, objfile))
939
    /* This object file isn't the pthreads library.  */
940
    goto quit;
941
 
942
  if ((ms = lookup_minimal_symbol ("__pthread_threads_debug",
943
                                   NULL, objfile)) == NULL)
944
    {
945
      /* The debugging-aware libpthreads is not present in this objfile */
946
      warning ("\
947
This program seems to use POSIX threads, but the thread library used\n\
948
does not support debugging.  This may make using GDB difficult.  Don't\n\
949
set breakpoints or single-step through code that might be executed by\n\
950
any thread other than the main thread.");
951
      goto quit;
952
    }
953
  linuxthreads_debug = SYMBOL_VALUE_ADDRESS (ms);
954
 
955
  /* Read internal structures configuration */
956
  if ((ms = lookup_minimal_symbol ("__pthread_sizeof_handle",
957
                                   NULL, objfile)) == NULL
958
      || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
959
                             (char *)&linuxthreads_sizeof_handle,
960
                             sizeof (linuxthreads_sizeof_handle)) != 0)
961
    {
962
      fprintf_unfiltered (gdb_stderr,
963
                          "Unable to find linuxthreads symbol \"%s\"\n",
964
                          "__pthread_sizeof_handle");
965
      goto quit;
966
    }
967
 
968
  if ((ms = lookup_minimal_symbol ("__pthread_offsetof_descr",
969
                                   NULL, objfile)) == NULL
970
      || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
971
                             (char *)&linuxthreads_offset_descr,
972
                             sizeof (linuxthreads_offset_descr)) != 0)
973
    {
974
      fprintf_unfiltered (gdb_stderr,
975
                          "Unable to find linuxthreads symbol \"%s\"\n",
976
                          "__pthread_offsetof_descr");
977
      goto quit;
978
    }
979
 
980
  if ((ms = lookup_minimal_symbol ("__pthread_offsetof_pid",
981
                                   NULL, objfile)) == NULL
982
      || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
983
                             (char *)&linuxthreads_offset_pid,
984
                             sizeof (linuxthreads_offset_pid)) != 0)
985
    {
986
      fprintf_unfiltered (gdb_stderr,
987
                          "Unable to find linuxthreads symbol \"%s\"\n",
988
                          "__pthread_offsetof_pid");
989
      goto quit;
990
    }
991
 
992
  if (! find_all_signal_vars (objfile))
993
    goto quit;
994
 
995
  /* Read adresses of internal structures to access */
996
  if ((ms = lookup_minimal_symbol ("__pthread_handles",
997
                                   NULL, objfile)) == NULL)
998
    {
999
      fprintf_unfiltered (gdb_stderr,
1000
                          "Unable to find linuxthreads symbol \"%s\"\n",
1001
                          "__pthread_handles");
1002
      goto quit;
1003
    }
1004
  linuxthreads_handles = SYMBOL_VALUE_ADDRESS (ms);
1005
 
1006
  if ((ms = lookup_minimal_symbol ("__pthread_handles_num",
1007
                                   NULL, objfile)) == NULL)
1008
    {
1009
      fprintf_unfiltered (gdb_stderr,
1010
                          "Unable to find linuxthreads symbol \"%s\"\n",
1011
                          "__pthread_handles_num");
1012
      goto quit;
1013
    }
1014
  linuxthreads_num = SYMBOL_VALUE_ADDRESS (ms);
1015
 
1016
  if ((ms = lookup_minimal_symbol ("__pthread_manager_thread",
1017
                                   NULL, objfile)) == NULL)
1018
    {
1019
      fprintf_unfiltered (gdb_stderr,
1020
                          "Unable to find linuxthreads symbol \"%s\"\n",
1021
                          "__pthread_manager_thread");
1022
      goto quit;
1023
    }
1024
  linuxthreads_manager = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
1025
 
1026
  if ((ms = lookup_minimal_symbol ("__pthread_initial_thread",
1027
                                   NULL, objfile)) == NULL)
1028
    {
1029
      fprintf_unfiltered (gdb_stderr,
1030
                          "Unable to find linuxthreads symbol \"%s\"\n",
1031
                          "__pthread_initial_thread");
1032
      goto quit;
1033
    }
1034
  linuxthreads_initial = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
1035
 
1036
  /* Search for this last, so it won't be set to a non-zero value unless
1037
     we successfully found all the symbols above.  */
1038
  if ((ms = lookup_minimal_symbol ("__pthread_threads_max",
1039
                                   NULL, objfile)) == NULL
1040
      || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
1041
                             (char *)&linuxthreads_max,
1042
                             sizeof (linuxthreads_max)) != 0)
1043
    {
1044
      fprintf_unfiltered (gdb_stderr,
1045
                          "Unable to find linuxthreads symbol \"%s\"\n",
1046
                          "__pthread_threads_max");
1047
      goto quit;
1048
    }
1049
 
1050
  /* Allocate gdb internal structures */
1051
  linuxthreads_wait_pid =
1052
    (int *) xmalloc (sizeof (int) * (linuxthreads_max + 1));
1053
  linuxthreads_wait_status =
1054
    (int *) xmalloc (sizeof (int) * (linuxthreads_max + 1));
1055
  linuxthreads_breakpoint_zombie = (struct linuxthreads_breakpoint *)
1056
    xmalloc (sizeof (struct linuxthreads_breakpoint) * (linuxthreads_max + 1));
1057
 
1058
  if (inferior_pid &&
1059
      !linuxthreads_attach_pending &&
1060
      !using_thread_db)         /* suppressed by thread_db module */
1061
    {
1062
      int on = 1;
1063
 
1064
      target_write_memory (linuxthreads_debug, (char *)&on, sizeof (on));
1065
      linuxthreads_attach_pending = 1;
1066
      update_stop_threads (inferior_pid);
1067
      linuxthreads_attach_pending = 0;
1068
    }
1069
 
1070
  check_all_signal_numbers ();
1071
 
1072
quit:
1073
}
1074
 
1075
/* If we have switched threads from a one that stopped at breakpoint,
1076
   return 1 otherwise 0.  */
1077
 
1078
int
1079
linuxthreads_prepare_to_proceed (step)
1080
    int step;
1081
{
1082
  if (!linuxthreads_max
1083
      || !linuxthreads_manager_pid
1084
      || !linuxthreads_breakpoint_pid
1085
      || !breakpoint_here_p (read_pc_pid (linuxthreads_breakpoint_pid)))
1086
    return 0;
1087
 
1088
  if (step)
1089
    {
1090
      /* Mark the current inferior as single stepping process.  */
1091
      linuxthreads_step_pid = inferior_pid;
1092
    }
1093
 
1094
  linuxthreads_inferior_pid = linuxthreads_breakpoint_pid;
1095
  return linuxthreads_breakpoint_pid;
1096
}
1097
 
1098
/* Convert a pid to printable form. */
1099
 
1100
char *
1101
linuxthreads_pid_to_str (pid)
1102
    int pid;
1103
{
1104
  static char buf[100];
1105
 
1106
  sprintf (buf, "%s %d%s", linuxthreads_max ? "Thread" : "Pid", pid,
1107
           (pid == linuxthreads_manager_pid) ? " (manager thread)"
1108
           : (pid == linuxthreads_initial_pid) ? " (initial thread)"
1109
           : "");
1110
 
1111
  return buf;
1112
}
1113
 
1114
/* Attach to process PID, then initialize for debugging it
1115
   and wait for the trace-trap that results from attaching.  */
1116
 
1117
static void
1118
linuxthreads_attach (args, from_tty)
1119
    char *args;
1120
    int from_tty;
1121
{
1122
  if (!args)
1123
    error_no_arg ("process-id to attach");
1124
 
1125
  push_target (&linuxthreads_ops);
1126
  linuxthreads_breakpoints_inserted = 1;
1127
  linuxthreads_breakpoint_last = -1;
1128
  linuxthreads_wait_last = -1;
1129
  WSETSTOP (linuxthreads_exit_status, 0);
1130
 
1131
  child_ops.to_attach (args, from_tty);
1132
 
1133
  if (linuxthreads_max)
1134
    linuxthreads_attach_pending = 1;
1135
}
1136
 
1137
/* Take a program previously attached to and detaches it.
1138
   The program resumes execution and will no longer stop
1139
   on signals, etc.  We'd better not have left any breakpoints
1140
   in the program or it'll die when it hits one.  For this
1141
   to work, it may be necessary for the process to have been
1142
   previously attached.  It *might* work if the program was
1143
   started via the normal ptrace (PTRACE_TRACEME).  */
1144
 
1145
static void
1146
linuxthreads_detach (args, from_tty)
1147
    char *args;
1148
    int from_tty;
1149
{
1150
  if (linuxthreads_max)
1151
    {
1152
      int i;
1153
      int pid;
1154
      int off = 0;
1155
      target_write_memory (linuxthreads_debug, (char *)&off, sizeof (off));
1156
 
1157
      /* Walk through linuxthreads array in order to detach known threads.  */
1158
      if (linuxthreads_manager_pid != 0)
1159
        {
1160
          /* Get rid of all positive zombie breakpoints.  */
1161
          for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1162
            {
1163
              if (linuxthreads_breakpoint_zombie[i].step)
1164
                continue;
1165
 
1166
              pid = linuxthreads_breakpoint_zombie[i].pid;
1167
              if (!linuxthreads_thread_alive (pid))
1168
                continue;
1169
 
1170
              if (linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (pid))
1171
                continue;
1172
 
1173
              /* Continue in STEP mode until the thread pc has moved or
1174
                 until SIGTRAP is found on the same PC.  */
1175
              if (linuxthreads_find_trap (pid, 0)
1176
                  && linuxthreads_breakpoint_zombie[i].pc == read_pc_pid (pid))
1177
                write_pc_pid (linuxthreads_breakpoint_zombie[i].pc
1178
                              - DECR_PC_AFTER_BREAK, pid);
1179
            }
1180
 
1181
          /* Detach thread after thread.  */
1182
          inferior_pid = linuxthreads_manager_pid;
1183
          iterate_active_threads (detach_thread, 1);
1184
 
1185
          /* Remove pending SIGTRAP and SIGSTOP */
1186
          linuxthreads_find_trap (inferior_pid, 1);
1187
 
1188
          linuxthreads_wait_last = -1;
1189
          WSETSTOP (linuxthreads_exit_status, 0);
1190
        }
1191
 
1192
      linuxthreads_inferior_pid = 0;
1193
      linuxthreads_breakpoint_pid = 0;
1194
      linuxthreads_step_pid = 0;
1195
      linuxthreads_step_signo = TARGET_SIGNAL_0;
1196
      linuxthreads_manager_pid = 0;
1197
      linuxthreads_initial_pid = 0;
1198
      linuxthreads_attach_pending = 0;
1199
      init_thread_list ();           /* Destroy thread info */
1200
    }
1201
 
1202
  child_ops.to_detach (args, from_tty);
1203
 
1204
  unpush_target (&linuxthreads_ops);
1205
}
1206
 
1207
/* Resume execution of process PID.  If STEP is nozero, then
1208
   just single step it.  If SIGNAL is nonzero, restart it with that
1209
   signal activated.  */
1210
 
1211
static void
1212
linuxthreads_resume (pid, step, signo)
1213
    int pid;
1214
    int step;
1215
    enum target_signal signo;
1216
{
1217
  if (!linuxthreads_max || stop_soon_quietly || linuxthreads_manager_pid == 0)
1218
    {
1219
      child_ops.to_resume (pid, step, signo);
1220
    }
1221
  else
1222
    {
1223
      int rpid;
1224
      if (linuxthreads_inferior_pid)
1225
        {
1226
          /* Prepare resume of the last thread that hit a breakpoint */
1227
          linuxthreads_breakpoints_inserted = 0;
1228
          rpid = linuxthreads_inferior_pid;
1229
          linuxthreads_step_signo = signo;
1230
        }
1231
      else
1232
        {
1233
          struct cleanup *old_chain = NULL;
1234
          int i;
1235
 
1236
          if (pid < 0)
1237
            {
1238
              linuxthreads_step_pid = step ? inferior_pid : 0;
1239
              linuxthreads_step_signo = signo;
1240
              rpid = inferior_pid;
1241
            }
1242
          else
1243
            rpid = pid;
1244
 
1245
          if (pid < 0 || !step)
1246
            {
1247
              linuxthreads_breakpoints_inserted = 1;
1248
 
1249
              /* Walk through linuxthreads array in order to resume threads */
1250
              if (pid >= 0 && inferior_pid != pid)
1251
                {
1252
                  old_chain = save_inferior_pid ();
1253
                  inferior_pid = pid;
1254
                }
1255
 
1256
              iterate_active_threads (resume_thread, 0);
1257
              if (linuxthreads_manager_pid != inferior_pid
1258
                  && !linuxthreads_pending_status (linuxthreads_manager_pid))
1259
                resume_thread (linuxthreads_manager_pid);
1260
            }
1261
          else
1262
            linuxthreads_breakpoints_inserted = 0;
1263
 
1264
          /* Deal with zombie breakpoint */
1265
          for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1266
            if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1267
              {
1268
                if (linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (rpid))
1269
                  {
1270
                    /* The current pc is out of zombie breakpoint.  */
1271
                    REMOVE_BREAKPOINT_ZOMBIE(i);
1272
                  }
1273
                break;
1274
              }
1275
 
1276
          if (old_chain != NULL)
1277
            do_cleanups (old_chain);
1278
        }
1279
 
1280
      /* Resume initial thread. */
1281
      /* [unles it has a wait event pending] */
1282
      if (!linuxthreads_pending_status (rpid))
1283
        {
1284
          child_ops.to_resume (rpid, step, signo);
1285
        }
1286
    }
1287
}
1288
 
1289
/* Abstract out the child_wait functionality.  */
1290
int
1291
linux_child_wait (pid, rpid, status)
1292
     int pid;
1293
     int *rpid;
1294
     int *status;
1295
{
1296
  int save_errno;
1297
 
1298
  /* Note: inftarg has these inside the loop. */
1299
  set_sigint_trap ();   /* Causes SIGINT to be passed on to the
1300
                           attached process. */
1301
  set_sigio_trap  ();
1302
 
1303
  errno = save_errno = 0;
1304
  for (;;)
1305
    {
1306
      errno = 0;
1307
      *rpid = waitpid (pid, status, __WCLONE | WNOHANG);
1308
      save_errno = errno;
1309
 
1310
      if (*rpid > 0)
1311
        {
1312
          /* Got an event -- break out */
1313
          break;
1314
        }
1315
      if (errno == EINTR)       /* interrupted by signal, try again */
1316
        {
1317
          continue;
1318
        }
1319
 
1320
      errno = 0;
1321
      *rpid = waitpid (pid, status, WNOHANG);
1322
      if (*rpid > 0)
1323
        {
1324
          /* Got an event -- break out */
1325
          break;
1326
        }
1327
      if (errno == EINTR)
1328
        {
1329
          continue;
1330
        }
1331
      if (errno != 0 && save_errno != 0)
1332
        {
1333
          break;
1334
        }
1335
      sigsuspend(&linuxthreads_block_mask);
1336
    }
1337
  clear_sigio_trap  ();
1338
  clear_sigint_trap ();
1339
 
1340
  return errno ? errno : save_errno;
1341
}
1342
 
1343
 
1344
/* Wait for any threads to stop.  We may have to convert PID from a thread id
1345
   to a LWP id, and vice versa on the way out.  */
1346
 
1347
static int
1348
linuxthreads_wait (pid, ourstatus)
1349
     int pid;
1350
     struct target_waitstatus *ourstatus;
1351
{
1352
  int status;
1353
  int rpid;
1354
  int i;
1355
  int last;
1356
  int *wstatus;
1357
 
1358
  if (linuxthreads_max && !linuxthreads_breakpoints_inserted)
1359
    wstatus = alloca (LINUXTHREAD_NSIG * sizeof (int));
1360
 
1361
  /* See if the inferior has chosen values for its signals yet.  By
1362
     checking for them here, we can be sure we've updated GDB's signal
1363
     handling table before the inferior ever gets one of them.  (Well,
1364
     before we notice, anyway.)  */
1365
  check_all_signal_numbers ();
1366
 
1367
  for (;;)
1368
    {
1369
      if (!linuxthreads_max)
1370
          rpid = 0;
1371
      else if (!linuxthreads_breakpoints_inserted)
1372
        {
1373
          if (linuxthreads_inferior_pid)
1374
            pid = linuxthreads_inferior_pid;
1375
          else if (pid < 0)
1376
            pid = inferior_pid;
1377
          last = rpid = 0;
1378
        }
1379
      else if (pid < 0 && linuxthreads_wait_last >= 0)
1380
        {
1381
          status = linuxthreads_wait_status[linuxthreads_wait_last];
1382
          rpid = linuxthreads_wait_pid[linuxthreads_wait_last--];
1383
        }
1384
      else if (pid > 0 && linuxthreads_pending_status (pid))
1385
        {
1386
          for (i = linuxthreads_wait_last; i >= 0; i--)
1387
            if (linuxthreads_wait_pid[i] == pid)
1388
                break;
1389
          if (i < 0)
1390
            rpid = 0;
1391
          else
1392
            {
1393
              status = linuxthreads_wait_status[i];
1394
              rpid = pid;
1395
              if (i < linuxthreads_wait_last)
1396
                {
1397
                  linuxthreads_wait_status[i] =
1398
                    linuxthreads_wait_status[linuxthreads_wait_last];
1399
                  linuxthreads_wait_pid[i] =
1400
                    linuxthreads_wait_pid[linuxthreads_wait_last];
1401
                }
1402
              linuxthreads_wait_last--;
1403
            }
1404
        }
1405
      else
1406
          rpid = 0;
1407
 
1408
      if (rpid == 0)
1409
        {
1410
          int save_errno;
1411
 
1412
          save_errno = linux_child_wait (pid, &rpid, &status);
1413
 
1414
          if (rpid == -1)
1415
            {
1416
              if (WIFEXITED(linuxthreads_exit_status))
1417
                {
1418
                  store_waitstatus (ourstatus, linuxthreads_exit_status);
1419
                  return inferior_pid;
1420
                }
1421
              else
1422
                {
1423
                  fprintf_unfiltered
1424
                      (gdb_stderr, "Child process unexpectedly missing: %s.\n",
1425
                       safe_strerror (save_errno));
1426
                  /* Claim it exited with unknown signal.  */
1427
                  ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1428
                  ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1429
                  return -1;
1430
                }
1431
            }
1432
 
1433
          /* We have now gotten a new event from waitpid above. */
1434
 
1435
          /* Signals arrive in any order.  So get all signals until
1436
             SIGTRAP and resend previous ones to be held after.  */
1437
          if (linuxthreads_max
1438
              && !linuxthreads_breakpoints_inserted
1439
              && WIFSTOPPED(status))
1440
            if (WSTOPSIG(status) == SIGTRAP)
1441
              {
1442
                while (--last >= 0)
1443
                  {
1444
                    kill (rpid, WSTOPSIG(wstatus[last]));
1445
                  }
1446
 
1447
                /* insert negative zombie breakpoint */
1448
                for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1449
                  if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1450
                      break;
1451
                if (i > linuxthreads_breakpoint_last)
1452
                  {
1453
                    linuxthreads_breakpoint_zombie[i].pid = rpid;
1454
                    linuxthreads_breakpoint_last++;
1455
                  }
1456
                linuxthreads_breakpoint_zombie[i].pc = read_pc_pid (rpid);
1457
                linuxthreads_breakpoint_zombie[i].step = 1;
1458
              }
1459
            else
1460
              {
1461
                if (WSTOPSIG(status) != SIGSTOP)
1462
                  {
1463
                    for (i = 0; i < last; i++)
1464
                      if (wstatus[i] == status)
1465
                        break;
1466
                    if (i >= last)
1467
                      {
1468
                        wstatus[last++] = status;
1469
                      }
1470
                  }
1471
                child_resume (rpid, 1, TARGET_SIGNAL_0);
1472
                continue;
1473
              }
1474
          if (linuxthreads_inferior_pid)
1475
            linuxthreads_inferior_pid = 0;
1476
        }
1477
 
1478
      if (linuxthreads_max && !stop_soon_quietly)
1479
        {
1480
          if (linuxthreads_max
1481
              && WIFSTOPPED(status)
1482
              && WSTOPSIG(status) == SIGSTOP)
1483
            {
1484
              /* Skip SIGSTOP signals.  */
1485
              if (!linuxthreads_pending_status (rpid))
1486
                {
1487
                  if (linuxthreads_step_pid == rpid)
1488
                    {
1489
                      child_resume (rpid, 1, linuxthreads_step_signo);
1490
                    }
1491
                  else
1492
                    {
1493
                      child_resume (rpid, 0, TARGET_SIGNAL_0);
1494
                    }
1495
                }
1496
              continue;
1497
            }
1498
 
1499
          /* Do no report exit status of cloned threads.  */
1500
          if (WIFEXITED(status))
1501
            {
1502
              if (rpid == linuxthreads_initial_pid)
1503
                linuxthreads_exit_status = status;
1504
 
1505
              /* Remove any zombie breakpoint.  */
1506
              for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1507
                if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1508
                  {
1509
                    REMOVE_BREAKPOINT_ZOMBIE(i);
1510
                    break;
1511
                  }
1512
              if (pid > 0)
1513
                pid = -1;
1514
              continue;
1515
            }
1516
 
1517
          /* Deal with zombie breakpoint */
1518
          for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1519
            if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1520
              break;
1521
 
1522
          if (i <= linuxthreads_breakpoint_last)
1523
            {
1524
              /* There is a potential zombie breakpoint */
1525
              if (WIFEXITED(status)
1526
                  || linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (rpid))
1527
                {
1528
                  /* The current pc is out of zombie breakpoint.  */
1529
                  REMOVE_BREAKPOINT_ZOMBIE(i);
1530
                }
1531
              else if (!linuxthreads_breakpoint_zombie[i].step
1532
                       && WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)
1533
                {
1534
                  /* This is a real one ==> decrement PC and restart.  */
1535
                  write_pc_pid (linuxthreads_breakpoint_zombie[i].pc
1536
                                - DECR_PC_AFTER_BREAK, rpid);
1537
                  if (linuxthreads_step_pid == rpid)
1538
                    {
1539
                      child_resume (rpid, 1, linuxthreads_step_signo);
1540
                    }
1541
                  else
1542
                    {
1543
                      child_resume (rpid, 0, TARGET_SIGNAL_0);
1544
                    }
1545
                  continue;
1546
                }
1547
            }
1548
 
1549
          /* Walk through linuxthreads array in order to stop them */
1550
          if (linuxthreads_breakpoints_inserted)
1551
            update_stop_threads (rpid);
1552
 
1553
        }
1554
      else if (rpid != inferior_pid)
1555
        continue;
1556
 
1557
      store_waitstatus (ourstatus, status);
1558
 
1559
      if (linuxthreads_attach_pending && !stop_soon_quietly)
1560
        {
1561
          int on = 1;
1562
          if (!using_thread_db)
1563
            {
1564
              target_write_memory (linuxthreads_debug,
1565
                                   (char *) &on, sizeof (on));
1566
              update_stop_threads (rpid);
1567
            }
1568
          linuxthreads_attach_pending = 0;
1569
        }
1570
 
1571
      if (linuxthreads_breakpoints_inserted
1572
          && WIFSTOPPED(status)
1573
          && WSTOPSIG(status) == SIGTRAP)
1574
        linuxthreads_breakpoint_pid = rpid;
1575
      else if (linuxthreads_breakpoint_pid)
1576
        linuxthreads_breakpoint_pid = 0;
1577
 
1578
      return rpid;
1579
    }
1580
}
1581
 
1582
/* Fork an inferior process, and start debugging it with ptrace.  */
1583
 
1584
static void
1585
linuxthreads_create_inferior (exec_file, allargs, env)
1586
    char *exec_file;
1587
    char *allargs;
1588
    char **env;
1589
{
1590
  if (!exec_file && !exec_bfd)
1591
    {
1592
      error ("No executable file specified.\n\
1593
Use the \"file\" or \"exec-file\" command.");
1594
      return;
1595
    }
1596
 
1597
  push_target (&linuxthreads_ops);
1598
  linuxthreads_breakpoints_inserted = 1;
1599
  linuxthreads_breakpoint_last = -1;
1600
  linuxthreads_wait_last = -1;
1601
  WSETSTOP (linuxthreads_exit_status, 0);
1602
 
1603
  if (linuxthreads_max)
1604
    linuxthreads_attach_pending = 1;
1605
 
1606
  child_ops.to_create_inferior (exec_file, allargs, env);
1607
}
1608
 
1609
void
1610
linuxthreads_discard_global_state ()
1611
{
1612
  linuxthreads_inferior_pid = 0;
1613
  linuxthreads_breakpoint_pid = 0;
1614
  linuxthreads_step_pid = 0;
1615
  linuxthreads_step_signo = TARGET_SIGNAL_0;
1616
  linuxthreads_manager_pid = 0;
1617
  linuxthreads_initial_pid = 0;
1618
  linuxthreads_attach_pending = 0;
1619
  linuxthreads_max = 0;
1620
}
1621
 
1622
/* Clean up after the inferior dies.  */
1623
 
1624
static void
1625
linuxthreads_mourn_inferior ()
1626
{
1627
  if (linuxthreads_max)
1628
    {
1629
      int off = 0;
1630
      target_write_memory (linuxthreads_debug, (char *)&off, sizeof (off));
1631
 
1632
      linuxthreads_discard_global_state ();
1633
      init_thread_list();           /* Destroy thread info */
1634
    }
1635
 
1636
  child_ops.to_mourn_inferior ();
1637
 
1638
  unpush_target (&linuxthreads_ops);
1639
}
1640
 
1641
/* Kill the inferior process */
1642
 
1643
static void
1644
linuxthreads_kill ()
1645
{
1646
  int rpid;
1647
  int status;
1648
 
1649
  if (inferior_pid == 0)
1650
    return;
1651
 
1652
  if (linuxthreads_max && linuxthreads_manager_pid != 0)
1653
    {
1654
      /* Remove all threads status.  */
1655
      inferior_pid = linuxthreads_manager_pid;
1656
      iterate_active_threads (kill_thread, 1);
1657
    }
1658
 
1659
  kill_thread (inferior_pid);
1660
 
1661
#if 0
1662
  /* doing_quit_force solves a real problem, but I think a properly
1663
     placed call to catch_errors would do the trick much more cleanly.  */
1664
  if (doing_quit_force >= 0)
1665
    {
1666
      if (linuxthreads_max && linuxthreads_manager_pid != 0)
1667
        {
1668
          /* Wait for thread to complete */
1669
          while ((rpid = waitpid (-1, &status, __WCLONE)) > 0)
1670
            if (!WIFEXITED(status))
1671
              kill_thread (rpid);
1672
 
1673
          while ((rpid = waitpid (-1, &status, 0)) > 0)
1674
            if (!WIFEXITED(status))
1675
              kill_thread (rpid);
1676
        }
1677
      else
1678
        while ((rpid = waitpid (inferior_pid, &status, 0)) > 0)
1679
          if (!WIFEXITED(status))
1680
            ptrace (PT_KILL, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0);
1681
    }
1682
#endif
1683
 
1684
  /* Wait for all threads. */
1685
  do
1686
    {
1687
      rpid = waitpid (-1, &status, __WCLONE | WNOHANG);
1688
    }
1689
  while (rpid > 0 || errno == EINTR);
1690
  /* FIXME: should no longer need to handle EINTR here. */
1691
 
1692
  do
1693
    {
1694
      rpid = waitpid (-1, &status, WNOHANG);
1695
    }
1696
  while (rpid > 0 || errno == EINTR);
1697
  /* FIXME: should no longer need to handle EINTR here. */
1698
 
1699
  linuxthreads_mourn_inferior ();
1700
}
1701
 
1702
/* Insert a breakpoint */
1703
 
1704
static int
1705
linuxthreads_insert_breakpoint (addr, contents_cache)
1706
    CORE_ADDR addr;
1707
    char *contents_cache;
1708
{
1709
  if (linuxthreads_max && linuxthreads_manager_pid != 0)
1710
    {
1711
      linuxthreads_breakpoint_addr = addr;
1712
      iterate_active_threads (insert_breakpoint, 1);
1713
      insert_breakpoint (linuxthreads_manager_pid);
1714
    }
1715
 
1716
  return child_ops.to_insert_breakpoint (addr, contents_cache);
1717
}
1718
 
1719
/* Remove a breakpoint */
1720
 
1721
static int
1722
linuxthreads_remove_breakpoint (addr, contents_cache)
1723
    CORE_ADDR addr;
1724
    char *contents_cache;
1725
{
1726
  if (linuxthreads_max && linuxthreads_manager_pid != 0)
1727
    {
1728
      linuxthreads_breakpoint_addr = addr;
1729
      iterate_active_threads (remove_breakpoint, 1);
1730
      remove_breakpoint (linuxthreads_manager_pid);
1731
    }
1732
 
1733
  return child_ops.to_remove_breakpoint (addr, contents_cache);
1734
}
1735
 
1736
/* Mark our target-struct as eligible for stray "run" and "attach" commands.  */
1737
 
1738
static int
1739
linuxthreads_can_run ()
1740
{
1741
  return child_suppress_run;
1742
}
1743
 
1744
 
1745
static void
1746
init_linuxthreads_ops ()
1747
{
1748
  linuxthreads_ops.to_shortname = "linuxthreads";
1749
  linuxthreads_ops.to_longname  = "LINUX threads and pthread.";
1750
  linuxthreads_ops.to_doc       = "LINUX threads and pthread support.";
1751
  linuxthreads_ops.to_attach    = linuxthreads_attach;
1752
  linuxthreads_ops.to_detach    = linuxthreads_detach;
1753
  linuxthreads_ops.to_resume    = linuxthreads_resume;
1754
  linuxthreads_ops.to_wait      = linuxthreads_wait;
1755
  linuxthreads_ops.to_kill      = linuxthreads_kill;
1756
  linuxthreads_ops.to_can_run   = linuxthreads_can_run;
1757
  linuxthreads_ops.to_stratum   = thread_stratum;
1758
  linuxthreads_ops.to_insert_breakpoint = linuxthreads_insert_breakpoint;
1759
  linuxthreads_ops.to_remove_breakpoint = linuxthreads_remove_breakpoint;
1760
  linuxthreads_ops.to_create_inferior   = linuxthreads_create_inferior;
1761
  linuxthreads_ops.to_mourn_inferior    = linuxthreads_mourn_inferior;
1762
  linuxthreads_ops.to_thread_alive      = linuxthreads_thread_alive;
1763
  linuxthreads_ops.to_pid_to_str        = linuxthreads_pid_to_str;
1764
  linuxthreads_ops.to_magic             = OPS_MAGIC;
1765
}
1766
 
1767
void
1768
_initialize_linuxthreads ()
1769
{
1770
  struct sigaction sact;
1771
  sigset_t linuxthreads_wait_mask;        /* sigset with SIGCHLD */
1772
 
1773
  init_linuxthreads_ops ();
1774
  add_target (&linuxthreads_ops);
1775
  child_suppress_run = 1;
1776
 
1777
  /* Hook onto the "new_objfile" event.
1778
   * If someone else is already hooked onto the event,
1779
   * then make sure he will be called after we are.
1780
   */
1781
  target_new_objfile_chain = target_new_objfile_hook;
1782
  target_new_objfile_hook  = linuxthreads_new_objfile;
1783
 
1784
  /* Attach SIGCHLD handler */
1785
  sact.sa_handler = sigchld_handler;
1786
  sigemptyset (&sact.sa_mask);
1787
  sact.sa_flags = 0;
1788
  sigaction (SIGCHLD, &sact, NULL);
1789
 
1790
  /* initialize SIGCHLD mask */
1791
  sigemptyset (&linuxthreads_wait_mask);
1792
  sigaddset (&linuxthreads_wait_mask, SIGCHLD);
1793
 
1794
  /* Use SIG_BLOCK to block receipt of SIGCHLD.
1795
     The block_mask will allow us to wait for this signal explicitly.  */
1796
  sigprocmask(SIG_BLOCK,
1797
              &linuxthreads_wait_mask,
1798
              &linuxthreads_block_mask);
1799
  /* Make sure that linuxthreads_block_mask is not blocking SIGCHLD */
1800
  sigdelset (&linuxthreads_block_mask, SIGCHLD);
1801
}

powered by: WebSVN 2.1.0

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