(elf64_x86_64_relocate_section): Fix creation of dynamic symbols.
[deliverable/binutils-gdb.git] / gdb / lin-lwp.c
CommitLineData
fb0e1ba7 1/* Multi-threaded debugging support for Linux (LWP layer).
4e052eda 2 Copyright 2000, 2001 Free Software Foundation, Inc.
fb0e1ba7
MK
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21#include "defs.h"
22
23#include "gdb_assert.h"
24#include <errno.h>
25#include <signal.h>
26#include <sys/ptrace.h>
27#include "gdb_wait.h"
28
29#include "gdbthread.h"
30#include "inferior.h"
31#include "target.h"
4e052eda 32#include "regcache.h"
7ca673cd 33#include "gdbcmd.h"
fb0e1ba7 34
7ca673cd 35static int debug_lin_lwp;
fb0e1ba7 36extern const char *strsignal (int sig);
fb0e1ba7
MK
37
38/* On Linux there are no real LWP's. The closest thing to LWP's are
39 processes sharing the same VM space. A multi-threaded process is
40 basically a group of such processes. However, such a grouping is
41 almost entirely a user-space issue; the kernel doesn't enforce such
42 a grouping at all (this might change in the future). In general,
43 we'll rely on the threads library (i.e. the LinuxThreads library)
44 to provide such a grouping.
45
46 It is perfectly well possible to write a multi-threaded application
47 without the assistance of a threads library, by using the clone
48 system call directly. This module should be able to give some
49 rudimentary support for debugging such applications if developers
50 specify the CLONE_PTRACE flag in the clone system call, and are
51 using Linux 2.4 or above.
52
53 Note that there are some peculiarities in Linux that affect this
54 code:
55
56 - In general one should specify the __WCLONE flag to waitpid in
3f07c44b
MK
57 order to make it report events for any of the cloned processes
58 (and leave it out for the initial process). However, if a cloned
59 process has exited the exit status is only reported if the
60 __WCLONE flag is absent. Linux 2.4 has a __WALL flag, but we
61 cannot use it since GDB must work on older systems too.
fb0e1ba7
MK
62
63 - When a traced, cloned process exits and is waited for by the
4c8de859 64 debugger, the kernel reassigns it to the original parent and
fb0e1ba7
MK
65 keeps it around as a "zombie". Somehow, the LinuxThreads library
66 doesn't notice this, which leads to the "zombie problem": When
67 debugged a multi-threaded process that spawns a lot of threads
68 will run out of processes, even if the threads exit, because the
69 "zombies" stay around. */
70
71/* Structure describing a LWP. */
72struct lwp_info
73{
74 /* The process id of the LWP. This is a combination of the LWP id
75 and overall process id. */
39f77062 76 ptid_t ptid;
fb0e1ba7
MK
77
78 /* Non-zero if we sent this LWP a SIGSTOP (but the LWP didn't report
79 it back yet). */
80 int signalled;
81
82 /* Non-zero if this LWP is stopped. */
83 int stopped;
84
fce0e6e1
MK
85 /* Non-zero if this LWP will be/has been resumed. Note that an LWP
86 can be marked both as stopped and resumed at the same time. This
87 happens if we try to resume an LWP that has a wait status
88 pending. We shouldn't let the LWP run until that wait status has
89 been processed, but we should not report that wait status if GDB
90 didn't try to let the LWP run. */
91 int resumed;
92
fb0e1ba7
MK
93 /* If non-zero, a pending wait status. */
94 int status;
95
96 /* Non-zero if we were stepping this LWP. */
97 int step;
98
99 /* Next LWP in list. */
100 struct lwp_info *next;
101};
102
103/* List of known LWPs. */
104static struct lwp_info *lwp_list;
105
106/* Number of LWPs in the list. */
107static int num_lwps;
108
109/* Non-zero if we're running in "threaded" mode. */
110static int threaded;
111\f
112
ca6724c1
KB
113#define GET_LWP(ptid) ptid_get_lwp (ptid)
114#define GET_PID(ptid) ptid_get_pid (ptid)
115#define is_lwp(ptid) (GET_LWP (ptid) != 0)
116#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
fb0e1ba7
MK
117
118#define is_cloned(pid) (GET_LWP (pid) != GET_PID (pid))
119
120/* If the last reported event was a SIGTRAP, this variable is set to
121 the process id of the LWP/thread that got it. */
39f77062 122ptid_t trap_ptid;
fb0e1ba7
MK
123\f
124
125/* This module's target-specific operations. */
126static struct target_ops lin_lwp_ops;
127
128/* The standard child operations. */
129extern struct target_ops child_ops;
130
3f07c44b
MK
131/* Since we cannot wait (in lin_lwp_wait) for the initial process and
132 any cloned processes with a single call to waitpid, we have to use
4c8de859 133 the WNOHANG flag and call waitpid in a loop. To optimize
3f07c44b
MK
134 things a bit we use `sigsuspend' to wake us up when a process has
135 something to report (it will send us a SIGCHLD if it has). To make
136 this work we have to juggle with the signal mask. We save the
4c8de859 137 original signal mask such that we can restore it before creating a
3f07c44b
MK
138 new process in order to avoid blocking certain signals in the
139 inferior. We then block SIGCHLD during the waitpid/sigsuspend
140 loop. */
141
4c8de859 142/* Original signal mask. */
3f07c44b
MK
143static sigset_t normal_mask;
144
fb0e1ba7
MK
145/* Signal mask for use with sigsuspend in lin_lwp_wait, initialized in
146 _initialize_lin_lwp. */
147static sigset_t suspend_mask;
3f07c44b
MK
148
149/* Signals to block to make that sigsuspend work. */
150static sigset_t blocked_mask;
fb0e1ba7
MK
151\f
152
153/* Prototypes for local functions. */
c194fbe1 154static int stop_wait_callback (struct lwp_info *lp, void *data);
fb0e1ba7
MK
155\f
156
c194fbe1
MK
157/* Initialize the list of LWPs. Note that this module, contrary to
158 what GDB's generic threads layer does for its thread list,
159 re-initializes the LWP lists whenever we mourn or detach (which
160 doesn't involve mourning) the inferior. */
fb0e1ba7
MK
161
162static void
163init_lwp_list (void)
164{
165 struct lwp_info *lp, *lpnext;
166
167 for (lp = lwp_list; lp; lp = lpnext)
168 {
169 lpnext = lp->next;
b8c9b27d 170 xfree (lp);
fb0e1ba7
MK
171 }
172
173 lwp_list = NULL;
174 num_lwps = 0;
175 threaded = 0;
176}
177
178/* Add the LWP specified by PID to the list. If this causes the
179 number of LWPs to become larger than one, go into "threaded" mode.
180 Return a pointer to the structure describing the new LWP. */
181
182static struct lwp_info *
39f77062 183add_lwp (ptid_t ptid)
fb0e1ba7
MK
184{
185 struct lwp_info *lp;
186
39f77062 187 gdb_assert (is_lwp (ptid));
fb0e1ba7
MK
188
189 lp = (struct lwp_info *) xmalloc (sizeof (struct lwp_info));
190
191 memset (lp, 0, sizeof (struct lwp_info));
192
39f77062 193 lp->ptid = ptid;
fb0e1ba7
MK
194
195 lp->next = lwp_list;
196 lwp_list = lp;
197 if (++num_lwps > 1)
198 threaded = 1;
199
200 return lp;
201}
202
203/* Remove the LWP specified by PID from the list. */
204
205static void
39f77062 206delete_lwp (ptid_t ptid)
fb0e1ba7
MK
207{
208 struct lwp_info *lp, *lpprev;
209
210 lpprev = NULL;
211
212 for (lp = lwp_list; lp; lpprev = lp, lp = lp->next)
39f77062 213 if (ptid_equal (lp->ptid, ptid))
fb0e1ba7
MK
214 break;
215
216 if (!lp)
217 return;
218
219 /* We don't go back to "non-threaded" mode if the number of threads
220 becomes less than two. */
221 num_lwps--;
222
223 if (lpprev)
224 lpprev->next = lp->next;
225 else
226 lwp_list = lp->next;
227
b8c9b27d 228 xfree (lp);
fb0e1ba7
MK
229}
230
231/* Return a pointer to the structure describing the LWP corresponding
232 to PID. If no corresponding LWP could be found, return NULL. */
233
234static struct lwp_info *
39f77062 235find_lwp_pid (ptid_t ptid)
fb0e1ba7
MK
236{
237 struct lwp_info *lp;
39f77062 238 int lwp;
fb0e1ba7 239
39f77062
KB
240 if (is_lwp (ptid))
241 lwp = GET_LWP (ptid);
242 else
243 lwp = GET_PID (ptid);
fb0e1ba7
MK
244
245 for (lp = lwp_list; lp; lp = lp->next)
39f77062 246 if (lwp == GET_LWP (lp->ptid))
fb0e1ba7
MK
247 return lp;
248
249 return NULL;
250}
251
252/* Call CALLBACK with its second argument set to DATA for every LWP in
253 the list. If CALLBACK returns 1 for a particular LWP, return a
254 pointer to the structure describing that LWP immediately.
255 Otherwise return NULL. */
256
257struct lwp_info *
258iterate_over_lwps (int (*callback) (struct lwp_info *, void *), void *data)
259{
fce0e6e1 260 struct lwp_info *lp, *lpnext;
fb0e1ba7 261
fce0e6e1
MK
262 for (lp = lwp_list; lp; lp = lpnext)
263 {
264 lpnext = lp->next;
265 if ((*callback) (lp, data))
266 return lp;
267 }
fb0e1ba7
MK
268
269 return NULL;
270}
271\f
272
e02bc4cc
DS
273/* Implementation of the PREPARE_TO_PROCEED hook for the Linux LWP
274 layer.
275
276 Note that this implementation is potentially redundant now that
8849f47d
JL
277 default_prepare_to_proceed() has been added.
278
279 FIXME This may not support switching threads after Ctrl-C
280 correctly. The default implementation does support this. */
fb0e1ba7
MK
281
282int
283lin_lwp_prepare_to_proceed (void)
284{
39f77062
KB
285 if (! ptid_equal (trap_ptid, null_ptid)
286 && ! ptid_equal (inferior_ptid, trap_ptid))
fb0e1ba7
MK
287 {
288 /* Switched over from TRAP_PID. */
289 CORE_ADDR stop_pc = read_pc ();
290 CORE_ADDR trap_pc;
291
292 /* Avoid switching where it wouldn't do any good, i.e. if both
293 threads are at the same breakpoint. */
39f77062 294 trap_pc = read_pc_pid (trap_ptid);
fb0e1ba7
MK
295 if (trap_pc != stop_pc && breakpoint_here_p (trap_pc))
296 {
297 /* User hasn't deleted the breakpoint. Return non-zero, and
298 switch back to TRAP_PID. */
39f77062 299 inferior_ptid = trap_ptid;
fb0e1ba7
MK
300
301 /* FIXME: Is this stuff really necessary? */
302 flush_cached_frames ();
303 registers_changed ();
304
305 return 1;
306 }
307 }
308
309 return 0;
310}
311\f
312
313#if 0
314static void
315lin_lwp_open (char *args, int from_tty)
316{
317 push_target (&lin_lwp_ops);
318}
319#endif
320
321/* Attach to the LWP specified by PID. If VERBOSE is non-zero, print
322 a message telling the user that a new LWP has been added to the
323 process. */
324
325void
39f77062 326lin_lwp_attach_lwp (ptid_t ptid, int verbose)
fb0e1ba7
MK
327{
328 struct lwp_info *lp;
329
39f77062 330 gdb_assert (is_lwp (ptid));
fb0e1ba7
MK
331
332 if (verbose)
39f77062 333 printf_filtered ("[New %s]\n", target_pid_to_str (ptid));
fb0e1ba7 334
c194fbe1
MK
335 /* We assume that we're already tracing the initial process. */
336 if (is_cloned (ptid) && ptrace (PTRACE_ATTACH, GET_LWP (ptid), 0, 0) < 0)
39f77062 337 error ("Can't attach %s: %s", target_pid_to_str (ptid), strerror (errno));
fb0e1ba7 338
c194fbe1
MK
339 lp = find_lwp_pid (ptid);
340 if (lp == NULL)
341 lp = add_lwp (ptid);
342
343 if (is_cloned (ptid))
c4365b19
MS
344 {
345 lp->signalled = 1;
346 stop_wait_callback (lp, NULL);
347 }
fb0e1ba7
MK
348}
349
350static void
351lin_lwp_attach (char *args, int from_tty)
352{
c194fbe1
MK
353 struct lwp_info *lp;
354
fb0e1ba7
MK
355 /* FIXME: We should probably accept a list of process id's, and
356 attach all of them. */
c194fbe1
MK
357 child_ops.to_attach (args, from_tty);
358
359 /* Add the initial process as the first LWP to the list. */
01263b57 360 lp = add_lwp (BUILD_LWP (PIDGET (inferior_ptid), PIDGET (inferior_ptid)));
c194fbe1
MK
361
362 /* Make sure the initial process is stopped. The user-level threads
363 layer might want to poke around in the inferior, and that won't
364 work if things haven't stabilized yet. */
365 lp->signalled = 1;
366 stop_wait_callback (lp, NULL);
367 gdb_assert (lp->status == 0);
368
369 /* Fake the SIGSTOP that core GDB expects. */
370 lp->status = W_STOPCODE (SIGSTOP);
fce0e6e1 371 lp->resumed = 1;
c194fbe1
MK
372}
373
374static int
375detach_callback (struct lwp_info *lp, void *data)
376{
377 gdb_assert (lp->status == 0 || WIFSTOPPED (lp->status));
378
379 if (debug_lin_lwp && lp->status)
b08cfdb6 380 fprintf_unfiltered (gdb_stdlog, "Pending %s for LWP %ld on detach.\n",
c194fbe1
MK
381 strsignal (WSTOPSIG (lp->status)), GET_LWP (lp->ptid));
382
383 while (lp->signalled && lp->stopped)
384 {
385 if (ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0,
386 WSTOPSIG (lp->status)) < 0)
387 error ("Can't continue %s: %s", target_pid_to_str (lp->ptid),
388 strerror (errno));
389
390 lp->stopped = 0;
c4365b19 391 lp->signalled = 0;
c194fbe1
MK
392 lp->status = 0;
393 stop_wait_callback (lp, NULL);
394
395 gdb_assert (lp->status == 0 || WIFSTOPPED (lp->status));
396 }
397
398 if (is_cloned (lp->ptid))
399 {
400 if (ptrace (PTRACE_DETACH, GET_LWP (lp->ptid), 0,
401 WSTOPSIG (lp->status)) < 0)
402 error ("Can't detach %s: %s", target_pid_to_str (lp->ptid),
403 strerror (errno));
404
405 delete_lwp (lp->ptid);
406 }
407
408 return 0;
fb0e1ba7
MK
409}
410
411static void
412lin_lwp_detach (char *args, int from_tty)
413{
c194fbe1
MK
414 iterate_over_lwps (detach_callback, NULL);
415
416 /* Only the initial (uncloned) process should be left right now. */
417 gdb_assert (num_lwps == 1);
418
419 trap_ptid = null_ptid;
420
421 /* Destroy LWP info; it's no longer valid. */
422 init_lwp_list ();
423
424 /* Restore the original signal mask. */
425 sigprocmask (SIG_SETMASK, &normal_mask, NULL);
426 sigemptyset (&blocked_mask);
427
01263b57 428 inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
c194fbe1 429 child_ops.to_detach (args, from_tty);
fb0e1ba7
MK
430}
431\f
432
433struct private_thread_info
434{
435 int lwpid;
436};
437
438/* Return non-zero if TP corresponds to the LWP specified by DATA
439 (which is assumed to be a pointer to a `struct lwp_info'. */
440
441static int
442find_lwp_callback (struct thread_info *tp, void *data)
443{
444 struct lwp_info *lp = data;
445
39f77062 446 if (tp->private->lwpid == GET_LWP (lp->ptid))
fb0e1ba7
MK
447 return 1;
448
449 return 0;
450}
451
452/* Resume LP. */
453
454static int
455resume_callback (struct lwp_info *lp, void *data)
456{
457 if (lp->stopped && lp->status == 0)
458 {
459 struct thread_info *tp;
460
461#if 1
462 /* FIXME: kettenis/2000-08-26: This should really be handled
463 properly by core GDB. */
464
39f77062 465 tp = find_thread_pid (lp->ptid);
fb0e1ba7
MK
466 if (tp == NULL)
467 tp = iterate_over_threads (find_lwp_callback, lp);
468 gdb_assert (tp);
469
470 /* If we were previously stepping the thread, and now continue
471 the thread we must invalidate the stepping range. However,
472 if there is a step_resume breakpoint for this thread, we must
473 preserve the stepping range to make it possible to continue
474 stepping once we hit it. */
475 if (tp->step_range_end && tp->step_resume_breakpoint == NULL)
476 {
477 gdb_assert (lp->step);
478 tp->step_range_start = tp->step_range_end = 0;
479 }
480#endif
481
39f77062 482 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), 0, TARGET_SIGNAL_0);
fb0e1ba7
MK
483 lp->stopped = 0;
484 lp->step = 0;
485 }
486
487 return 0;
488}
489
fce0e6e1
MK
490static int
491resume_clear_callback (struct lwp_info *lp, void *data)
492{
493 lp->resumed = 0;
494 return 0;
495}
496
497static int
498resume_set_callback (struct lwp_info *lp, void *data)
499{
500 lp->resumed = 1;
501 return 0;
502}
503
fb0e1ba7 504static void
39f77062 505lin_lwp_resume (ptid_t ptid, int step, enum target_signal signo)
fb0e1ba7
MK
506{
507 struct lwp_info *lp;
508 int resume_all;
509
510 /* Apparently the interpretation of PID is dependent on STEP: If
511 STEP is non-zero, a specific PID means `step only this process
512 id'. But if STEP is zero, then PID means `continue *all*
513 processes, but give the signal only to this one'. */
39f77062 514 resume_all = (PIDGET (ptid) == -1) || !step;
fb0e1ba7 515
fce0e6e1
MK
516 if (resume_all)
517 iterate_over_lwps (resume_set_callback, NULL);
518 else
519 iterate_over_lwps (resume_clear_callback, NULL);
520
fb0e1ba7 521 /* If PID is -1, it's the current inferior that should be
c4365b19 522 handled specially. */
39f77062
KB
523 if (PIDGET (ptid) == -1)
524 ptid = inferior_ptid;
fb0e1ba7 525
39f77062 526 lp = find_lwp_pid (ptid);
fb0e1ba7
MK
527 if (lp)
528 {
39f77062 529 ptid = pid_to_ptid (GET_LWP (lp->ptid));
fb0e1ba7 530
fb0e1ba7
MK
531 /* Remember if we're stepping. */
532 lp->step = step;
533
fce0e6e1
MK
534 /* Mark this LWP as resumed. */
535 lp->resumed = 1;
536
fb0e1ba7
MK
537 /* If we have a pending wait status for this thread, there is no
538 point in resuming the process. */
539 if (lp->status)
540 {
541 /* FIXME: What should we do if we are supposed to continue
542 this thread with a signal? */
543 gdb_assert (signo == TARGET_SIGNAL_0);
544 return;
545 }
40564aca
MK
546
547 /* Mark LWP as not stopped to prevent it from being continued by
548 resume_callback. */
549 lp->stopped = 0;
fb0e1ba7
MK
550 }
551
552 if (resume_all)
553 iterate_over_lwps (resume_callback, NULL);
554
39f77062 555 child_resume (ptid, step, signo);
fb0e1ba7
MK
556}
557\f
558
559/* Send a SIGSTOP to LP. */
560
561static int
562stop_callback (struct lwp_info *lp, void *data)
563{
564 if (! lp->stopped && ! lp->signalled)
565 {
566 int ret;
567
39f77062 568 ret = kill (GET_LWP (lp->ptid), SIGSTOP);
fb0e1ba7
MK
569 gdb_assert (ret == 0);
570
571 lp->signalled = 1;
572 gdb_assert (lp->status == 0);
573 }
574
575 return 0;
576}
577
578/* Wait until LP is stopped. */
579
580static int
581stop_wait_callback (struct lwp_info *lp, void *data)
582{
583 if (! lp->stopped && lp->signalled)
584 {
585 pid_t pid;
586 int status;
587
c4365b19 588 get_another_event:
fb0e1ba7
MK
589 gdb_assert (lp->status == 0);
590
39f77062
KB
591 pid = waitpid (GET_LWP (lp->ptid), &status,
592 is_cloned (lp->ptid) ? __WCLONE : 0);
fb0e1ba7
MK
593 if (pid == -1 && errno == ECHILD)
594 /* OK, the proccess has disappeared. We'll catch the actual
3f07c44b 595 exit event in lin_lwp_wait. */
fb0e1ba7
MK
596 return 0;
597
39f77062 598 gdb_assert (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
599
600 if (WIFEXITED (status) || WIFSIGNALED (status))
601 {
602 gdb_assert (num_lwps > 1);
fb0e1ba7 603
39f77062 604 if (in_thread_list (lp->ptid))
e6328671
MK
605 {
606 /* Core GDB cannot deal with us deleting the current
607 thread. */
39f77062
KB
608 if (!ptid_equal (lp->ptid, inferior_ptid))
609 delete_thread (lp->ptid);
e6328671 610 printf_unfiltered ("[%s exited]\n",
39f77062 611 target_pid_to_str (lp->ptid));
e6328671 612 }
7ca673cd 613 if (debug_lin_lwp)
9085700c 614 fprintf_unfiltered (gdb_stdlog,
39f77062 615 "%s exited.\n", target_pid_to_str (lp->ptid));
7ca673cd 616
39f77062 617 delete_lwp (lp->ptid);
fb0e1ba7
MK
618 return 0;
619 }
620
621 gdb_assert (WIFSTOPPED (status));
622 lp->stopped = 1;
623
624 if (WSTOPSIG (status) != SIGSTOP)
625 {
626 if (WSTOPSIG (status) == SIGTRAP
39f77062 627 && breakpoint_inserted_here_p (read_pc_pid (pid_to_ptid (pid))
fb0e1ba7
MK
628 - DECR_PC_AFTER_BREAK))
629 {
630 /* If a LWP other than the LWP that we're reporting an
631 event for has hit a GDB breakpoint (as opposed to
632 some random trap signal), then just arrange for it to
633 hit it again later. We don't keep the SIGTRAP status
634 and don't forward the SIGTRAP signal to the LWP. We
635 will handle the current event, eventually we will
636 resume all LWPs, and this one will get its breakpoint
637 trap again.
638
639 If we do not do this, then we run the risk that the
640 user will delete or disable the breakpoint, but the
641 thread will have already tripped on it. */
7ca673cd
MS
642
643 if (debug_lin_lwp)
9085700c
MS
644 fprintf_unfiltered (gdb_stdlog,
645 "Tripped breakpoint at %lx in LWP %d"
646 " while waiting for SIGSTOP.\n",
39f77062 647 (long) read_pc_pid (lp->ptid), pid);
7ca673cd 648
fb0e1ba7
MK
649 /* Set the PC to before the trap. */
650 if (DECR_PC_AFTER_BREAK)
39f77062
KB
651 write_pc_pid (read_pc_pid (pid_to_ptid (pid))
652 - DECR_PC_AFTER_BREAK,
653 pid_to_ptid (pid));
c4365b19
MS
654
655 /* Now resume this LWP and get the SIGSTOP event. */
656 ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, 0);
657 goto get_another_event;
fb0e1ba7 658 }
5f885618
MS
659 else if (WSTOPSIG (status) == SIGINT &&
660 signal_pass_state (SIGINT) == 0)
661 {
662 /* Since SIGINT gets forwarded to the entire process group
663 (in the case where ^C/BREAK is typed at the tty/console),
664 just ignore all SIGINT events from all lwp's except for
665 the one that was caught by lin_lwp_wait. */
c4365b19
MS
666
667 /* Now resume this LWP and get the SIGSTP event. */
668 ptrace (PTRACE_CONT, GET_LWP (lp->ptid), 0, 0);
669 goto get_another_event;
5f885618 670 }
fb0e1ba7
MK
671 else
672 {
7ca673cd 673 if (debug_lin_lwp)
9085700c
MS
674 fprintf_unfiltered (gdb_stdlog,
675 "Received %s in LWP %d while waiting for SIGSTOP.\n",
676 strsignal (WSTOPSIG (status)), pid);
7ca673cd 677
fb0e1ba7 678 /* The thread was stopped with a signal other than
5f885618 679 SIGSTOP, and didn't accidentally trip a breakpoint.
fb0e1ba7
MK
680 Record the wait status. */
681 lp->status = status;
682 }
683 }
684 else
685 {
686 /* We caught the SIGSTOP that we intended to catch, so
687 there's no SIGSTOP pending. */
688 lp->signalled = 0;
689 }
690 }
691
692 return 0;
693}
694
695/* Return non-zero if LP has a wait status pending. */
696
697static int
698status_callback (struct lwp_info *lp, void *data)
699{
fce0e6e1
MK
700 /* Only report a pending wait status if we pretend that this has
701 indeed been resumed. */
702 return (lp->status != 0 && lp->resumed);
fb0e1ba7
MK
703}
704
705/* Return non-zero if LP isn't stopped. */
706
707static int
708running_callback (struct lwp_info *lp, void *data)
709{
710 return (lp->stopped == 0);
711}
712
fce0e6e1
MK
713/* Return non-zero if LP has been resumed. */
714
715static int
716resumed_callback (struct lwp_info *lp, void *data)
717{
718 return lp->resumed;
719}
720
39f77062
KB
721static ptid_t
722lin_lwp_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
fb0e1ba7
MK
723{
724 struct lwp_info *lp = NULL;
725 int options = 0;
726 int status = 0;
39f77062 727 pid_t pid = PIDGET (ptid);
fb0e1ba7 728
3f07c44b
MK
729 /* Make sure SIGCHLD is blocked. */
730 if (! sigismember (&blocked_mask, SIGCHLD))
731 {
732 sigaddset (&blocked_mask, SIGCHLD);
733 sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
734 }
735
fb0e1ba7
MK
736 retry:
737
fce0e6e1
MK
738 /* Make sure there is at least one thread that has been resumed. */
739 gdb_assert (iterate_over_lwps (resumed_callback, NULL));
740
fb0e1ba7
MK
741 /* First check if there is a LWP with a wait status pending. */
742 if (pid == -1)
743 {
744 /* Any LWP will do. */
745 lp = iterate_over_lwps (status_callback, NULL);
746 if (lp)
747 {
7ca673cd 748 if (debug_lin_lwp)
9085700c 749 fprintf_unfiltered (gdb_stdlog,
b08cfdb6 750 "Using pending wait status for LWP %ld.\n",
3d6e28e2 751 GET_LWP (lp->ptid));
7ca673cd 752
fb0e1ba7
MK
753 status = lp->status;
754 lp->status = 0;
755 }
756
757 /* But if we don't fine one, we'll have to wait, and check both
758 cloned and uncloned processes. We start with the cloned
759 processes. */
760 options = __WCLONE | WNOHANG;
761 }
39f77062 762 else if (is_lwp (ptid))
fb0e1ba7 763 {
7ca673cd 764 if (debug_lin_lwp)
9085700c 765 fprintf_unfiltered (gdb_stdlog,
b08cfdb6 766 "Waiting for specific LWP %ld.\n",
ce696e05 767 GET_LWP (ptid));
7ca673cd 768
fb0e1ba7 769 /* We have a specific LWP to check. */
39f77062 770 lp = find_lwp_pid (ptid);
fb0e1ba7
MK
771 gdb_assert (lp);
772 status = lp->status;
773 lp->status = 0;
7ca673cd
MS
774
775 if (debug_lin_lwp)
776 if (status)
9085700c 777 fprintf_unfiltered (gdb_stdlog,
b08cfdb6 778 "Using pending wait status for LWP %ld.\n",
39f77062 779 GET_LWP (lp->ptid));
fb0e1ba7
MK
780
781 /* If we have to wait, take into account whether PID is a cloned
782 process or not. And we have to convert it to something that
783 the layer beneath us can understand. */
39f77062
KB
784 options = is_cloned (lp->ptid) ? __WCLONE : 0;
785 pid = GET_LWP (ptid);
fb0e1ba7
MK
786 }
787
788 if (status && lp->signalled)
789 {
790 /* A pending SIGSTOP may interfere with the normal stream of
791 events. In a typical case where interference is a problem,
792 we have a SIGSTOP signal pending for LWP A while
793 single-stepping it, encounter an event in LWP B, and take the
794 pending SIGSTOP while trying to stop LWP A. After processing
795 the event in LWP B, LWP A is continued, and we'll never see
796 the SIGTRAP associated with the last time we were
797 single-stepping LWP A. */
798
799 /* Resume the thread. It should halt immediately returning the
800 pending SIGSTOP. */
39f77062
KB
801 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step,
802 TARGET_SIGNAL_0);
fb0e1ba7 803 lp->stopped = 0;
fce0e6e1 804 gdb_assert (lp->resumed);
fb0e1ba7
MK
805
806 /* This should catch the pending SIGSTOP. */
807 stop_wait_callback (lp, NULL);
808 }
809
810 set_sigint_trap (); /* Causes SIGINT to be passed on to the
811 attached process. */
812 set_sigio_trap ();
813
814 while (status == 0)
815 {
816 pid_t lwpid;
817
818 lwpid = waitpid (pid, &status, options);
819 if (lwpid > 0)
820 {
821 gdb_assert (pid == -1 || lwpid == pid);
822
39f77062 823 lp = find_lwp_pid (pid_to_ptid (lwpid));
fb0e1ba7
MK
824 if (! lp)
825 {
39f77062 826 lp = add_lwp (BUILD_LWP (lwpid, GET_PID (inferior_ptid)));
fb0e1ba7
MK
827 if (threaded)
828 {
3f07c44b
MK
829 gdb_assert (WIFSTOPPED (status)
830 && WSTOPSIG (status) == SIGSTOP);
fb0e1ba7
MK
831 lp->signalled = 1;
832
39f77062 833 if (! in_thread_list (inferior_ptid))
fb0e1ba7 834 {
39f77062
KB
835 inferior_ptid = BUILD_LWP (GET_PID (inferior_ptid),
836 GET_PID (inferior_ptid));
837 add_thread (inferior_ptid);
fb0e1ba7
MK
838 }
839
39f77062 840 add_thread (lp->ptid);
fb0e1ba7 841 printf_unfiltered ("[New %s]\n",
39f77062 842 target_pid_to_str (lp->ptid));
fb0e1ba7
MK
843 }
844 }
845
846 /* Make sure we don't report a TARGET_WAITKIND_EXITED or
847 TARGET_WAITKIND_SIGNALLED event if there are still LWP's
848 left in the process. */
849 if ((WIFEXITED (status) || WIFSIGNALED (status)) && num_lwps > 1)
850 {
39f77062 851 if (in_thread_list (lp->ptid))
fb0e1ba7 852 {
e6328671 853 /* Core GDB cannot deal with us deleting the current
fb0e1ba7 854 thread. */
39f77062
KB
855 if (! ptid_equal (lp->ptid, inferior_ptid))
856 delete_thread (lp->ptid);
fb0e1ba7 857 printf_unfiltered ("[%s exited]\n",
39f77062 858 target_pid_to_str (lp->ptid));
fb0e1ba7 859 }
7ca673cd 860 if (debug_lin_lwp)
9085700c
MS
861 fprintf_unfiltered (gdb_stdlog,
862 "%s exited.\n",
39f77062 863 target_pid_to_str (lp->ptid));
7ca673cd 864
39f77062 865 delete_lwp (lp->ptid);
fb0e1ba7
MK
866
867 /* Make sure there is at least one thread running. */
868 gdb_assert (iterate_over_lwps (running_callback, NULL));
869
870 /* Discard the event. */
871 status = 0;
872 continue;
873 }
874
875 /* Make sure we don't report a SIGSTOP that we sent
876 ourselves in an attempt to stop an LWP. */
877 if (lp->signalled && WIFSTOPPED (status)
878 && WSTOPSIG (status) == SIGSTOP)
879 {
7ca673cd 880 if (debug_lin_lwp)
9085700c
MS
881 fprintf_unfiltered (gdb_stdlog,
882 "Delayed SIGSTOP caught for %s.\n",
39f77062 883 target_pid_to_str (lp->ptid));
7ca673cd 884
fb0e1ba7
MK
885 /* This is a delayed SIGSTOP. */
886 lp->signalled = 0;
887
39f77062
KB
888 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step,
889 TARGET_SIGNAL_0);
fb0e1ba7 890 lp->stopped = 0;
fce0e6e1 891 gdb_assert (lp->resumed);
fb0e1ba7
MK
892
893 /* Discard the event. */
894 status = 0;
895 continue;
896 }
897
898 break;
899 }
900
901 if (pid == -1)
902 {
903 /* Alternate between checking cloned and uncloned processes. */
904 options ^= __WCLONE;
905
906 /* And suspend every time we have checked both. */
907 if (options & __WCLONE)
908 sigsuspend (&suspend_mask);
909 }
910
911 /* We shouldn't end up here unless we want to try again. */
912 gdb_assert (status == 0);
913 }
914
915 clear_sigio_trap ();
916 clear_sigint_trap ();
917
918 gdb_assert (lp);
919
920 /* Don't report signals that GDB isn't interested in, such as
921 signals that are neither printed nor stopped upon. Stopping all
922 threads can be a bit time-consuming so if we want decent
923 performance with heavily multi-threaded programs, especially when
924 they're using a high frequency timer, we'd better avoid it if we
925 can. */
926
927 if (WIFSTOPPED (status))
928 {
929 int signo = target_signal_from_host (WSTOPSIG (status));
930
931 if (signal_stop_state (signo) == 0
932 && signal_print_state (signo) == 0
933 && signal_pass_state (signo) == 1)
934 {
fce0e6e1
MK
935 /* FIMXE: kettenis/2001-06-06: Should we resume all threads
936 here? It is not clear we should. GDB may not expect
937 other threads to run. On the other hand, not resuming
938 newly attached threads may cause an unwanted delay in
939 getting them running. */
c4365b19 940 child_resume (pid_to_ptid (GET_LWP (lp->ptid)), lp->step, signo);
fce0e6e1 941 lp->stopped = 0;
fb0e1ba7
MK
942 status = 0;
943 goto retry;
944 }
945 }
946
947 /* This LWP is stopped now. */
948 lp->stopped = 1;
949
950 /* Now stop all other LWP's ... */
951 iterate_over_lwps (stop_callback, NULL);
952
953 /* ... and wait until all of them have reported back that they're no
954 longer running. */
955 iterate_over_lwps (stop_wait_callback, NULL);
956
957 /* If we're not running in "threaded" mode, we'll report the bare
958 process id. */
959
960 if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP)
39f77062 961 trap_ptid = (threaded ? lp->ptid : pid_to_ptid (GET_LWP (lp->ptid)));
fb0e1ba7 962 else
39f77062 963 trap_ptid = null_ptid;
fb0e1ba7
MK
964
965 store_waitstatus (ourstatus, status);
39f77062 966 return (threaded ? lp->ptid : pid_to_ptid (GET_LWP (lp->ptid)));
fb0e1ba7
MK
967}
968
969static int
970kill_callback (struct lwp_info *lp, void *data)
971{
39f77062 972 ptrace (PTRACE_KILL, GET_LWP (lp->ptid), 0, 0);
fb0e1ba7
MK
973 return 0;
974}
975
976static int
977kill_wait_callback (struct lwp_info *lp, void *data)
978{
979 pid_t pid;
980
981 /* We must make sure that there are no pending events (delayed
982 SIGSTOPs, pending SIGTRAPs, etc.) to make sure the current
983 program doesn't interfere with any following debugging session. */
984
985 /* For cloned processes we must check both with __WCLONE and
986 without, since the exit status of a cloned process isn't reported
987 with __WCLONE. */
39f77062 988 if (is_cloned (lp->ptid))
fb0e1ba7
MK
989 {
990 do
991 {
39f77062 992 pid = waitpid (GET_LWP (lp->ptid), NULL, __WCLONE);
fb0e1ba7 993 }
39f77062 994 while (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
995
996 gdb_assert (pid == -1 && errno == ECHILD);
997 }
998
999 do
1000 {
39f77062 1001 pid = waitpid (GET_LWP (lp->ptid), NULL, 0);
fb0e1ba7 1002 }
39f77062 1003 while (pid == GET_LWP (lp->ptid));
fb0e1ba7
MK
1004
1005 gdb_assert (pid == -1 && errno == ECHILD);
1006 return 0;
1007}
1008
1009static void
1010lin_lwp_kill (void)
1011{
1012 /* Kill all LWP's ... */
1013 iterate_over_lwps (kill_callback, NULL);
1014
1015 /* ... and wait until we've flushed all events. */
1016 iterate_over_lwps (kill_wait_callback, NULL);
1017
1018 target_mourn_inferior ();
1019}
1020
1021static void
1022lin_lwp_create_inferior (char *exec_file, char *allargs, char **env)
1023{
c194fbe1 1024 child_ops.to_create_inferior (exec_file, allargs, env);
fb0e1ba7
MK
1025}
1026
1027static void
1028lin_lwp_mourn_inferior (void)
1029{
c194fbe1 1030 trap_ptid = null_ptid;
fb0e1ba7 1031
c194fbe1 1032 /* Destroy LWP info; it's no longer valid. */
fb0e1ba7
MK
1033 init_lwp_list ();
1034
4c8de859 1035 /* Restore the original signal mask. */
3f07c44b
MK
1036 sigprocmask (SIG_SETMASK, &normal_mask, NULL);
1037 sigemptyset (&blocked_mask);
1038
c194fbe1 1039 child_ops.to_mourn_inferior ();
fb0e1ba7
MK
1040}
1041
1042static void
1043lin_lwp_fetch_registers (int regno)
1044{
39f77062 1045 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 1046
39f77062
KB
1047 if (is_lwp (inferior_ptid))
1048 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7
MK
1049
1050 fetch_inferior_registers (regno);
1051
1052 do_cleanups (old_chain);
1053}
1054
1055static void
1056lin_lwp_store_registers (int regno)
1057{
39f77062 1058 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 1059
39f77062
KB
1060 if (is_lwp (inferior_ptid))
1061 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7
MK
1062
1063 store_inferior_registers (regno);
1064
1065 do_cleanups (old_chain);
1066}
1067
1068static int
1069lin_lwp_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
e5da8f38 1070 struct mem_attrib *attrib,
fb0e1ba7
MK
1071 struct target_ops *target)
1072{
39f77062 1073 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7
MK
1074 int xfer;
1075
39f77062
KB
1076 if (is_lwp (inferior_ptid))
1077 inferior_ptid = pid_to_ptid (GET_LWP (inferior_ptid));
fb0e1ba7 1078
e5da8f38 1079 xfer = child_xfer_memory (memaddr, myaddr, len, write, attrib, target);
fb0e1ba7
MK
1080
1081 do_cleanups (old_chain);
1082 return xfer;
1083}
1084
1085static int
39f77062 1086lin_lwp_thread_alive (ptid_t ptid)
fb0e1ba7 1087{
39f77062 1088 gdb_assert (is_lwp (ptid));
fb0e1ba7
MK
1089
1090 errno = 0;
39f77062 1091 ptrace (PTRACE_PEEKUSER, GET_LWP (ptid), 0, 0);
fb0e1ba7
MK
1092 if (errno)
1093 return 0;
1094
1095 return 1;
1096}
1097
1098static char *
39f77062 1099lin_lwp_pid_to_str (ptid_t ptid)
fb0e1ba7
MK
1100{
1101 static char buf[64];
1102
39f77062 1103 if (is_lwp (ptid))
fb0e1ba7 1104 {
b08cfdb6 1105 snprintf (buf, sizeof (buf), "LWP %ld", GET_LWP (ptid));
fb0e1ba7
MK
1106 return buf;
1107 }
1108
39f77062 1109 return normal_pid_to_str (ptid);
fb0e1ba7
MK
1110}
1111
1112static void
1113init_lin_lwp_ops (void)
1114{
1115#if 0
1116 lin_lwp_ops.to_open = lin_lwp_open;
1117#endif
1118 lin_lwp_ops.to_shortname = "lwp-layer";
1119 lin_lwp_ops.to_longname = "lwp-layer";
1120 lin_lwp_ops.to_doc = "Low level threads support (LWP layer)";
1121 lin_lwp_ops.to_attach = lin_lwp_attach;
1122 lin_lwp_ops.to_detach = lin_lwp_detach;
1123 lin_lwp_ops.to_resume = lin_lwp_resume;
1124 lin_lwp_ops.to_wait = lin_lwp_wait;
1125 lin_lwp_ops.to_fetch_registers = lin_lwp_fetch_registers;
1126 lin_lwp_ops.to_store_registers = lin_lwp_store_registers;
1127 lin_lwp_ops.to_xfer_memory = lin_lwp_xfer_memory;
1128 lin_lwp_ops.to_kill = lin_lwp_kill;
1129 lin_lwp_ops.to_create_inferior = lin_lwp_create_inferior;
1130 lin_lwp_ops.to_mourn_inferior = lin_lwp_mourn_inferior;
1131 lin_lwp_ops.to_thread_alive = lin_lwp_thread_alive;
1132 lin_lwp_ops.to_pid_to_str = lin_lwp_pid_to_str;
1133 lin_lwp_ops.to_stratum = thread_stratum;
1134 lin_lwp_ops.to_has_thread_control = tc_schedlock;
1135 lin_lwp_ops.to_magic = OPS_MAGIC;
1136}
1137
1138static void
1139sigchld_handler (int signo)
1140{
1141 /* Do nothing. The only reason for this handler is that it allows
1142 us to use sigsuspend in lin_lwp_wait above to wait for the
1143 arrival of a SIGCHLD. */
1144}
1145
1146void
1147_initialize_lin_lwp (void)
1148{
1149 struct sigaction action;
fb0e1ba7
MK
1150
1151 extern void thread_db_init (struct target_ops *);
1152
1153 init_lin_lwp_ops ();
1154 add_target (&lin_lwp_ops);
1155 thread_db_init (&lin_lwp_ops);
1156
4c8de859 1157 /* Save the original signal mask. */
3f07c44b
MK
1158 sigprocmask (SIG_SETMASK, NULL, &normal_mask);
1159
fb0e1ba7
MK
1160 action.sa_handler = sigchld_handler;
1161 sigemptyset (&action.sa_mask);
1162 action.sa_flags = 0;
1163 sigaction (SIGCHLD, &action, NULL);
1164
3f07c44b
MK
1165 /* Make sure we don't block SIGCHLD during a sigsuspend. */
1166 sigprocmask (SIG_SETMASK, NULL, &suspend_mask);
fb0e1ba7 1167 sigdelset (&suspend_mask, SIGCHLD);
3f07c44b
MK
1168
1169 sigemptyset (&blocked_mask);
7ca673cd
MS
1170
1171 add_show_from_set (add_set_cmd ("lin-lwp", no_class, var_zinteger,
1172 (char *) &debug_lin_lwp,
1173 "Set debugging of linux lwp module.\n\
1174Enables printf debugging output.\n",
1175 &setdebuglist),
1176 &showdebuglist);
fb0e1ba7
MK
1177}
1178\f
1179
1180/* FIXME: kettenis/2000-08-26: The stuff on this page is specific to
1181 the LinuxThreads library and therefore doesn't really belong here. */
1182
1183/* Read variable NAME in the target and return its value if found.
1184 Otherwise return zero. It is assumed that the type of the variable
1185 is `int'. */
1186
1187static int
1188get_signo (const char *name)
1189{
1190 struct minimal_symbol *ms;
1191 int signo;
1192
1193 ms = lookup_minimal_symbol (name, NULL, NULL);
1194 if (ms == NULL)
1195 return 0;
1196
1197 if (target_read_memory (SYMBOL_VALUE_ADDRESS (ms), (char *) &signo,
1198 sizeof (signo)) != 0)
1199 return 0;
1200
1201 return signo;
1202}
1203
1204/* Return the set of signals used by the threads library in *SET. */
1205
1206void
1207lin_thread_get_thread_signals (sigset_t *set)
1208{
3f07c44b
MK
1209 struct sigaction action;
1210 int restart, cancel;
fb0e1ba7
MK
1211
1212 sigemptyset (set);
1213
1214 restart = get_signo ("__pthread_sig_restart");
1215 if (restart == 0)
1216 return;
1217
1218 cancel = get_signo ("__pthread_sig_cancel");
1219 if (cancel == 0)
1220 return;
1221
1222 sigaddset (set, restart);
1223 sigaddset (set, cancel);
3f07c44b
MK
1224
1225 /* The LinuxThreads library makes terminating threads send a special
1226 "cancel" signal instead of SIGCHLD. Make sure we catch those (to
1227 prevent them from terminating GDB itself, which is likely to be
1228 their default action) and treat them the same way as SIGCHLD. */
1229
1230 action.sa_handler = sigchld_handler;
1231 sigemptyset (&action.sa_mask);
1232 action.sa_flags = 0;
1233 sigaction (cancel, &action, NULL);
1234
1235 /* We block the "cancel" signal throughout this code ... */
1236 sigaddset (&blocked_mask, cancel);
1237 sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
1238
1239 /* ... except during a sigsuspend. */
1240 sigdelset (&suspend_mask, cancel);
fb0e1ba7 1241}
This page took 0.111033 seconds and 4 git commands to generate.