Phase 1 of the ptid_t changes.
[deliverable/binutils-gdb.git] / gdb / infttrace.c
1 /* Low level Unix child interface to ttrace, for GDB when running under HP-UX.
2 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
3 1999, 2000, 2001
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 #include "defs.h"
24 #include "frame.h"
25 #include "inferior.h"
26 #include "target.h"
27 #include "gdb_string.h"
28 #include "gdb_wait.h"
29 #include "command.h"
30
31 /* Some hackery to work around a use of the #define name NO_FLAGS
32 * in both gdb and HPUX (bfd.h and /usr/include/machine/vmparam.h).
33 */
34 #ifdef NO_FLAGS
35 #define INFTTRACE_TEMP_HACK NO_FLAGS
36 #undef NO_FLAGS
37 #endif
38
39 #ifdef USG
40 #include <sys/types.h>
41 #endif
42
43 #include <sys/param.h>
44 #include <sys/dir.h>
45 #include <signal.h>
46 #include <sys/ioctl.h>
47
48 #include <sys/ttrace.h>
49 #include <sys/mman.h>
50
51 #ifndef NO_PTRACE_H
52 #ifdef PTRACE_IN_WRONG_PLACE
53 #include <ptrace.h>
54 #else
55 #include <sys/ptrace.h>
56 #endif
57 #endif /* NO_PTRACE_H */
58
59 /* Second half of the hackery above. Non-ANSI C, so
60 * we can't use "#error", alas.
61 */
62 #ifdef NO_FLAGS
63 #if (NO_FLAGS != INFTTRACE_TEMP_HACK )
64 /* #error "Hackery to remove warning didn't work right" */
65 #else
66 /* Ok, new def'n of NO_FLAGS is same as old one; no action needed. */
67 #endif
68 #else
69 /* #error "Didn't get expected re-definition of NO_FLAGS" */
70 #define NO_FLAGS INFTTRACE_TEMP_HACK
71 #endif
72
73 #if !defined (PT_SETTRC)
74 #define PT_SETTRC 0 /* Make process traceable by parent */
75 #endif
76 #if !defined (PT_READ_I)
77 #define PT_READ_I 1 /* Read word from text space */
78 #endif
79 #if !defined (PT_READ_D)
80 #define PT_READ_D 2 /* Read word from data space */
81 #endif
82 #if !defined (PT_READ_U)
83 #define PT_READ_U 3 /* Read word from kernel user struct */
84 #endif
85 #if !defined (PT_WRITE_I)
86 #define PT_WRITE_I 4 /* Write word to text space */
87 #endif
88 #if !defined (PT_WRITE_D)
89 #define PT_WRITE_D 5 /* Write word to data space */
90 #endif
91 #if !defined (PT_WRITE_U)
92 #define PT_WRITE_U 6 /* Write word to kernel user struct */
93 #endif
94 #if !defined (PT_CONTINUE)
95 #define PT_CONTINUE 7 /* Continue after signal */
96 #endif
97 #if !defined (PT_STEP)
98 #define PT_STEP 9 /* Set flag for single stepping */
99 #endif
100 #if !defined (PT_KILL)
101 #define PT_KILL 8 /* Send child a SIGKILL signal */
102 #endif
103
104 #ifndef PT_ATTACH
105 #define PT_ATTACH PTRACE_ATTACH
106 #endif
107 #ifndef PT_DETACH
108 #define PT_DETACH PTRACE_DETACH
109 #endif
110
111 #include "gdbcore.h"
112 #ifndef NO_SYS_FILE
113 #include <sys/file.h>
114 #endif
115
116 /* This semaphore is used to coordinate the child and parent processes
117 after a fork(), and before an exec() by the child. See parent_attach_all
118 for details.
119 */
120 typedef struct
121 {
122 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */
123 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */
124 }
125 startup_semaphore_t;
126
127 #define SEM_TALK (1)
128 #define SEM_LISTEN (0)
129
130 static startup_semaphore_t startup_semaphore;
131
132 /* See can_touch_threads_of_process for details. */
133 static int vforking_child_pid = 0;
134 static int vfork_in_flight = 0;
135
136 /* To support PREPARE_TO_PROCEED (hppa_prepare_to_proceed).
137 */
138 static pid_t old_gdb_pid = 0;
139 static pid_t reported_pid = 0;
140 static int reported_bpt = 0;
141
142 /* 1 if ok as results of a ttrace or ttrace_wait call, 0 otherwise.
143 */
144 #define TT_OK( _status, _errno ) \
145 (((_status) == 1) && ((_errno) == 0))
146
147 #define TTRACE_ARG_TYPE uint64_t
148
149 /* When supplied as the "addr" operand, ttrace interprets this
150 to mean, "from the current address".
151 */
152 #define TT_USE_CURRENT_PC ((TTRACE_ARG_TYPE) TT_NOPC)
153
154 /* When supplied as the "addr", "data" or "addr2" operand for most
155 requests, ttrace interprets this to mean, "pay no heed to this
156 argument".
157 */
158 #define TT_NIL ((TTRACE_ARG_TYPE) TT_NULLARG)
159
160 /* This is capable of holding the value of a 32-bit register. The
161 value is always left-aligned in the buffer; i.e., [0] contains
162 the most-significant byte of the register's value, and [sizeof(reg)]
163 contains the least-significant value.
164
165 ??rehrauer: Yes, this assumes that an int is 32-bits on HP-UX, and
166 that registers are 32-bits on HP-UX. The latter assumption changes
167 with PA2.0.
168 */
169 typedef int register_value_t;
170
171 /********************************************************************
172
173 How this works:
174
175 1. Thread numbers
176
177 The rest of GDB sees threads as being things with different
178 "pid" (process id) values. See "thread.c" for details. The
179 separate threads will be seen and reacted to if infttrace passes
180 back different pid values (for _events_). See wait_for_inferior
181 in inftarg.c.
182
183 So infttrace is going to use thread ids externally, pretending
184 they are process ids, and keep track internally so that it can
185 use the real process id (and thread id) when calling ttrace.
186
187 The data structure that supports this is a linked list of the
188 current threads. Since at some date infttrace will have to
189 deal with multiple processes, each list element records its
190 corresponding pid, rather than having a single global.
191
192 Note that the list is only approximately current; that's ok, as
193 it's up to date when we need it (we hope!). Also, it can contain
194 dead threads, as there's no harm if it does.
195
196 The approach taken here is to bury the translation from external
197 to internal inside "call_ttrace" and a few other places.
198
199 There are some wrinkles:
200
201 o When GDB forks itself to create the debug target process,
202 there's only a pid of 0 around in the child, so the
203 TT_PROC_SETTRC operation uses a more direct call to ttrace;
204 Similiarly, the initial setting of the event mask happens
205 early as well, and so is also special-cased, and an attach
206 uses a real pid;
207
208 o We define an unthreaded application as having a "pseudo"
209 thread;
210
211 o To keep from confusing the rest of GDB, we don't switch
212 the PID for the pseudo thread to a TID. A table will help:
213
214 Rest of GDB sees these PIDs: pid tid1 tid2 tid3 ...
215
216 Our thread list stores: pid pid pid pid ...
217 tid0 tid1 tid2 tid3
218
219 Ttrace sees these TIDS: tid0 tid1 tid2 tid3 ...
220
221 Both pid and tid0 will map to tid0, as there are infttrace.c-internal
222 calls to ttrace using tid0.
223
224 2. Step and Continue
225
226 Since we're implementing the "stop the world" model, sub-model
227 "other threads run during step", we have some stuff to do:
228
229 o User steps require continuing all threads other than the
230 one the user is stepping;
231
232 o Internal debugger steps (such as over a breakpoint or watchpoint,
233 but not out of a library load thunk) require stepping only
234 the selected thread; this means that we have to report the
235 step finish on that thread, which can lead to complications;
236
237 o When a thread is created, it is created running, rather
238 than stopped--so we have to stop it.
239
240 The OS doesn't guarantee the stopped thread list will be stable,
241 no does it guarantee where on the stopped thread list a thread
242 that is single-stepped will wind up: it's possible that it will
243 be off the list for a while, it's possible the step will complete
244 and it will be re-posted to the end...
245
246 This means we have to scan the stopped thread list, build up
247 a work-list, and then run down the work list; we can't do the
248 step/continue during the scan.
249
250 3. Buffering events
251
252 Then there's the issue of waiting for an event. We do this by
253 noticing how many events are reported at the end of each wait.
254 From then on, we "fake" all resumes and steps, returning instantly,
255 and don't do another wait. Once all pending events are reported,
256 we can really resume again.
257
258 To keep this hidden, all the routines which know about tids and
259 pids or real events and simulated ones are static (file-local).
260
261 This code can make lots of calls to ttrace, in particular it
262 can spin down the list of thread states more than once. If this
263 becomes a performance hit, the spin could be done once and the
264 various "tsp" blocks saved, keeping all later spins in this
265 process.
266
267 The O/S doesn't promise to keep the list straight, and so we must
268 re-scan a lot. By observation, it looks like a single-step/wait
269 puts the stepped thread at the end of the list but doesn't change
270 it otherwise.
271
272 ****************************************************************
273 */
274
275 /* Uncomment these to turn on various debugging output */
276 /* #define THREAD_DEBUG */
277 /* #define WAIT_BUFFER_DEBUG */
278 /* #define PARANOIA */
279
280
281 #define INFTTRACE_ALL_THREADS (-1)
282 #define INFTTRACE_STEP (1)
283 #define INFTTRACE_CONTINUE (0)
284
285 /* FIX: this is used in inftarg.c/child_wait, in a hack.
286 */
287 extern int not_same_real_pid;
288
289 /* This is used to count buffered events.
290 */
291 static unsigned int more_events_left = 0;
292
293 /* Process state.
294 */
295 typedef enum process_state_enum
296 {
297 STOPPED,
298 FAKE_STEPPING,
299 FAKE_CONTINUE, /* For later use */
300 RUNNING,
301 FORKING,
302 VFORKING
303 }
304 process_state_t;
305
306 static process_state_t process_state = STOPPED;
307
308 /* User-specified stepping modality.
309 */
310 typedef enum stepping_mode_enum
311 {
312 DO_DEFAULT, /* ...which is a continue! */
313 DO_STEP,
314 DO_CONTINUE
315 }
316 stepping_mode_t;
317
318 /* Action to take on an attach, depends on
319 * what kind (user command, fork, vfork).
320 *
321 * At the moment, this is either:
322 *
323 * o continue with a SIGTRAP signal, or
324 *
325 * o leave stopped.
326 */
327 typedef enum attach_continue_enum
328 {
329 DO_ATTACH_CONTINUE,
330 DONT_ATTACH_CONTINUE
331 }
332 attach_continue_t;
333
334 /* This flag is true if we are doing a step-over-bpt
335 * with buffered events. We will have to be sure to
336 * report the right thread, as otherwise the spaghetti
337 * code in "infrun.c/wait_for_inferior" will get
338 * confused.
339 */
340 static int doing_fake_step = 0;
341 static lwpid_t fake_step_tid = 0;
342 \f
343
344 /****************************************************
345 * Thread information structure routines and types. *
346 ****************************************************
347 */
348 typedef
349 struct thread_info_struct
350 {
351 int am_pseudo; /* This is a pseudo-thread for the process. */
352 int pid; /* Process ID */
353 lwpid_t tid; /* Thread ID */
354 int handled; /* 1 if a buffered event was handled. */
355 int seen; /* 1 if this thread was seen on a traverse. */
356 int terminated; /* 1 if thread has terminated. */
357 int have_signal; /* 1 if signal to be sent */
358 enum target_signal signal_value; /* Signal to send */
359 int have_start; /* 1 if alternate starting address */
360 stepping_mode_t stepping_mode; /* Whether to step or continue */
361 CORE_ADDR start; /* Where to start */
362 int have_state; /* 1 if the event state has been set */
363 ttstate_t last_stop_state; /* The most recently-waited event for this thread. */
364 struct thread_info_struct
365 *next; /* All threads are linked via this field. */
366 struct thread_info_struct
367 *next_pseudo; /* All pseudo-threads are linked via this field. */
368 }
369 thread_info;
370
371 typedef
372 struct thread_info_header_struct
373 {
374 int count;
375 thread_info *head;
376 thread_info *head_pseudo;
377
378 }
379 thread_info_header;
380
381 static thread_info_header thread_head =
382 {0, NULL, NULL};
383 static thread_info_header deleted_threads =
384 {0, NULL, NULL};
385
386 static ptid_t saved_real_ptid;
387 \f
388
389 /*************************************************
390 * Debugging support functions *
391 *************************************************
392 */
393 CORE_ADDR
394 get_raw_pc (lwpid_t ttid)
395 {
396 unsigned long pc_val;
397 int offset;
398 int res;
399
400 offset = register_addr (PC_REGNUM, U_REGS_OFFSET);
401 res = read_from_register_save_state (
402 ttid,
403 (TTRACE_ARG_TYPE) offset,
404 (char *) &pc_val,
405 sizeof (pc_val));
406 if (res <= 0)
407 {
408 return (CORE_ADDR) pc_val;
409 }
410 else
411 {
412 return (CORE_ADDR) 0;
413 }
414 }
415
416 static char *
417 get_printable_name_of_stepping_mode (stepping_mode_t mode)
418 {
419 switch (mode)
420 {
421 case DO_DEFAULT:
422 return "DO_DEFAULT";
423 case DO_STEP:
424 return "DO_STEP";
425 case DO_CONTINUE:
426 return "DO_CONTINUE";
427 default:
428 return "?unknown mode?";
429 }
430 }
431
432 /* This function returns a pointer to a string describing the
433 * ttrace event being reported.
434 */
435 char *
436 get_printable_name_of_ttrace_event (ttevents_t event)
437 {
438 /* This enumeration is "gappy", so don't use a table. */
439 switch (event)
440 {
441
442 case TTEVT_NONE:
443 return "TTEVT_NONE";
444 case TTEVT_SIGNAL:
445 return "TTEVT_SIGNAL";
446 case TTEVT_FORK:
447 return "TTEVT_FORK";
448 case TTEVT_EXEC:
449 return "TTEVT_EXEC";
450 case TTEVT_EXIT:
451 return "TTEVT_EXIT";
452 case TTEVT_VFORK:
453 return "TTEVT_VFORK";
454 case TTEVT_SYSCALL_RETURN:
455 return "TTEVT_SYSCALL_RETURN";
456 case TTEVT_LWP_CREATE:
457 return "TTEVT_LWP_CREATE";
458 case TTEVT_LWP_TERMINATE:
459 return "TTEVT_LWP_TERMINATE";
460 case TTEVT_LWP_EXIT:
461 return "TTEVT_LWP_EXIT";
462 case TTEVT_LWP_ABORT_SYSCALL:
463 return "TTEVT_LWP_ABORT_SYSCALL";
464 case TTEVT_SYSCALL_ENTRY:
465 return "TTEVT_SYSCALL_ENTRY";
466 case TTEVT_SYSCALL_RESTART:
467 return "TTEVT_SYSCALL_RESTART";
468 default:
469 return "?new event?";
470 }
471 }
472 \f
473
474 /* This function translates the ttrace request enumeration into
475 * a character string that is its printable (aka "human readable")
476 * name.
477 */
478 char *
479 get_printable_name_of_ttrace_request (ttreq_t request)
480 {
481 if (!IS_TTRACE_REQ (request))
482 return "?bad req?";
483
484 /* This enumeration is "gappy", so don't use a table. */
485 switch (request)
486 {
487 case TT_PROC_SETTRC:
488 return "TT_PROC_SETTRC";
489 case TT_PROC_ATTACH:
490 return "TT_PROC_ATTACH";
491 case TT_PROC_DETACH:
492 return "TT_PROC_DETACH";
493 case TT_PROC_RDTEXT:
494 return "TT_PROC_RDTEXT";
495 case TT_PROC_WRTEXT:
496 return "TT_PROC_WRTEXT";
497 case TT_PROC_RDDATA:
498 return "TT_PROC_RDDATA";
499 case TT_PROC_WRDATA:
500 return "TT_PROC_WRDATA";
501 case TT_PROC_STOP:
502 return "TT_PROC_STOP";
503 case TT_PROC_CONTINUE:
504 return "TT_PROC_CONTINUE";
505 case TT_PROC_GET_PATHNAME:
506 return "TT_PROC_GET_PATHNAME";
507 case TT_PROC_GET_EVENT_MASK:
508 return "TT_PROC_GET_EVENT_MASK";
509 case TT_PROC_SET_EVENT_MASK:
510 return "TT_PROC_SET_EVENT_MASK";
511 case TT_PROC_GET_FIRST_LWP_STATE:
512 return "TT_PROC_GET_FIRST_LWP_STATE";
513 case TT_PROC_GET_NEXT_LWP_STATE:
514 return "TT_PROC_GET_NEXT_LWP_STATE";
515 case TT_PROC_EXIT:
516 return "TT_PROC_EXIT";
517 case TT_PROC_GET_MPROTECT:
518 return "TT_PROC_GET_MPROTECT";
519 case TT_PROC_SET_MPROTECT:
520 return "TT_PROC_SET_MPROTECT";
521 case TT_PROC_SET_SCBM:
522 return "TT_PROC_SET_SCBM";
523 case TT_LWP_STOP:
524 return "TT_LWP_STOP";
525 case TT_LWP_CONTINUE:
526 return "TT_LWP_CONTINUE";
527 case TT_LWP_SINGLE:
528 return "TT_LWP_SINGLE";
529 case TT_LWP_RUREGS:
530 return "TT_LWP_RUREGS";
531 case TT_LWP_WUREGS:
532 return "TT_LWP_WUREGS";
533 case TT_LWP_GET_EVENT_MASK:
534 return "TT_LWP_GET_EVENT_MASK";
535 case TT_LWP_SET_EVENT_MASK:
536 return "TT_LWP_SET_EVENT_MASK";
537 case TT_LWP_GET_STATE:
538 return "TT_LWP_GET_STATE";
539 default:
540 return "?new req?";
541 }
542 }
543 \f
544
545 /* This function translates the process state enumeration into
546 * a character string that is its printable (aka "human readable")
547 * name.
548 */
549 static char *
550 get_printable_name_of_process_state (process_state_t process_state)
551 {
552 switch (process_state)
553 {
554 case STOPPED:
555 return "STOPPED";
556 case FAKE_STEPPING:
557 return "FAKE_STEPPING";
558 case RUNNING:
559 return "RUNNING";
560 case FORKING:
561 return "FORKING";
562 case VFORKING:
563 return "VFORKING";
564 default:
565 return "?some unknown state?";
566 }
567 }
568
569 /* Set a ttrace thread state to a safe, initial state.
570 */
571 static void
572 clear_ttstate_t (ttstate_t *tts)
573 {
574 tts->tts_pid = 0;
575 tts->tts_lwpid = 0;
576 tts->tts_user_tid = 0;
577 tts->tts_event = TTEVT_NONE;
578 }
579
580 /* Copy ttrace thread state TTS_FROM into TTS_TO.
581 */
582 static void
583 copy_ttstate_t (ttstate_t *tts_to, ttstate_t *tts_from)
584 {
585 memcpy ((char *) tts_to, (char *) tts_from, sizeof (*tts_to));
586 }
587
588 /* Are there any live threads we know about?
589 */
590 static int
591 any_thread_records (void)
592 {
593 return (thread_head.count > 0);
594 }
595
596 /* Create, fill in and link in a thread descriptor.
597 */
598 static thread_info *
599 create_thread_info (int pid, lwpid_t tid)
600 {
601 thread_info *new_p;
602 thread_info *p;
603 int thread_count_of_pid;
604
605 new_p = xmalloc (sizeof (thread_info));
606 new_p->pid = pid;
607 new_p->tid = tid;
608 new_p->have_signal = 0;
609 new_p->have_start = 0;
610 new_p->have_state = 0;
611 clear_ttstate_t (&new_p->last_stop_state);
612 new_p->am_pseudo = 0;
613 new_p->handled = 0;
614 new_p->seen = 0;
615 new_p->terminated = 0;
616 new_p->next = NULL;
617 new_p->next_pseudo = NULL;
618 new_p->stepping_mode = DO_DEFAULT;
619
620 if (0 == thread_head.count)
621 {
622 #ifdef THREAD_DEBUG
623 if (debug_on)
624 printf ("First thread, pid %d tid %d!\n", pid, tid);
625 #endif
626 saved_real_ptid = inferior_ptid;
627 }
628 else
629 {
630 #ifdef THREAD_DEBUG
631 if (debug_on)
632 printf ("Subsequent thread, pid %d tid %d\n", pid, tid);
633 #endif
634 }
635
636 /* Another day, another thread...
637 */
638 thread_head.count++;
639
640 /* The new thread always goes at the head of the list.
641 */
642 new_p->next = thread_head.head;
643 thread_head.head = new_p;
644
645 /* Is this the "pseudo" thread of a process? It is if there's
646 * no other thread for this process on the list. (Note that this
647 * accomodates multiple processes, such as we see even for simple
648 * cases like forking "non-threaded" programs.)
649 */
650 p = thread_head.head;
651 thread_count_of_pid = 0;
652 while (p)
653 {
654 if (p->pid == new_p->pid)
655 thread_count_of_pid++;
656 p = p->next;
657 }
658
659 /* Did we see any other threads for this pid? (Recall that we just
660 * added this thread to the list...)
661 */
662 if (thread_count_of_pid == 1)
663 {
664 new_p->am_pseudo = 1;
665 new_p->next_pseudo = thread_head.head_pseudo;
666 thread_head.head_pseudo = new_p;
667 }
668
669 return new_p;
670 }
671
672 /* Get rid of our thread info.
673 */
674 static void
675 clear_thread_info (void)
676 {
677 thread_info *p;
678 thread_info *q;
679
680 #ifdef THREAD_DEBUG
681 if (debug_on)
682 printf ("Clearing all thread info\n");
683 #endif
684
685 p = thread_head.head;
686 while (p)
687 {
688 q = p;
689 p = p->next;
690 xfree (q);
691 }
692
693 thread_head.head = NULL;
694 thread_head.head_pseudo = NULL;
695 thread_head.count = 0;
696
697 p = deleted_threads.head;
698 while (p)
699 {
700 q = p;
701 p = p->next;
702 xfree (q);
703 }
704
705 deleted_threads.head = NULL;
706 deleted_threads.head_pseudo = NULL;
707 deleted_threads.count = 0;
708
709 /* No threads, so can't have pending events.
710 */
711 more_events_left = 0;
712 }
713
714 /* Given a tid, find the thread block for it.
715 */
716 static thread_info *
717 find_thread_info (lwpid_t tid)
718 {
719 thread_info *p;
720
721 for (p = thread_head.head; p; p = p->next)
722 {
723 if (p->tid == tid)
724 {
725 return p;
726 }
727 }
728
729 for (p = deleted_threads.head; p; p = p->next)
730 {
731 if (p->tid == tid)
732 {
733 return p;
734 }
735 }
736
737 return NULL;
738 }
739
740 /* For any but the pseudo thread, this maps to the
741 * thread ID. For the pseudo thread, if you pass either
742 * the thread id or the PID, you get the pseudo thread ID.
743 *
744 * We have to be prepared for core gdb to ask about
745 * deleted threads. We do the map, but we don't like it.
746 */
747 static lwpid_t
748 map_from_gdb_tid (lwpid_t gdb_tid)
749 {
750 thread_info *p;
751
752 /* First assume gdb_tid really is a tid, and try to find a
753 * matching entry on the threads list.
754 */
755 for (p = thread_head.head; p; p = p->next)
756 {
757 if (p->tid == gdb_tid)
758 return gdb_tid;
759 }
760
761 /* It doesn't appear to be a tid; perhaps it's really a pid?
762 * Try to find a "pseudo" thread entry on the threads list.
763 */
764 for (p = thread_head.head_pseudo; p != NULL; p = p->next_pseudo)
765 {
766 if (p->pid == gdb_tid)
767 return p->tid;
768 }
769
770 /* Perhaps it's the tid of a deleted thread we may still
771 * have some knowledge of?
772 */
773 for (p = deleted_threads.head; p; p = p->next)
774 {
775 if (p->tid == gdb_tid)
776 return gdb_tid;
777 }
778
779 /* Or perhaps it's the pid of a deleted process we may still
780 * have knowledge of?
781 */
782 for (p = deleted_threads.head_pseudo; p != NULL; p = p->next_pseudo)
783 {
784 if (p->pid == gdb_tid)
785 return p->tid;
786 }
787
788 return 0; /* Error? */
789 }
790
791 /* Map the other way: from a real tid to the
792 * "pid" known by core gdb. This tid may be
793 * for a thread that just got deleted, so we
794 * also need to consider deleted threads.
795 */
796 static lwpid_t
797 map_to_gdb_tid (lwpid_t real_tid)
798 {
799 thread_info *p;
800
801 for (p = thread_head.head; p; p = p->next)
802 {
803 if (p->tid == real_tid)
804 {
805 if (p->am_pseudo)
806 return p->pid;
807 else
808 return real_tid;
809 }
810 }
811
812 for (p = deleted_threads.head; p; p = p->next)
813 {
814 if (p->tid == real_tid)
815 if (p->am_pseudo)
816 return p->pid; /* Error? */
817 else
818 return real_tid;
819 }
820
821 return 0; /* Error? Never heard of this thread! */
822 }
823
824 /* Do any threads have saved signals?
825 */
826 static int
827 saved_signals_exist (void)
828 {
829 thread_info *p;
830
831 for (p = thread_head.head; p; p = p->next)
832 {
833 if (p->have_signal)
834 {
835 return 1;
836 }
837 }
838
839 return 0;
840 }
841
842 /* Is this the tid for the zero-th thread?
843 */
844 static int
845 is_pseudo_thread (lwpid_t tid)
846 {
847 thread_info *p = find_thread_info (tid);
848 if (NULL == p || p->terminated)
849 return 0;
850 else
851 return p->am_pseudo;
852 }
853
854 /* Is this thread terminated?
855 */
856 static int
857 is_terminated (lwpid_t tid)
858 {
859 thread_info *p = find_thread_info (tid);
860
861 if (NULL != p)
862 return p->terminated;
863
864 return 0;
865 }
866
867 /* Is this pid a real PID or a TID?
868 */
869 static int
870 is_process_id (int pid)
871 {
872 lwpid_t tid;
873 thread_info *tinfo;
874 pid_t this_pid;
875 int this_pid_count;
876
877 /* What does PID really represent?
878 */
879 tid = map_from_gdb_tid (pid);
880 if (tid <= 0)
881 return 0; /* Actually, is probably an error... */
882
883 tinfo = find_thread_info (tid);
884
885 /* Does it appear to be a true thread?
886 */
887 if (!tinfo->am_pseudo)
888 return 0;
889
890 /* Else, it looks like it may be a process. See if there's any other
891 * threads with the same process ID, though. If there are, then TID
892 * just happens to be the first thread of several for this process.
893 */
894 this_pid = tinfo->pid;
895 this_pid_count = 0;
896 for (tinfo = thread_head.head; tinfo; tinfo = tinfo->next)
897 {
898 if (tinfo->pid == this_pid)
899 this_pid_count++;
900 }
901
902 return (this_pid_count == 1);
903 }
904
905
906 /* Add a thread to our info. Prevent duplicate entries.
907 */
908 static thread_info *
909 add_tthread (int pid, lwpid_t tid)
910 {
911 thread_info *p;
912
913 p = find_thread_info (tid);
914 if (NULL == p)
915 p = create_thread_info (pid, tid);
916
917 return p;
918 }
919
920 /* Notice that a thread was deleted.
921 */
922 static void
923 del_tthread (lwpid_t tid)
924 {
925 thread_info *p;
926 thread_info *chase;
927
928 if (thread_head.count <= 0)
929 {
930 error ("Internal error in thread database.");
931 return;
932 }
933
934 chase = NULL;
935 for (p = thread_head.head; p; p = p->next)
936 {
937 if (p->tid == tid)
938 {
939
940 #ifdef THREAD_DEBUG
941 if (debug_on)
942 printf ("Delete here: %d \n", tid);
943 #endif
944
945 if (p->am_pseudo)
946 {
947 /*
948 * Deleting a main thread is ok if we're doing
949 * a parent-follow on a child; this is odd but
950 * not wrong. It apparently _doesn't_ happen
951 * on the child-follow, as we don't just delete
952 * the pseudo while keeping the rest of the
953 * threads around--instead, we clear out the whole
954 * thread list at once.
955 */
956 thread_info *q;
957 thread_info *q_chase;
958
959 q_chase = NULL;
960 for (q = thread_head.head_pseudo; q; q = q->next)
961 {
962 if (q == p)
963 {
964 /* Remove from pseudo list.
965 */
966 if (q_chase == NULL)
967 thread_head.head_pseudo = p->next_pseudo;
968 else
969 q_chase->next = p->next_pseudo;
970 }
971 else
972 q_chase = q;
973 }
974 }
975
976 /* Remove from live list.
977 */
978 thread_head.count--;
979
980 if (NULL == chase)
981 thread_head.head = p->next;
982 else
983 chase->next = p->next;
984
985 /* Add to deleted thread list.
986 */
987 p->next = deleted_threads.head;
988 deleted_threads.head = p;
989 deleted_threads.count++;
990 if (p->am_pseudo)
991 {
992 p->next_pseudo = deleted_threads.head_pseudo;
993 deleted_threads.head_pseudo = p;
994 }
995 p->terminated = 1;
996
997 return;
998 }
999
1000 else
1001 chase = p;
1002 }
1003 }
1004
1005 /* Get the pid for this tid. (Has to be a real TID!).
1006 */
1007 static int
1008 get_pid_for (lwpid_t tid)
1009 {
1010 thread_info *p;
1011
1012 for (p = thread_head.head; p; p = p->next)
1013 {
1014 if (p->tid == tid)
1015 {
1016 return p->pid;
1017 }
1018 }
1019
1020 for (p = deleted_threads.head; p; p = p->next)
1021 {
1022 if (p->tid == tid)
1023 {
1024 return p->pid;
1025 }
1026 }
1027
1028 return 0;
1029 }
1030
1031 /* Note that this thread's current event has been handled.
1032 */
1033 static void
1034 set_handled (int pid, lwpid_t tid)
1035 {
1036 thread_info *p;
1037
1038 p = find_thread_info (tid);
1039 if (NULL == p)
1040 p = add_tthread (pid, tid);
1041
1042 p->handled = 1;
1043 }
1044
1045 /* Was this thread's current event handled?
1046 */
1047 static int
1048 was_handled (lwpid_t tid)
1049 {
1050 thread_info *p;
1051
1052 p = find_thread_info (tid);
1053 if (NULL != p)
1054 return p->handled;
1055
1056 return 0; /* New threads have not been handled */
1057 }
1058
1059 /* Set this thread to unhandled.
1060 */
1061 static void
1062 clear_handled (lwpid_t tid)
1063 {
1064 thread_info *p;
1065
1066 #ifdef WAIT_BUFFER_DEBUG
1067 if (debug_on)
1068 printf ("clear_handled %d\n", (int) tid);
1069 #endif
1070
1071 p = find_thread_info (tid);
1072 if (p == NULL)
1073 error ("Internal error: No thread state to clear?");
1074
1075 p->handled = 0;
1076 }
1077
1078 /* Set all threads to unhandled.
1079 */
1080 static void
1081 clear_all_handled (void)
1082 {
1083 thread_info *p;
1084
1085 #ifdef WAIT_BUFFER_DEBUG
1086 if (debug_on)
1087 printf ("clear_all_handled\n");
1088 #endif
1089
1090 for (p = thread_head.head; p; p = p->next)
1091 {
1092 p->handled = 0;
1093 }
1094
1095 for (p = deleted_threads.head; p; p = p->next)
1096 {
1097 p->handled = 0;
1098 }
1099 }
1100
1101 /* Set this thread to default stepping mode.
1102 */
1103 static void
1104 clear_stepping_mode (lwpid_t tid)
1105 {
1106 thread_info *p;
1107
1108 #ifdef WAIT_BUFFER_DEBUG
1109 if (debug_on)
1110 printf ("clear_stepping_mode %d\n", (int) tid);
1111 #endif
1112
1113 p = find_thread_info (tid);
1114 if (p == NULL)
1115 error ("Internal error: No thread state to clear?");
1116
1117 p->stepping_mode = DO_DEFAULT;
1118 }
1119
1120 /* Set all threads to do default continue on resume.
1121 */
1122 static void
1123 clear_all_stepping_mode (void)
1124 {
1125 thread_info *p;
1126
1127 #ifdef WAIT_BUFFER_DEBUG
1128 if (debug_on)
1129 printf ("clear_all_stepping_mode\n");
1130 #endif
1131
1132 for (p = thread_head.head; p; p = p->next)
1133 {
1134 p->stepping_mode = DO_DEFAULT;
1135 }
1136
1137 for (p = deleted_threads.head; p; p = p->next)
1138 {
1139 p->stepping_mode = DO_DEFAULT;
1140 }
1141 }
1142
1143 /* Set all threads to unseen on this pass.
1144 */
1145 static void
1146 set_all_unseen (void)
1147 {
1148 thread_info *p;
1149
1150 for (p = thread_head.head; p; p = p->next)
1151 {
1152 p->seen = 0;
1153 }
1154 }
1155
1156 #if (defined( THREAD_DEBUG ) || defined( PARANOIA ))
1157 /* debugging routine.
1158 */
1159 static void
1160 print_tthread (thread_info *p)
1161 {
1162 printf (" Thread pid %d, tid %d", p->pid, p->tid);
1163 if (p->have_state)
1164 printf (", event is %s",
1165 get_printable_name_of_ttrace_event (p->last_stop_state.tts_event));
1166
1167 if (p->am_pseudo)
1168 printf (", pseudo thread");
1169
1170 if (p->have_signal)
1171 printf (", have signal 0x%x", p->signal_value);
1172
1173 if (p->have_start)
1174 printf (", have start at 0x%x", p->start);
1175
1176 printf (", step is %s", get_printable_name_of_stepping_mode (p->stepping_mode));
1177
1178 if (p->handled)
1179 printf (", handled");
1180 else
1181 printf (", not handled");
1182
1183 if (p->seen)
1184 printf (", seen");
1185 else
1186 printf (", not seen");
1187
1188 printf ("\n");
1189 }
1190
1191 static void
1192 print_tthreads (void)
1193 {
1194 thread_info *p;
1195
1196 if (thread_head.count == 0)
1197 printf ("Thread list is empty\n");
1198 else
1199 {
1200 printf ("Thread list has ");
1201 if (thread_head.count == 1)
1202 printf ("1 entry:\n");
1203 else
1204 printf ("%d entries:\n", thread_head.count);
1205 for (p = thread_head.head; p; p = p->next)
1206 {
1207 print_tthread (p);
1208 }
1209 }
1210
1211 if (deleted_threads.count == 0)
1212 printf ("Deleted thread list is empty\n");
1213 else
1214 {
1215 printf ("Deleted thread list has ");
1216 if (deleted_threads.count == 1)
1217 printf ("1 entry:\n");
1218 else
1219 printf ("%d entries:\n", deleted_threads.count);
1220
1221 for (p = deleted_threads.head; p; p = p->next)
1222 {
1223 print_tthread (p);
1224 }
1225 }
1226 }
1227 #endif
1228
1229 /* Update the thread list based on the "seen" bits.
1230 */
1231 static void
1232 update_thread_list (void)
1233 {
1234 thread_info *p;
1235 thread_info *chase;
1236
1237 chase = NULL;
1238 for (p = thread_head.head; p; p = p->next)
1239 {
1240 /* Is this an "unseen" thread which really happens to be a process?
1241 If so, is it inferior_ptid and is a vfork in flight? If yes to
1242 all, then DON'T REMOVE IT! We're in the midst of moving a vfork
1243 operation, which is a multiple step thing, to the point where we
1244 can touch the parent again. We've most likely stopped to examine
1245 the child at a late stage in the vfork, and if we're not following
1246 the child, we'd best not treat the parent as a dead "thread"...
1247 */
1248 if ((!p->seen) && p->am_pseudo && vfork_in_flight
1249 && (p->pid != vforking_child_pid))
1250 p->seen = 1;
1251
1252 if (!p->seen)
1253 {
1254 /* Remove this one
1255 */
1256
1257 #ifdef THREAD_DEBUG
1258 if (debug_on)
1259 printf ("Delete unseen thread: %d \n", p->tid);
1260 #endif
1261 del_tthread (p->tid);
1262 }
1263 }
1264 }
1265 \f
1266
1267
1268 /************************************************
1269 * O/S call wrappers *
1270 ************************************************
1271 */
1272
1273 /* This function simply calls ttrace with the given arguments.
1274 * It exists so that all calls to ttrace are isolated. All
1275 * parameters should be as specified by "man 2 ttrace".
1276 *
1277 * No other "raw" calls to ttrace should exist in this module.
1278 */
1279 static int
1280 call_real_ttrace (ttreq_t request, pid_t pid, lwpid_t tid, TTRACE_ARG_TYPE addr,
1281 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2)
1282 {
1283 int tt_status;
1284
1285 errno = 0;
1286 tt_status = ttrace (request, pid, tid, addr, data, addr2);
1287
1288 #ifdef THREAD_DEBUG
1289 if (errno)
1290 {
1291 /* Don't bother for a known benign error: if you ask for the
1292 * first thread state, but there is only one thread and it's
1293 * not stopped, ttrace complains.
1294 *
1295 * We have this inside the #ifdef because our caller will do
1296 * this check for real.
1297 */
1298 if (request != TT_PROC_GET_FIRST_LWP_STATE
1299 || errno != EPROTO)
1300 {
1301 if (debug_on)
1302 printf ("TT fail for %s, with pid %d, tid %d, status %d \n",
1303 get_printable_name_of_ttrace_request (request),
1304 pid, tid, tt_status);
1305 }
1306 }
1307 #endif
1308
1309 #if 0
1310 /* ??rehrauer: It would probably be most robust to catch and report
1311 * failed requests here. However, some clients of this interface
1312 * seem to expect to catch & deal with them, so we'd best not.
1313 */
1314 if (errno)
1315 {
1316 strcpy (reason_for_failure, "ttrace (");
1317 strcat (reason_for_failure, get_printable_name_of_ttrace_request (request));
1318 strcat (reason_for_failure, ")");
1319 printf ("ttrace error, errno = %d\n", errno);
1320 perror_with_name (reason_for_failure);
1321 }
1322 #endif
1323
1324 return tt_status;
1325 }
1326 \f
1327
1328 /* This function simply calls ttrace_wait with the given arguments.
1329 * It exists so that all calls to ttrace_wait are isolated.
1330 *
1331 * No "raw" calls to ttrace_wait should exist elsewhere.
1332 */
1333 static int
1334 call_real_ttrace_wait (int pid, lwpid_t tid, ttwopt_t option, ttstate_t *tsp,
1335 size_t tsp_size)
1336 {
1337 int ttw_status;
1338 thread_info *tinfo = NULL;
1339
1340 errno = 0;
1341 ttw_status = ttrace_wait (pid, tid, option, tsp, tsp_size);
1342
1343 if (errno)
1344 {
1345 #ifdef THREAD_DEBUG
1346 if (debug_on)
1347 printf ("TW fail with pid %d, tid %d \n", pid, tid);
1348 #endif
1349
1350 perror_with_name ("ttrace wait");
1351 }
1352
1353 return ttw_status;
1354 }
1355 \f
1356
1357 /* A process may have one or more kernel threads, of which all or
1358 none may be stopped. This function returns the ID of the first
1359 kernel thread in a stopped state, or 0 if none are stopped.
1360
1361 This function can be used with get_process_next_stopped_thread_id
1362 to iterate over the IDs of all stopped threads of this process.
1363 */
1364 static lwpid_t
1365 get_process_first_stopped_thread_id (int pid, ttstate_t *thread_state)
1366 {
1367 int tt_status;
1368
1369 tt_status = call_real_ttrace (TT_PROC_GET_FIRST_LWP_STATE,
1370 (pid_t) pid,
1371 (lwpid_t) TT_NIL,
1372 (TTRACE_ARG_TYPE) thread_state,
1373 (TTRACE_ARG_TYPE) sizeof (*thread_state),
1374 TT_NIL);
1375
1376 if (errno)
1377 {
1378 if (errno == EPROTO)
1379 {
1380 /* This is an error we can handle: there isn't any stopped
1381 * thread. This happens when we're re-starting the application
1382 * and it has only one thread. GET_NEXT handles the case of
1383 * no more stopped threads well; GET_FIRST doesn't. (A ttrace
1384 * "feature".)
1385 */
1386 tt_status = 1;
1387 errno = 0;
1388 return 0;
1389 }
1390 else
1391 perror_with_name ("ttrace");
1392 }
1393
1394 if (tt_status < 0)
1395 /* Failed somehow.
1396 */
1397 return 0;
1398
1399 return thread_state->tts_lwpid;
1400 }
1401 \f
1402
1403 /* This function returns the ID of the "next" kernel thread in a
1404 stopped state, or 0 if there are none. "Next" refers to the
1405 thread following that of the last successful call to this
1406 function or to get_process_first_stopped_thread_id, using
1407 the value of thread_state returned by that call.
1408
1409 This function can be used with get_process_first_stopped_thread_id
1410 to iterate over the IDs of all stopped threads of this process.
1411 */
1412 static lwpid_t
1413 get_process_next_stopped_thread_id (int pid, ttstate_t *thread_state)
1414 {
1415 int tt_status;
1416
1417 tt_status = call_real_ttrace (
1418 TT_PROC_GET_NEXT_LWP_STATE,
1419 (pid_t) pid,
1420 (lwpid_t) TT_NIL,
1421 (TTRACE_ARG_TYPE) thread_state,
1422 (TTRACE_ARG_TYPE) sizeof (*thread_state),
1423 TT_NIL);
1424 if (errno)
1425 perror_with_name ("ttrace");
1426
1427 if (tt_status < 0)
1428 /* Failed
1429 */
1430 return 0;
1431
1432 else if (tt_status == 0)
1433 {
1434 /* End of list, no next state. Don't return the
1435 * tts_lwpid, as it's a meaningless "240".
1436 *
1437 * This is an HPUX "feature".
1438 */
1439 return 0;
1440 }
1441
1442 return thread_state->tts_lwpid;
1443 }
1444
1445 /* ??rehrauer: Eventually this function perhaps should be calling
1446 pid_to_thread_id. However, that function currently does nothing
1447 for HP-UX. Even then, I'm not clear whether that function
1448 will return a "kernel" thread ID, or a "user" thread ID. If
1449 the former, we can just call it here. If the latter, we must
1450 map from the "user" tid to a "kernel" tid.
1451
1452 NOTE: currently not called.
1453 */
1454 static lwpid_t
1455 get_active_tid_of_pid (int pid)
1456 {
1457 ttstate_t thread_state;
1458
1459 return get_process_first_stopped_thread_id (pid, &thread_state);
1460 }
1461
1462 /* This function returns 1 if tt_request is a ttrace request that
1463 * operates upon all threads of a (i.e., the entire) process.
1464 */
1465 int
1466 is_process_ttrace_request (ttreq_t tt_request)
1467 {
1468 return IS_TTRACE_PROCREQ (tt_request);
1469 }
1470 \f
1471
1472 /* This function translates a thread ttrace request into
1473 * the equivalent process request for a one-thread process.
1474 */
1475 static ttreq_t
1476 make_process_version (ttreq_t request)
1477 {
1478 if (!IS_TTRACE_REQ (request))
1479 {
1480 error ("Internal error, bad ttrace request made\n");
1481 return -1;
1482 }
1483
1484 switch (request)
1485 {
1486 case TT_LWP_STOP:
1487 return TT_PROC_STOP;
1488
1489 case TT_LWP_CONTINUE:
1490 return TT_PROC_CONTINUE;
1491
1492 case TT_LWP_GET_EVENT_MASK:
1493 return TT_PROC_GET_EVENT_MASK;
1494
1495 case TT_LWP_SET_EVENT_MASK:
1496 return TT_PROC_SET_EVENT_MASK;
1497
1498 case TT_LWP_SINGLE:
1499 case TT_LWP_RUREGS:
1500 case TT_LWP_WUREGS:
1501 case TT_LWP_GET_STATE:
1502 return -1; /* No equivalent */
1503
1504 default:
1505 return request;
1506 }
1507 }
1508 \f
1509
1510 /* This function translates the "pid" used by the rest of
1511 * gdb to a real pid and a tid. It then calls "call_real_ttrace"
1512 * with the given arguments.
1513 *
1514 * In general, other parts of this module should call this
1515 * function when they are dealing with external users, who only
1516 * have tids to pass (but they call it "pid" for historical
1517 * reasons).
1518 */
1519 static int
1520 call_ttrace (ttreq_t request, int gdb_tid, TTRACE_ARG_TYPE addr,
1521 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2)
1522 {
1523 lwpid_t real_tid;
1524 int real_pid;
1525 ttreq_t new_request;
1526 int tt_status;
1527 char reason_for_failure[100]; /* Arbitrary size, should be big enough. */
1528
1529 #ifdef THREAD_DEBUG
1530 int is_interesting = 0;
1531
1532 if (TT_LWP_RUREGS == request)
1533 {
1534 is_interesting = 1; /* Adjust code here as desired */
1535 }
1536
1537 if (is_interesting && 0 && debug_on)
1538 {
1539 if (!is_process_ttrace_request (request))
1540 {
1541 printf ("TT: Thread request, tid is %d", gdb_tid);
1542 printf ("== SINGLE at %x", addr);
1543 }
1544 else
1545 {
1546 printf ("TT: Process request, tid is %d\n", gdb_tid);
1547 printf ("==! SINGLE at %x", addr);
1548 }
1549 }
1550 #endif
1551
1552 /* The initial SETTRC and SET_EVENT_MASK calls (and all others
1553 * which happen before any threads get set up) should go
1554 * directly to "call_real_ttrace", so they don't happen here.
1555 *
1556 * But hardware watchpoints do a SET_EVENT_MASK, so we can't
1557 * rule them out....
1558 */
1559 #ifdef THREAD_DEBUG
1560 if (request == TT_PROC_SETTRC && debug_on)
1561 printf ("Unexpected call for TT_PROC_SETTRC\n");
1562 #endif
1563
1564 /* Sometimes we get called with a bogus tid (e.g., if a
1565 * thread has terminated, we return 0; inftarg later asks
1566 * whether the thread has exited/forked/vforked).
1567 */
1568 if (gdb_tid == 0)
1569 {
1570 errno = ESRCH; /* ttrace's response would probably be "No such process". */
1571 return -1;
1572 }
1573
1574 /* All other cases should be able to expect that there are
1575 * thread records.
1576 */
1577 if (!any_thread_records ())
1578 {
1579 #ifdef THREAD_DEBUG
1580 if (debug_on)
1581 warning ("No thread records for ttrace call");
1582 #endif
1583 errno = ESRCH; /* ttrace's response would be "No such process". */
1584 return -1;
1585 }
1586
1587 /* OK, now the task is to translate the incoming tid into
1588 * a pid/tid pair.
1589 */
1590 real_tid = map_from_gdb_tid (gdb_tid);
1591 real_pid = get_pid_for (real_tid);
1592
1593 /* Now check the result. "Real_pid" is NULL if our list
1594 * didn't find it. We have some tricks we can play to fix
1595 * this, however.
1596 */
1597 if (0 == real_pid)
1598 {
1599 ttstate_t thread_state;
1600
1601 #ifdef THREAD_DEBUG
1602 if (debug_on)
1603 printf ("No saved pid for tid %d\n", gdb_tid);
1604 #endif
1605
1606 if (is_process_ttrace_request (request))
1607 {
1608
1609 /* Ok, we couldn't get a tid. Try to translate to
1610 * the equivalent process operation. We expect this
1611 * NOT to happen, so this is a desparation-type
1612 * move. It can happen if there is an internal
1613 * error and so no "wait()" call is ever done.
1614 */
1615 new_request = make_process_version (request);
1616 if (new_request == -1)
1617 {
1618
1619 #ifdef THREAD_DEBUG
1620 if (debug_on)
1621 printf ("...and couldn't make process version of thread operation\n");
1622 #endif
1623
1624 /* Use hacky saved pid, which won't always be correct
1625 * in the multi-process future. Use tid as thread,
1626 * probably dooming this to failure. FIX!
1627 */
1628 if (! ptid_equal (saved_real_ptid, null_ptid))
1629 {
1630 #ifdef THREAD_DEBUG
1631 if (debug_on)
1632 printf ("...using saved pid %d\n",
1633 PIDGET (saved_real_ptid));
1634 #endif
1635
1636 real_pid = PIDGET (saved_real_ptid);
1637 real_tid = gdb_tid;
1638 }
1639
1640 else
1641 error ("Unable to perform thread operation");
1642 }
1643
1644 else
1645 {
1646 /* Sucessfully translated this to a process request,
1647 * which needs no thread value.
1648 */
1649 real_pid = gdb_tid;
1650 real_tid = 0;
1651 request = new_request;
1652
1653 #ifdef THREAD_DEBUG
1654 if (debug_on)
1655 {
1656 printf ("Translated thread request to process request\n");
1657 if (ptid_equal (saved_real_ptid, null_ptid))
1658 printf ("...but there's no saved pid\n");
1659
1660 else
1661 {
1662 if (gdb_tid != PIDGET (saved_real_ptid))
1663 printf ("...but have the wrong pid (%d rather than %d)\n",
1664 gdb_tid, PIDGET (saved_real_ptid));
1665 }
1666 }
1667 #endif
1668 } /* Translated to a process request */
1669 } /* Is a process request */
1670
1671 else
1672 {
1673 /* We have to have a thread. Ooops.
1674 */
1675 error ("Thread request with no threads (%s)",
1676 get_printable_name_of_ttrace_request (request));
1677 }
1678 }
1679
1680 /* Ttrace doesn't like to see tid values on process requests,
1681 * even if we have the right one.
1682 */
1683 if (is_process_ttrace_request (request))
1684 {
1685 real_tid = 0;
1686 }
1687
1688 #ifdef THREAD_DEBUG
1689 if (is_interesting && 0 && debug_on)
1690 {
1691 printf (" now tid %d, pid %d\n", real_tid, real_pid);
1692 printf (" request is %s\n", get_printable_name_of_ttrace_request (request));
1693 }
1694 #endif
1695
1696 /* Finally, the (almost) real call.
1697 */
1698 tt_status = call_real_ttrace (request, real_pid, real_tid, addr, data, addr2);
1699
1700 #ifdef THREAD_DEBUG
1701 if (is_interesting && debug_on)
1702 {
1703 if (!TT_OK (tt_status, errno)
1704 && !(tt_status == 0 & errno == 0))
1705 printf (" got error (errno==%d, status==%d)\n", errno, tt_status);
1706 }
1707 #endif
1708
1709 return tt_status;
1710 }
1711
1712
1713 /* Stop all the threads of a process.
1714
1715 * NOTE: use of TT_PROC_STOP can cause a thread with a real event
1716 * to get a TTEVT_NONE event, discarding the old event. Be
1717 * very careful, and only call TT_PROC_STOP when you mean it!
1718 */
1719 static void
1720 stop_all_threads_of_process (pid_t real_pid)
1721 {
1722 int ttw_status;
1723
1724 ttw_status = call_real_ttrace (TT_PROC_STOP,
1725 (pid_t) real_pid,
1726 (lwpid_t) TT_NIL,
1727 (TTRACE_ARG_TYPE) TT_NIL,
1728 (TTRACE_ARG_TYPE) TT_NIL,
1729 TT_NIL);
1730 if (errno)
1731 perror_with_name ("ttrace stop of other threads");
1732 }
1733
1734
1735 /* Under some circumstances, it's unsafe to attempt to stop, or even
1736 query the state of, a process' threads.
1737
1738 In ttrace-based HP-UX, an example is a vforking child process. The
1739 vforking parent and child are somewhat fragile, w/r/t what we can do
1740 what we can do to them with ttrace, until after the child exits or
1741 execs, or until the parent's vfork event is delivered. Until that
1742 time, we must not try to stop the process' threads, or inquire how
1743 many there are, or even alter its data segments, or it typically dies
1744 with a SIGILL. Sigh.
1745
1746 This function returns 1 if this stopped process, and the event that
1747 we're told was responsible for its current stopped state, cannot safely
1748 have its threads examined.
1749 */
1750 #define CHILD_VFORKED(evt,pid) \
1751 (((evt) == TTEVT_VFORK) && ((pid) != PIDGET (inferior_ptid)))
1752 #define CHILD_URPED(evt,pid) \
1753 ((((evt) == TTEVT_EXEC) || ((evt) == TTEVT_EXIT)) && ((pid) != vforking_child_pid))
1754 #define PARENT_VFORKED(evt,pid) \
1755 (((evt) == TTEVT_VFORK) && ((pid) == PIDGET (inferior_ptid)))
1756
1757 static int
1758 can_touch_threads_of_process (int pid, ttevents_t stopping_event)
1759 {
1760 if (CHILD_VFORKED (stopping_event, pid))
1761 {
1762 vforking_child_pid = pid;
1763 vfork_in_flight = 1;
1764 }
1765
1766 else if (vfork_in_flight &&
1767 (PARENT_VFORKED (stopping_event, pid) ||
1768 CHILD_URPED (stopping_event, pid)))
1769 {
1770 vfork_in_flight = 0;
1771 vforking_child_pid = 0;
1772 }
1773
1774 return !vfork_in_flight;
1775 }
1776
1777
1778 /* If we can find an as-yet-unhandled thread state of a
1779 * stopped thread of this process return 1 and set "tsp".
1780 * Return 0 if we can't.
1781 *
1782 * If this function is used when the threads of PIS haven't
1783 * been stopped, undefined behaviour is guaranteed!
1784 */
1785 static int
1786 select_stopped_thread_of_process (int pid, ttstate_t *tsp)
1787 {
1788 lwpid_t candidate_tid, tid;
1789 ttstate_t candidate_tstate, tstate;
1790
1791 /* If we're not allowed to touch the process now, then just
1792 * return the current value of *TSP.
1793 *
1794 * This supports "vfork". It's ok, really, to double the
1795 * current event (the child EXEC, we hope!).
1796 */
1797 if (!can_touch_threads_of_process (pid, tsp->tts_event))
1798 return 1;
1799
1800 /* Decide which of (possibly more than one) events to
1801 * return as the first one. We scan them all so that
1802 * we always return the result of a fake-step first.
1803 */
1804 candidate_tid = 0;
1805 for (tid = get_process_first_stopped_thread_id (pid, &tstate);
1806 tid != 0;
1807 tid = get_process_next_stopped_thread_id (pid, &tstate))
1808 {
1809 /* TTEVT_NONE events are uninteresting to our clients. They're
1810 * an artifact of our "stop the world" model--the thread is
1811 * stopped because we stopped it.
1812 */
1813 if (tstate.tts_event == TTEVT_NONE)
1814 {
1815 set_handled (pid, tstate.tts_lwpid);
1816 }
1817
1818 /* Did we just single-step a single thread, without letting any
1819 * of the others run? Is this an event for that thread?
1820 *
1821 * If so, we believe our client would prefer to see this event
1822 * over any others. (Typically the client wants to just push
1823 * one thread a little farther forward, and then go around
1824 * checking for what all threads are doing.)
1825 */
1826 else if (doing_fake_step && (tstate.tts_lwpid == fake_step_tid))
1827 {
1828 #ifdef WAIT_BUFFER_DEBUG
1829 /* It's possible here to see either a SIGTRAP (due to
1830 * successful completion of a step) or a SYSCALL_ENTRY
1831 * (due to a step completion with active hardware
1832 * watchpoints).
1833 */
1834 if (debug_on)
1835 printf ("Ending fake step with tid %d, state %s\n",
1836 tstate.tts_lwpid,
1837 get_printable_name_of_ttrace_event (tstate.tts_event));
1838 #endif
1839
1840 /* Remember this one, and throw away any previous
1841 * candidate.
1842 */
1843 candidate_tid = tstate.tts_lwpid;
1844 candidate_tstate = tstate;
1845 }
1846
1847 #ifdef FORGET_DELETED_BPTS
1848
1849 /* We can't just do this, as if we do, and then wind
1850 * up the loop with no unhandled events, we need to
1851 * handle that case--the appropriate reaction is to
1852 * just continue, but there's no easy way to do that.
1853 *
1854 * Better to put this in the ttrace_wait call--if, when
1855 * we fake a wait, we update our events based on the
1856 * breakpoint_here_pc call and find there are no more events,
1857 * then we better continue and so on.
1858 *
1859 * Or we could put it in the next/continue fake.
1860 * But it has to go in the buffering code, not in the
1861 * real go/wait code.
1862 */
1863 else if ((TTEVT_SIGNAL == tstate.tts_event)
1864 && (5 == tstate.tts_u.tts_signal.tts_signo)
1865 && (0 != get_raw_pc (tstate.tts_lwpid))
1866 && !breakpoint_here_p (get_raw_pc (tstate.tts_lwpid)))
1867 {
1868 /*
1869 * If the user deleted a breakpoint while this
1870 * breakpoint-hit event was buffered, we can forget
1871 * it now.
1872 */
1873 #ifdef WAIT_BUFFER_DEBUG
1874 if (debug_on)
1875 printf ("Forgetting deleted bp hit for thread %d\n",
1876 tstate.tts_lwpid);
1877 #endif
1878
1879 set_handled (pid, tstate.tts_lwpid);
1880 }
1881 #endif
1882
1883 /* Else, is this the first "unhandled" event? If so,
1884 * we believe our client wants to see it (if we don't
1885 * see a fake-step later on in the scan).
1886 */
1887 else if (!was_handled (tstate.tts_lwpid) && candidate_tid == 0)
1888 {
1889 candidate_tid = tstate.tts_lwpid;
1890 candidate_tstate = tstate;
1891 }
1892
1893 /* This is either an event that has already been "handled",
1894 * and thus we believe is uninteresting to our client, or we
1895 * already have a candidate event. Ignore it...
1896 */
1897 }
1898
1899 /* What do we report?
1900 */
1901 if (doing_fake_step)
1902 {
1903 if (candidate_tid == fake_step_tid)
1904 {
1905 /* Fake step.
1906 */
1907 tstate = candidate_tstate;
1908 }
1909 else
1910 {
1911 warning ("Internal error: fake-step failed to complete.");
1912 return 0;
1913 }
1914 }
1915 else if (candidate_tid != 0)
1916 {
1917 /* Found a candidate unhandled event.
1918 */
1919 tstate = candidate_tstate;
1920 }
1921 else if (tid != 0)
1922 {
1923 warning ("Internal error in call of ttrace_wait.");
1924 return 0;
1925 }
1926 else
1927 {
1928 warning ("Internal error: no unhandled thread event to select");
1929 return 0;
1930 }
1931
1932 copy_ttstate_t (tsp, &tstate);
1933 return 1;
1934 } /* End of select_stopped_thread_of_process */
1935
1936 #ifdef PARANOIA
1937 /* Check our internal thread data against the real thing.
1938 */
1939 static void
1940 check_thread_consistency (pid_t real_pid)
1941 {
1942 int tid; /* really lwpid_t */
1943 ttstate_t tstate;
1944 thread_info *p;
1945
1946 /* Spin down the O/S list of threads, checking that they
1947 * match what we've got.
1948 */
1949 for (tid = get_process_first_stopped_thread_id (real_pid, &tstate);
1950 tid != 0;
1951 tid = get_process_next_stopped_thread_id (real_pid, &tstate))
1952 {
1953
1954 p = find_thread_info (tid);
1955
1956 if (NULL == p)
1957 {
1958 warning ("No internal thread data for thread %d.", tid);
1959 continue;
1960 }
1961
1962 if (!p->seen)
1963 {
1964 warning ("Inconsistent internal thread data for thread %d.", tid);
1965 }
1966
1967 if (p->terminated)
1968 {
1969 warning ("Thread %d is not terminated, internal error.", tid);
1970 continue;
1971 }
1972
1973
1974 #define TT_COMPARE( fld ) \
1975 tstate.fld != p->last_stop_state.fld
1976
1977 if (p->have_state)
1978 {
1979 if (TT_COMPARE (tts_pid)
1980 || TT_COMPARE (tts_lwpid)
1981 || TT_COMPARE (tts_user_tid)
1982 || TT_COMPARE (tts_event)
1983 || TT_COMPARE (tts_flags)
1984 || TT_COMPARE (tts_scno)
1985 || TT_COMPARE (tts_scnargs))
1986 {
1987 warning ("Internal thread data for thread %d is wrong.", tid);
1988 continue;
1989 }
1990 }
1991 }
1992 }
1993 #endif /* PARANOIA */
1994 \f
1995
1996 /* This function wraps calls to "call_real_ttrace_wait" so
1997 * that a actual wait is only done when all pending events
1998 * have been reported.
1999 *
2000 * Note that typically it is called with a pid of "0", i.e.
2001 * the "don't care" value.
2002 *
2003 * Return value is the status of the pseudo wait.
2004 */
2005 static int
2006 call_ttrace_wait (int pid, ttwopt_t option, ttstate_t *tsp, size_t tsp_size)
2007 {
2008 /* This holds the actual, for-real, true process ID.
2009 */
2010 static int real_pid;
2011
2012 /* As an argument to ttrace_wait, zero pid
2013 * means "Any process", and zero tid means
2014 * "Any thread of the specified process".
2015 */
2016 int wait_pid = 0;
2017 lwpid_t wait_tid = 0;
2018 lwpid_t real_tid;
2019
2020 int ttw_status = 0; /* To be returned */
2021
2022 thread_info *tinfo = NULL;
2023
2024 if (pid != 0)
2025 {
2026 /* Unexpected case.
2027 */
2028 #ifdef THREAD_DEBUG
2029 if (debug_on)
2030 printf ("TW: Pid to wait on is %d\n", pid);
2031 #endif
2032
2033 if (!any_thread_records ())
2034 error ("No thread records for ttrace call w. specific pid");
2035
2036 /* OK, now the task is to translate the incoming tid into
2037 * a pid/tid pair.
2038 */
2039 real_tid = map_from_gdb_tid (pid);
2040 real_pid = get_pid_for (real_tid);
2041 #ifdef THREAD_DEBUG
2042 if (debug_on)
2043 printf ("==TW: real pid %d, real tid %d\n", real_pid, real_tid);
2044 #endif
2045 }
2046
2047
2048 /* Sanity checks and set-up.
2049 * Process State
2050 *
2051 * Stopped Running Fake-step (v)Fork
2052 * \________________________________________
2053 * |
2054 * No buffered events | error wait wait wait
2055 * |
2056 * Buffered events | debuffer error wait debuffer (?)
2057 *
2058 */
2059 if (more_events_left == 0)
2060 {
2061
2062 if (process_state == RUNNING)
2063 {
2064 /* OK--normal call of ttrace_wait with no buffered events.
2065 */
2066 ;
2067 }
2068 else if (process_state == FAKE_STEPPING)
2069 {
2070 /* Ok--call of ttrace_wait to support
2071 * fake stepping with no buffered events.
2072 *
2073 * But we better be fake-stepping!
2074 */
2075 if (!doing_fake_step)
2076 {
2077 warning ("Inconsistent thread state.");
2078 }
2079 }
2080 else if ((process_state == FORKING)
2081 || (process_state == VFORKING))
2082 {
2083 /* Ok--there are two processes, so waiting
2084 * for the second while the first is stopped
2085 * is ok. Handled bits stay as they were.
2086 */
2087 ;
2088 }
2089 else if (process_state == STOPPED)
2090 {
2091 warning ("Process not running at wait call.");
2092 }
2093 else
2094 /* No known state.
2095 */
2096 warning ("Inconsistent process state.");
2097 }
2098
2099 else
2100 {
2101 /* More events left
2102 */
2103 if (process_state == STOPPED)
2104 {
2105 /* OK--buffered events being unbuffered.
2106 */
2107 ;
2108 }
2109 else if (process_state == RUNNING)
2110 {
2111 /* An error--shouldn't have buffered events
2112 * when running.
2113 */
2114 warning ("Trying to continue with buffered events:");
2115 }
2116 else if (process_state == FAKE_STEPPING)
2117 {
2118 /*
2119 * Better be fake-stepping!
2120 */
2121 if (!doing_fake_step)
2122 {
2123 warning ("Losing buffered thread events!\n");
2124 }
2125 }
2126 else if ((process_state == FORKING)
2127 || (process_state == VFORKING))
2128 {
2129 /* Ok--there are two processes, so waiting
2130 * for the second while the first is stopped
2131 * is ok. Handled bits stay as they were.
2132 */
2133 ;
2134 }
2135 else
2136 warning ("Process in unknown state with buffered events.");
2137 }
2138
2139 /* Sometimes we have to wait for a particular thread
2140 * (if we're stepping over a bpt). In that case, we
2141 * _know_ it's going to complete the single-step we
2142 * asked for (because we're only doing the step under
2143 * certain very well-understood circumstances), so it
2144 * can't block.
2145 */
2146 if (doing_fake_step)
2147 {
2148 wait_tid = fake_step_tid;
2149 wait_pid = get_pid_for (fake_step_tid);
2150
2151 #ifdef WAIT_BUFFER_DEBUG
2152 if (debug_on)
2153 printf ("Doing a wait after a fake-step for %d, pid %d\n",
2154 wait_tid, wait_pid);
2155 #endif
2156 }
2157
2158 if (more_events_left == 0 /* No buffered events, need real ones. */
2159 || process_state != STOPPED)
2160 {
2161 /* If there are no buffered events, and so we need
2162 * real ones, or if we are FORKING, VFORKING,
2163 * FAKE_STEPPING or RUNNING, and thus have to do
2164 * a real wait, then do a real wait.
2165 */
2166
2167 #ifdef WAIT_BUFFER_DEBUG
2168 /* Normal case... */
2169 if (debug_on)
2170 printf ("TW: do it for real; pid %d, tid %d\n", wait_pid, wait_tid);
2171 #endif
2172
2173 /* The actual wait call.
2174 */
2175 ttw_status = call_real_ttrace_wait (wait_pid, wait_tid, option, tsp, tsp_size);
2176
2177 /* Note that the routines we'll call will be using "call_real_ttrace",
2178 * not "call_ttrace", and thus need the real pid rather than the pseudo-tid
2179 * the rest of the world uses (which is actually the tid).
2180 */
2181 real_pid = tsp->tts_pid;
2182
2183 /* For most events: Stop the world!
2184
2185 * It's sometimes not safe to stop all threads of a process.
2186 * Sometimes it's not even safe to ask for the thread state
2187 * of a process!
2188 */
2189 if (can_touch_threads_of_process (real_pid, tsp->tts_event))
2190 {
2191 /* If we're really only stepping a single thread, then don't
2192 * try to stop all the others -- we only do this single-stepping
2193 * business when all others were already stopped...and the stop
2194 * would mess up other threads' events.
2195 *
2196 * Similiarly, if there are other threads with events,
2197 * don't do the stop.
2198 */
2199 if (!doing_fake_step)
2200 {
2201 if (more_events_left > 0)
2202 warning ("Internal error in stopping process");
2203
2204 stop_all_threads_of_process (real_pid);
2205
2206 /* At this point, we could scan and update_thread_list(),
2207 * and only use the local list for the rest of the
2208 * module! We'd get rid of the scans in the various
2209 * continue routines (adding one in attach). It'd
2210 * be great--UPGRADE ME!
2211 */
2212 }
2213 }
2214
2215 #ifdef PARANOIA
2216 else if (debug_on)
2217 {
2218 if (more_events_left > 0)
2219 printf ("== Can't stop process; more events!\n");
2220 else
2221 printf ("== Can't stop process!\n");
2222 }
2223 #endif
2224
2225 process_state = STOPPED;
2226
2227 #ifdef WAIT_BUFFER_DEBUG
2228 if (debug_on)
2229 printf ("Process set to STOPPED\n");
2230 #endif
2231 }
2232
2233 else
2234 {
2235 /* Fake a call to ttrace_wait. The process must be
2236 * STOPPED, as we aren't going to do any wait.
2237 */
2238 #ifdef WAIT_BUFFER_DEBUG
2239 if (debug_on)
2240 printf ("TW: fake it\n");
2241 #endif
2242
2243 if (process_state != STOPPED)
2244 {
2245 warning ("Process not stopped at wait call, in state '%s'.\n",
2246 get_printable_name_of_process_state (process_state));
2247 }
2248
2249 if (doing_fake_step)
2250 error ("Internal error in stepping over breakpoint");
2251
2252 ttw_status = 0; /* Faking it is always successful! */
2253 } /* End of fake or not? if */
2254
2255 /* Pick an event to pass to our caller. Be paranoid.
2256 */
2257 if (!select_stopped_thread_of_process (real_pid, tsp))
2258 warning ("Can't find event, using previous event.");
2259
2260 else if (tsp->tts_event == TTEVT_NONE)
2261 warning ("Internal error: no thread has a real event.");
2262
2263 else if (doing_fake_step)
2264 {
2265 if (fake_step_tid != tsp->tts_lwpid)
2266 warning ("Internal error in stepping over breakpoint.");
2267
2268 /* This wait clears the (current) fake-step if there was one.
2269 */
2270 doing_fake_step = 0;
2271 fake_step_tid = 0;
2272 }
2273
2274 /* We now have a correct tsp and ttw_status for the thread
2275 * which we want to report. So it's "handled"! This call
2276 * will add it to our list if it's not there already.
2277 */
2278 set_handled (real_pid, tsp->tts_lwpid);
2279
2280 /* Save a copy of the ttrace state of this thread, in our local
2281 thread descriptor.
2282
2283 This caches the state. The implementation of queries like
2284 target_has_execd can then use this cached state, rather than
2285 be forced to make an explicit ttrace call to get it.
2286
2287 (Guard against the condition that this is the first time we've
2288 waited on, i.e., seen this thread, and so haven't yet entered
2289 it into our list of threads.)
2290 */
2291 tinfo = find_thread_info (tsp->tts_lwpid);
2292 if (tinfo != NULL)
2293 {
2294 copy_ttstate_t (&tinfo->last_stop_state, tsp);
2295 tinfo->have_state = 1;
2296 }
2297
2298 return ttw_status;
2299 } /* call_ttrace_wait */
2300
2301 #if defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
2302 int
2303 child_reported_exec_events_per_exec_call (void)
2304 {
2305 return 1; /* ttrace reports the event once per call. */
2306 }
2307 #endif
2308 \f
2309
2310
2311 /* Our implementation of hardware watchpoints involves making memory
2312 pages write-protected. We must remember a page's original permissions,
2313 and we must also know when it is appropriate to restore a page's
2314 permissions to its original state.
2315
2316 We use a "dictionary" of hardware-watched pages to do this. Each
2317 hardware-watched page is recorded in the dictionary. Each page's
2318 dictionary entry contains the original permissions and a reference
2319 count. Pages are hashed into the dictionary by their start address.
2320
2321 When hardware watchpoint is set on page X for the first time, page X
2322 is added to the dictionary with a reference count of 1. If other
2323 hardware watchpoints are subsequently set on page X, its reference
2324 count is incremented. When hardware watchpoints are removed from
2325 page X, its reference count is decremented. If a page's reference
2326 count drops to 0, it's permissions are restored and the page's entry
2327 is thrown out of the dictionary.
2328 */
2329 typedef struct memory_page
2330 {
2331 CORE_ADDR page_start;
2332 int reference_count;
2333 int original_permissions;
2334 struct memory_page *next;
2335 struct memory_page *previous;
2336 }
2337 memory_page_t;
2338
2339 #define MEMORY_PAGE_DICTIONARY_BUCKET_COUNT 128
2340
2341 static struct
2342 {
2343 LONGEST page_count;
2344 int page_size;
2345 int page_protections_allowed;
2346 /* These are just the heads of chains of actual page descriptors. */
2347 memory_page_t buckets[MEMORY_PAGE_DICTIONARY_BUCKET_COUNT];
2348 }
2349 memory_page_dictionary;
2350
2351
2352 static void
2353 require_memory_page_dictionary (void)
2354 {
2355 int i;
2356
2357 /* Is the memory page dictionary ready for use? If so, we're done. */
2358 if (memory_page_dictionary.page_count >= (LONGEST) 0)
2359 return;
2360
2361 /* Else, initialize it. */
2362 memory_page_dictionary.page_count = (LONGEST) 0;
2363
2364 for (i = 0; i < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; i++)
2365 {
2366 memory_page_dictionary.buckets[i].page_start = (CORE_ADDR) 0;
2367 memory_page_dictionary.buckets[i].reference_count = 0;
2368 memory_page_dictionary.buckets[i].next = NULL;
2369 memory_page_dictionary.buckets[i].previous = NULL;
2370 }
2371 }
2372
2373
2374 static void
2375 retire_memory_page_dictionary (void)
2376 {
2377 memory_page_dictionary.page_count = (LONGEST) - 1;
2378 }
2379
2380
2381 /* Write-protect the memory page that starts at this address.
2382
2383 Returns the original permissions of the page.
2384 */
2385 static int
2386 write_protect_page (int pid, CORE_ADDR page_start)
2387 {
2388 int tt_status;
2389 int original_permissions;
2390 int new_permissions;
2391
2392 tt_status = call_ttrace (TT_PROC_GET_MPROTECT,
2393 pid,
2394 (TTRACE_ARG_TYPE) page_start,
2395 TT_NIL,
2396 (TTRACE_ARG_TYPE) & original_permissions);
2397 if (errno || (tt_status < 0))
2398 {
2399 return 0; /* What else can we do? */
2400 }
2401
2402 /* We'll also write-protect the page now, if that's allowed. */
2403 if (memory_page_dictionary.page_protections_allowed)
2404 {
2405 new_permissions = original_permissions & ~PROT_WRITE;
2406 tt_status = call_ttrace (TT_PROC_SET_MPROTECT,
2407 pid,
2408 (TTRACE_ARG_TYPE) page_start,
2409 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size,
2410 (TTRACE_ARG_TYPE) new_permissions);
2411 if (errno || (tt_status < 0))
2412 {
2413 return 0; /* What else can we do? */
2414 }
2415 }
2416
2417 return original_permissions;
2418 }
2419
2420
2421 /* Unwrite-protect the memory page that starts at this address, restoring
2422 (what we must assume are) its original permissions.
2423 */
2424 static void
2425 unwrite_protect_page (int pid, CORE_ADDR page_start, int original_permissions)
2426 {
2427 int tt_status;
2428
2429 tt_status = call_ttrace (TT_PROC_SET_MPROTECT,
2430 pid,
2431 (TTRACE_ARG_TYPE) page_start,
2432 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size,
2433 (TTRACE_ARG_TYPE) original_permissions);
2434 if (errno || (tt_status < 0))
2435 {
2436 return; /* What else can we do? */
2437 }
2438 }
2439
2440
2441 /* Memory page-protections are used to implement "hardware" watchpoints
2442 on HP-UX.
2443
2444 For every memory page that is currently being watched (i.e., that
2445 presently should be write-protected), write-protect it.
2446 */
2447 void
2448 hppa_enable_page_protection_events (int pid)
2449 {
2450 int bucket;
2451
2452 memory_page_dictionary.page_protections_allowed = 1;
2453
2454 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++)
2455 {
2456 memory_page_t *page;
2457
2458 page = memory_page_dictionary.buckets[bucket].next;
2459 while (page != NULL)
2460 {
2461 page->original_permissions = write_protect_page (pid, page->page_start);
2462 page = page->next;
2463 }
2464 }
2465 }
2466
2467
2468 /* Memory page-protections are used to implement "hardware" watchpoints
2469 on HP-UX.
2470
2471 For every memory page that is currently being watched (i.e., that
2472 presently is or should be write-protected), un-write-protect it.
2473 */
2474 void
2475 hppa_disable_page_protection_events (int pid)
2476 {
2477 int bucket;
2478
2479 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++)
2480 {
2481 memory_page_t *page;
2482
2483 page = memory_page_dictionary.buckets[bucket].next;
2484 while (page != NULL)
2485 {
2486 unwrite_protect_page (pid, page->page_start, page->original_permissions);
2487 page = page->next;
2488 }
2489 }
2490
2491 memory_page_dictionary.page_protections_allowed = 0;
2492 }
2493
2494 /* Count the number of outstanding events. At this
2495 * point, we have selected one thread and its event
2496 * as the one to be "reported" upwards to core gdb.
2497 * That thread is already marked as "handled".
2498 *
2499 * Note: we could just scan our own thread list. FIXME!
2500 */
2501 static int
2502 count_unhandled_events (int real_pid, lwpid_t real_tid)
2503 {
2504 ttstate_t tstate;
2505 lwpid_t ttid;
2506 int events_left;
2507
2508 /* Ok, find out how many threads have real events to report.
2509 */
2510 events_left = 0;
2511 ttid = get_process_first_stopped_thread_id (real_pid, &tstate);
2512
2513 #ifdef THREAD_DEBUG
2514 if (debug_on)
2515 {
2516 if (ttid == 0)
2517 printf ("Process %d has no threads\n", real_pid);
2518 else
2519 printf ("Process %d has these threads:\n", real_pid);
2520 }
2521 #endif
2522
2523 while (ttid > 0)
2524 {
2525 if (tstate.tts_event != TTEVT_NONE
2526 && !was_handled (ttid))
2527 {
2528 /* TTEVT_NONE implies we just stopped it ourselves
2529 * because we're the stop-the-world guys, so it's
2530 * not an event from our point of view.
2531 *
2532 * If "was_handled" is true, this is an event we
2533 * already handled, so don't count it.
2534 *
2535 * Note that we don't count the thread with the
2536 * currently-reported event, as it's already marked
2537 * as handled.
2538 */
2539 events_left++;
2540 }
2541
2542 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG )
2543 if (debug_on)
2544 {
2545 if (ttid == real_tid)
2546 printf ("*"); /* Thread we're reporting */
2547 else
2548 printf (" ");
2549
2550 if (tstate.tts_event != TTEVT_NONE)
2551 printf ("+"); /* Thread with a real event */
2552 else
2553 printf (" ");
2554
2555 if (was_handled (ttid))
2556 printf ("h"); /* Thread has been handled */
2557 else
2558 printf (" ");
2559
2560 printf (" %d, with event %s", ttid,
2561 get_printable_name_of_ttrace_event (tstate.tts_event));
2562
2563 if (tstate.tts_event == TTEVT_SIGNAL
2564 && 5 == tstate.tts_u.tts_signal.tts_signo)
2565 {
2566 CORE_ADDR pc_val;
2567
2568 pc_val = get_raw_pc (ttid);
2569
2570 if (pc_val > 0)
2571 printf (" breakpoint at 0x%x\n", pc_val);
2572 else
2573 printf (" bpt, can't fetch pc.\n");
2574 }
2575 else
2576 printf ("\n");
2577 }
2578 #endif
2579
2580 ttid = get_process_next_stopped_thread_id (real_pid, &tstate);
2581 }
2582
2583 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG )
2584 if (debug_on)
2585 if (events_left > 0)
2586 printf ("There are thus %d pending events\n", events_left);
2587 #endif
2588
2589 return events_left;
2590 }
2591
2592 /* This function is provided as a sop to clients that are calling
2593 * ptrace_wait to wait for a process to stop. (see the
2594 * implementation of child_wait.) Return value is the pid for
2595 * the event that ended the wait.
2596 *
2597 * Note: used by core gdb and so uses the pseudo-pid (really tid).
2598 */
2599 ptid_t
2600 ptrace_wait (ptid_t ptid, int *status)
2601 {
2602 ttstate_t tsp;
2603 int ttwait_return;
2604 int real_pid;
2605 ttstate_t state;
2606 lwpid_t real_tid;
2607 int return_pid;
2608
2609 /* The ptrace implementation of this also ignores pid.
2610 */
2611 *status = 0;
2612
2613 ttwait_return = call_ttrace_wait (0, TTRACE_WAITOK, &tsp, sizeof (tsp));
2614 if (ttwait_return < 0)
2615 {
2616 /* ??rehrauer: It appears that if our inferior exits and we
2617 haven't asked for exit events, that we're not getting any
2618 indication save a negative return from ttrace_wait and an
2619 errno set to ESRCH?
2620 */
2621 if (errno == ESRCH)
2622 {
2623 *status = 0; /* WIFEXITED */
2624 return inferior_ptid;
2625 }
2626
2627 warning ("Call of ttrace_wait returned with errno %d.",
2628 errno);
2629 *status = ttwait_return;
2630 return inferior_ptid;
2631 }
2632
2633 real_pid = tsp.tts_pid;
2634 real_tid = tsp.tts_lwpid;
2635
2636 /* One complication is that the "tts_event" structure has
2637 * a set of flags, and more than one can be set. So we
2638 * either have to force an order (as we do here), or handle
2639 * more than one flag at a time.
2640 */
2641 if (tsp.tts_event & TTEVT_LWP_CREATE)
2642 {
2643
2644 /* Unlike what you might expect, this event is reported in
2645 * the _creating_ thread, and the _created_ thread (whose tid
2646 * we have) is still running. So we have to stop it. This
2647 * has already been done in "call_ttrace_wait", but should we
2648 * ever abandon the "stop-the-world" model, here's the command
2649 * to use:
2650 *
2651 * call_ttrace( TT_LWP_STOP, real_tid, TT_NIL, TT_NIL, TT_NIL );
2652 *
2653 * Note that this would depend on being called _after_ "add_tthread"
2654 * below for the tid-to-pid translation to be done in "call_ttrace".
2655 */
2656
2657 #ifdef THREAD_DEBUG
2658 if (debug_on)
2659 printf ("New thread: pid %d, tid %d, creator tid %d\n",
2660 real_pid, tsp.tts_u.tts_thread.tts_target_lwpid,
2661 real_tid);
2662 #endif
2663
2664 /* Now we have to return the tid of the created thread, not
2665 * the creating thread, or "wait_for_inferior" won't know we
2666 * have a new "process" (thread). Plus we should record it
2667 * right, too.
2668 */
2669 real_tid = tsp.tts_u.tts_thread.tts_target_lwpid;
2670
2671 add_tthread (real_pid, real_tid);
2672 }
2673
2674 else if ((tsp.tts_event & TTEVT_LWP_TERMINATE)
2675 || (tsp.tts_event & TTEVT_LWP_EXIT))
2676 {
2677
2678 #ifdef THREAD_DEBUG
2679 if (debug_on)
2680 printf ("Thread dies: %d\n", real_tid);
2681 #endif
2682
2683 del_tthread (real_tid);
2684 }
2685
2686 else if (tsp.tts_event & TTEVT_EXEC)
2687 {
2688
2689 #ifdef THREAD_DEBUG
2690 if (debug_on)
2691 printf ("Pid %d has zero'th thread %d; inferior pid is %d\n",
2692 real_pid, real_tid, PIDGET (inferior_ptid));
2693 #endif
2694
2695 add_tthread (real_pid, real_tid);
2696 }
2697
2698 #ifdef THREAD_DEBUG
2699 else if (debug_on)
2700 {
2701 printf ("Process-level event %s, using tid %d\n",
2702 get_printable_name_of_ttrace_event (tsp.tts_event),
2703 real_tid);
2704
2705 /* OK to do this, as "add_tthread" won't add
2706 * duplicate entries. Also OK not to do it,
2707 * as this event isn't one which can change the
2708 * thread state.
2709 */
2710 add_tthread (real_pid, real_tid);
2711 }
2712 #endif
2713
2714
2715 /* How many events are left to report later?
2716 * In a non-stop-the-world model, this isn't needed.
2717 *
2718 * Note that it's not always safe to query the thread state of a process,
2719 * which is what count_unhandled_events does. (If unsafe, we're left with
2720 * no other resort than to assume that no more events remain...)
2721 */
2722 if (can_touch_threads_of_process (real_pid, tsp.tts_event))
2723 more_events_left = count_unhandled_events (real_pid, real_tid);
2724
2725 else
2726 {
2727 if (more_events_left > 0)
2728 warning ("Vfork or fork causing loss of %d buffered events.",
2729 more_events_left);
2730
2731 more_events_left = 0;
2732 }
2733
2734 /* Attempt to translate the ttrace_wait-returned status into the
2735 ptrace equivalent.
2736
2737 ??rehrauer: This is somewhat fragile. We really ought to rewrite
2738 clients that expect to pick apart a ptrace wait status, to use
2739 something a little more abstract.
2740 */
2741 if ((tsp.tts_event & TTEVT_EXEC)
2742 || (tsp.tts_event & TTEVT_FORK)
2743 || (tsp.tts_event & TTEVT_VFORK))
2744 {
2745 /* Forks come in pairs (parent and child), so core gdb
2746 * will do two waits. Be ready to notice this.
2747 */
2748 if (tsp.tts_event & TTEVT_FORK)
2749 {
2750 process_state = FORKING;
2751
2752 #ifdef WAIT_BUFFER_DEBUG
2753 if (debug_on)
2754 printf ("Process set to FORKING\n");
2755 #endif
2756 }
2757 else if (tsp.tts_event & TTEVT_VFORK)
2758 {
2759 process_state = VFORKING;
2760
2761 #ifdef WAIT_BUFFER_DEBUG
2762 if (debug_on)
2763 printf ("Process set to VFORKING\n");
2764 #endif
2765 }
2766
2767 /* Make an exec or fork look like a breakpoint. Definitely a hack,
2768 but I don't think non HP-UX-specific clients really carefully
2769 inspect the first events they get after inferior startup, so
2770 it probably almost doesn't matter what we claim this is.
2771 */
2772
2773 #ifdef THREAD_DEBUG
2774 if (debug_on)
2775 printf ("..a process 'event'\n");
2776 #endif
2777
2778 /* Also make fork and exec events look like bpts, so they can be caught.
2779 */
2780 *status = 0177 | (_SIGTRAP << 8);
2781 }
2782
2783 /* Special-cases: We ask for syscall entry and exit events to implement
2784 "fast" (aka "hardware") watchpoints.
2785
2786 When we get a syscall entry, we want to disable page-protections,
2787 and resume the inferior; this isn't an event we wish for
2788 wait_for_inferior to see. Note that we must resume ONLY the
2789 thread that reported the syscall entry; we don't want to allow
2790 other threads to run with the page protections off, as they might
2791 then be able to write to watch memory without it being caught.
2792
2793 When we get a syscall exit, we want to reenable page-protections,
2794 but we don't want to resume the inferior; this is an event we wish
2795 wait_for_inferior to see. Make it look like the signal we normally
2796 get for a single-step completion. This should cause wait_for_inferior
2797 to evaluate whether any watchpoint triggered.
2798
2799 Or rather, that's what we'd LIKE to do for syscall exit; we can't,
2800 due to some HP-UX "features". Some syscalls have problems with
2801 write-protections on some pages, and some syscalls seem to have
2802 pending writes to those pages at the time we're getting the return
2803 event. So, we'll single-step the inferior to get out of the syscall,
2804 and then reenable protections.
2805
2806 Note that we're intentionally allowing the syscall exit case to
2807 fall through into the succeeding cases, as sometimes we single-
2808 step out of one syscall only to immediately enter another...
2809 */
2810 else if ((tsp.tts_event & TTEVT_SYSCALL_ENTRY)
2811 || (tsp.tts_event & TTEVT_SYSCALL_RETURN))
2812 {
2813 /* Make a syscall event look like a breakpoint. Same comments
2814 as for exec & fork events.
2815 */
2816 #ifdef THREAD_DEBUG
2817 if (debug_on)
2818 printf ("..a syscall 'event'\n");
2819 #endif
2820
2821 /* Also make syscall events look like bpts, so they can be caught.
2822 */
2823 *status = 0177 | (_SIGTRAP << 8);
2824 }
2825
2826 else if ((tsp.tts_event & TTEVT_LWP_CREATE)
2827 || (tsp.tts_event & TTEVT_LWP_TERMINATE)
2828 || (tsp.tts_event & TTEVT_LWP_EXIT))
2829 {
2830 /* Make a thread event look like a breakpoint. Same comments
2831 * as for exec & fork events.
2832 */
2833 #ifdef THREAD_DEBUG
2834 if (debug_on)
2835 printf ("..a thread 'event'\n");
2836 #endif
2837
2838 /* Also make thread events look like bpts, so they can be caught.
2839 */
2840 *status = 0177 | (_SIGTRAP << 8);
2841 }
2842
2843 else if ((tsp.tts_event & TTEVT_EXIT))
2844 { /* WIFEXITED */
2845
2846 #ifdef THREAD_DEBUG
2847 if (debug_on)
2848 printf ("..an exit\n");
2849 #endif
2850
2851 /* Prevent rest of gdb from thinking this is
2852 * a new thread if for some reason it's never
2853 * seen the main thread before.
2854 */
2855 inferior_ptid = pid_to_ptid (map_to_gdb_tid (real_tid)); /* HACK, FIX */
2856
2857 *status = 0 | (tsp.tts_u.tts_exit.tts_exitcode);
2858 }
2859
2860 else if (tsp.tts_event & TTEVT_SIGNAL)
2861 { /* WIFSTOPPED */
2862 #ifdef THREAD_DEBUG
2863 if (debug_on)
2864 printf ("..a signal, %d\n", tsp.tts_u.tts_signal.tts_signo);
2865 #endif
2866
2867 *status = 0177 | (tsp.tts_u.tts_signal.tts_signo << 8);
2868 }
2869
2870 else
2871 { /* !WIFSTOPPED */
2872
2873 /* This means the process or thread terminated. But we should've
2874 caught an explicit exit/termination above. So warn (this is
2875 really an internal error) and claim the process or thread
2876 terminated with a SIGTRAP.
2877 */
2878
2879 warning ("process_wait: unknown process state");
2880
2881 #ifdef THREAD_DEBUG
2882 if (debug_on)
2883 printf ("Process-level event %s, using tid %d\n",
2884 get_printable_name_of_ttrace_event (tsp.tts_event),
2885 real_tid);
2886 #endif
2887
2888 *status = _SIGTRAP;
2889 }
2890
2891 target_post_wait (tsp.tts_pid, *status);
2892
2893
2894 #ifdef THREAD_DEBUG
2895 if (debug_on)
2896 printf ("Done waiting, pid is %d, tid %d\n", real_pid, real_tid);
2897 #endif
2898
2899 /* All code external to this module uses the tid, but calls
2900 * it "pid". There's some tweaking so that the outside sees
2901 * the first thread as having the same number as the starting
2902 * pid.
2903 */
2904 return_pid = map_to_gdb_tid (real_tid);
2905
2906 /* Remember this for later use in "hppa_prepare_to_proceed".
2907 */
2908 old_gdb_pid = PIDGET (inferior_ptid);
2909 reported_pid = return_pid;
2910 reported_bpt = ((tsp.tts_event & TTEVT_SIGNAL) && (5 == tsp.tts_u.tts_signal.tts_signo));
2911
2912 if (real_tid == 0 || return_pid == 0)
2913 {
2914 warning ("Internal error: process-wait failed.");
2915 }
2916
2917 return pid_to_ptid (return_pid);
2918 }
2919 \f
2920
2921 /* This function causes the caller's process to be traced by its
2922 parent. This is intended to be called after GDB forks itself,
2923 and before the child execs the target. Despite the name, it
2924 is called by the child.
2925
2926 Note that HP-UX ttrace is rather funky in how this is done.
2927 If the parent wants to get the initial exec event of a child,
2928 it must set the ttrace event mask of the child to include execs.
2929 (The child cannot do this itself.) This must be done after the
2930 child is forked, but before it execs.
2931
2932 To coordinate the parent and child, we implement a semaphore using
2933 pipes. After SETTRC'ing itself, the child tells the parent that
2934 it is now traceable by the parent, and waits for the parent's
2935 acknowledgement. The parent can then set the child's event mask,
2936 and notify the child that it can now exec.
2937
2938 (The acknowledgement by parent happens as a result of a call to
2939 child_acknowledge_created_inferior.)
2940 */
2941 int
2942 parent_attach_all (void)
2943 {
2944 int tt_status;
2945
2946 /* We need a memory home for a constant, to pass it to ttrace.
2947 The value of the constant is arbitrary, so long as both
2948 parent and child use the same value. Might as well use the
2949 "magic" constant provided by ttrace...
2950 */
2951 uint64_t tc_magic_child = TT_VERSION;
2952 uint64_t tc_magic_parent = 0;
2953
2954 tt_status = call_real_ttrace (
2955 TT_PROC_SETTRC,
2956 (int) TT_NIL,
2957 (lwpid_t) TT_NIL,
2958 TT_NIL,
2959 (TTRACE_ARG_TYPE) TT_VERSION,
2960 TT_NIL);
2961
2962 if (tt_status < 0)
2963 return tt_status;
2964
2965 /* Notify the parent that we're potentially ready to exec(). */
2966 write (startup_semaphore.child_channel[SEM_TALK],
2967 &tc_magic_child,
2968 sizeof (tc_magic_child));
2969
2970 /* Wait for acknowledgement from the parent. */
2971 read (startup_semaphore.parent_channel[SEM_LISTEN],
2972 &tc_magic_parent,
2973 sizeof (tc_magic_parent));
2974
2975 if (tc_magic_child != tc_magic_parent)
2976 warning ("mismatched semaphore magic");
2977
2978 /* Discard our copy of the semaphore. */
2979 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
2980 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
2981 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
2982 (void) close (startup_semaphore.child_channel[SEM_TALK]);
2983
2984 return tt_status;
2985 }
2986
2987 /* Despite being file-local, this routine is dealing with
2988 * actual process IDs, not thread ids. That's because it's
2989 * called before the first "wait" call, and there's no map
2990 * yet from tids to pids.
2991 *
2992 * When it is called, a forked child is running, but waiting on
2993 * the semaphore. If you stop the child and re-start it,
2994 * things get confused, so don't do that! An attached child is
2995 * stopped.
2996 *
2997 * Since this is called after either attach or run, we
2998 * have to be the common part of both.
2999 */
3000 static void
3001 require_notification_of_events (int real_pid)
3002 {
3003 int tt_status;
3004 ttevent_t notifiable_events;
3005
3006 lwpid_t tid;
3007 ttstate_t thread_state;
3008
3009 #ifdef THREAD_DEBUG
3010 if (debug_on)
3011 printf ("Require notif, pid is %d\n", real_pid);
3012 #endif
3013
3014 /* Temporary HACK: tell inftarg.c/child_wait to not
3015 * loop until pids are the same.
3016 */
3017 not_same_real_pid = 0;
3018
3019 sigemptyset (&notifiable_events.tte_signals);
3020 notifiable_events.tte_opts = TTEO_NONE;
3021
3022 /* This ensures that forked children inherit their parent's
3023 * event mask, which we're setting here.
3024 *
3025 * NOTE: if you debug gdb with itself, then the ultimate
3026 * debuggee gets flags set by the outermost gdb, as
3027 * a child of a child will still inherit.
3028 */
3029 notifiable_events.tte_opts |= TTEO_PROC_INHERIT;
3030
3031 notifiable_events.tte_events = TTEVT_DEFAULT;
3032 notifiable_events.tte_events |= TTEVT_SIGNAL;
3033 notifiable_events.tte_events |= TTEVT_EXEC;
3034 notifiable_events.tte_events |= TTEVT_EXIT;
3035 notifiable_events.tte_events |= TTEVT_FORK;
3036 notifiable_events.tte_events |= TTEVT_VFORK;
3037 notifiable_events.tte_events |= TTEVT_LWP_CREATE;
3038 notifiable_events.tte_events |= TTEVT_LWP_EXIT;
3039 notifiable_events.tte_events |= TTEVT_LWP_TERMINATE;
3040
3041 tt_status = call_real_ttrace (
3042 TT_PROC_SET_EVENT_MASK,
3043 real_pid,
3044 (lwpid_t) TT_NIL,
3045 (TTRACE_ARG_TYPE) & notifiable_events,
3046 (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3047 TT_NIL);
3048 }
3049
3050 static void
3051 require_notification_of_exec_events (int real_pid)
3052 {
3053 int tt_status;
3054 ttevent_t notifiable_events;
3055
3056 lwpid_t tid;
3057 ttstate_t thread_state;
3058
3059 #ifdef THREAD_DEBUG
3060 if (debug_on)
3061 printf ("Require notif, pid is %d\n", real_pid);
3062 #endif
3063
3064 /* Temporary HACK: tell inftarg.c/child_wait to not
3065 * loop until pids are the same.
3066 */
3067 not_same_real_pid = 0;
3068
3069 sigemptyset (&notifiable_events.tte_signals);
3070 notifiable_events.tte_opts = TTEO_NOSTRCCHLD;
3071
3072 /* This ensures that forked children don't inherit their parent's
3073 * event mask, which we're setting here.
3074 */
3075 notifiable_events.tte_opts &= ~TTEO_PROC_INHERIT;
3076
3077 notifiable_events.tte_events = TTEVT_DEFAULT;
3078 notifiable_events.tte_events |= TTEVT_EXEC;
3079 notifiable_events.tte_events |= TTEVT_EXIT;
3080
3081 tt_status = call_real_ttrace (
3082 TT_PROC_SET_EVENT_MASK,
3083 real_pid,
3084 (lwpid_t) TT_NIL,
3085 (TTRACE_ARG_TYPE) & notifiable_events,
3086 (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3087 TT_NIL);
3088 }
3089 \f
3090
3091 /* This function is called by the parent process, with pid being the
3092 * ID of the child process, after the debugger has forked.
3093 */
3094 void
3095 child_acknowledge_created_inferior (int pid)
3096 {
3097 /* We need a memory home for a constant, to pass it to ttrace.
3098 The value of the constant is arbitrary, so long as both
3099 parent and child use the same value. Might as well use the
3100 "magic" constant provided by ttrace...
3101 */
3102 uint64_t tc_magic_parent = TT_VERSION;
3103 uint64_t tc_magic_child = 0;
3104
3105 /* Wait for the child to tell us that it has forked. */
3106 read (startup_semaphore.child_channel[SEM_LISTEN],
3107 &tc_magic_child,
3108 sizeof (tc_magic_child));
3109
3110 /* Clear thread info now. We'd like to do this in
3111 * "require...", but that messes up attach.
3112 */
3113 clear_thread_info ();
3114
3115 /* Tell the "rest of gdb" that the initial thread exists.
3116 * This isn't really a hack. Other thread-based versions
3117 * of gdb (e.g. gnu-nat.c) seem to do the same thing.
3118 *
3119 * Q: Why don't we also add this thread to the local
3120 * list via "add_tthread"?
3121 *
3122 * A: Because we don't know the tid, and can't stop the
3123 * the process safely to ask what it is. Anyway, we'll
3124 * add it when it gets the EXEC event.
3125 */
3126 add_thread (pid); /* in thread.c */
3127
3128 /* We can now set the child's ttrace event mask.
3129 */
3130 require_notification_of_exec_events (pid);
3131
3132 /* Tell ourselves that the process is running.
3133 */
3134 process_state = RUNNING;
3135
3136 /* Notify the child that it can exec. */
3137 write (startup_semaphore.parent_channel[SEM_TALK],
3138 &tc_magic_parent,
3139 sizeof (tc_magic_parent));
3140
3141 /* Discard our copy of the semaphore. */
3142 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
3143 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
3144 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
3145 (void) close (startup_semaphore.child_channel[SEM_TALK]);
3146 }
3147
3148
3149 /*
3150 * arrange for notification of all events by
3151 * calling require_notification_of_events.
3152 */
3153 void
3154 child_post_startup_inferior (ptid_t ptid)
3155 {
3156 require_notification_of_events (PIDGET (ptid));
3157 }
3158
3159 /* From here on, we should expect tids rather than pids.
3160 */
3161 static void
3162 hppa_enable_catch_fork (int tid)
3163 {
3164 int tt_status;
3165 ttevent_t ttrace_events;
3166
3167 /* Get the set of events that are currently enabled.
3168 */
3169 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3170 tid,
3171 (TTRACE_ARG_TYPE) & ttrace_events,
3172 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3173 TT_NIL);
3174 if (errno)
3175 perror_with_name ("ttrace");
3176
3177 /* Add forks to that set. */
3178 ttrace_events.tte_events |= TTEVT_FORK;
3179
3180 #ifdef THREAD_DEBUG
3181 if (debug_on)
3182 printf ("enable fork, tid is %d\n", tid);
3183 #endif
3184
3185 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3186 tid,
3187 (TTRACE_ARG_TYPE) & ttrace_events,
3188 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3189 TT_NIL);
3190 if (errno)
3191 perror_with_name ("ttrace");
3192 }
3193
3194
3195 static void
3196 hppa_disable_catch_fork (int tid)
3197 {
3198 int tt_status;
3199 ttevent_t ttrace_events;
3200
3201 /* Get the set of events that are currently enabled.
3202 */
3203 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3204 tid,
3205 (TTRACE_ARG_TYPE) & ttrace_events,
3206 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3207 TT_NIL);
3208
3209 if (errno)
3210 perror_with_name ("ttrace");
3211
3212 /* Remove forks from that set. */
3213 ttrace_events.tte_events &= ~TTEVT_FORK;
3214
3215 #ifdef THREAD_DEBUG
3216 if (debug_on)
3217 printf ("disable fork, tid is %d\n", tid);
3218 #endif
3219
3220 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3221 tid,
3222 (TTRACE_ARG_TYPE) & ttrace_events,
3223 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3224 TT_NIL);
3225
3226 if (errno)
3227 perror_with_name ("ttrace");
3228 }
3229
3230
3231 #if defined(CHILD_INSERT_FORK_CATCHPOINT)
3232 int
3233 child_insert_fork_catchpoint (int tid)
3234 {
3235 /* Enable reporting of fork events from the kernel. */
3236 /* ??rehrauer: For the moment, we're always enabling these events,
3237 and just ignoring them if there's no catchpoint to catch them.
3238 */
3239 return 0;
3240 }
3241 #endif
3242
3243
3244 #if defined(CHILD_REMOVE_FORK_CATCHPOINT)
3245 int
3246 child_remove_fork_catchpoint (int tid)
3247 {
3248 /* Disable reporting of fork events from the kernel. */
3249 /* ??rehrauer: For the moment, we're always enabling these events,
3250 and just ignoring them if there's no catchpoint to catch them.
3251 */
3252 return 0;
3253 }
3254 #endif
3255
3256
3257 static void
3258 hppa_enable_catch_vfork (int tid)
3259 {
3260 int tt_status;
3261 ttevent_t ttrace_events;
3262
3263 /* Get the set of events that are currently enabled.
3264 */
3265 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3266 tid,
3267 (TTRACE_ARG_TYPE) & ttrace_events,
3268 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3269 TT_NIL);
3270
3271 if (errno)
3272 perror_with_name ("ttrace");
3273
3274 /* Add vforks to that set. */
3275 ttrace_events.tte_events |= TTEVT_VFORK;
3276
3277 #ifdef THREAD_DEBUG
3278 if (debug_on)
3279 printf ("enable vfork, tid is %d\n", tid);
3280 #endif
3281
3282 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3283 tid,
3284 (TTRACE_ARG_TYPE) & ttrace_events,
3285 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3286 TT_NIL);
3287
3288 if (errno)
3289 perror_with_name ("ttrace");
3290 }
3291
3292
3293 static void
3294 hppa_disable_catch_vfork (int tid)
3295 {
3296 int tt_status;
3297 ttevent_t ttrace_events;
3298
3299 /* Get the set of events that are currently enabled. */
3300 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3301 tid,
3302 (TTRACE_ARG_TYPE) & ttrace_events,
3303 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3304 TT_NIL);
3305
3306 if (errno)
3307 perror_with_name ("ttrace");
3308
3309 /* Remove vforks from that set. */
3310 ttrace_events.tte_events &= ~TTEVT_VFORK;
3311
3312 #ifdef THREAD_DEBUG
3313 if (debug_on)
3314 printf ("disable vfork, tid is %d\n", tid);
3315 #endif
3316 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3317 tid,
3318 (TTRACE_ARG_TYPE) & ttrace_events,
3319 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3320 TT_NIL);
3321
3322 if (errno)
3323 perror_with_name ("ttrace");
3324 }
3325
3326
3327 #if defined(CHILD_INSERT_VFORK_CATCHPOINT)
3328 int
3329 child_insert_vfork_catchpoint (int tid)
3330 {
3331 /* Enable reporting of vfork events from the kernel. */
3332 /* ??rehrauer: For the moment, we're always enabling these events,
3333 and just ignoring them if there's no catchpoint to catch them.
3334 */
3335 return 0;
3336 }
3337 #endif
3338
3339
3340 #if defined(CHILD_REMOVE_VFORK_CATCHPOINT)
3341 int
3342 child_remove_vfork_catchpoint (int tid)
3343 {
3344 /* Disable reporting of vfork events from the kernel. */
3345 /* ??rehrauer: For the moment, we're always enabling these events,
3346 and just ignoring them if there's no catchpoint to catch them.
3347 */
3348 return 0;
3349 }
3350 #endif
3351
3352 #if defined(CHILD_HAS_FORKED)
3353
3354 /* Q: Do we need to map the returned process ID to a thread ID?
3355
3356 * A: I don't think so--here we want a _real_ pid. Any later
3357 * operations will call "require_notification_of_events" and
3358 * start the mapping.
3359 */
3360 int
3361 child_has_forked (int tid, int *childpid)
3362 {
3363 int tt_status;
3364 ttstate_t ttrace_state;
3365 thread_info *tinfo;
3366
3367 /* Do we have cached thread state that we can consult? If so, use it. */
3368 tinfo = find_thread_info (map_from_gdb_tid (tid));
3369 if (tinfo != NULL)
3370 {
3371 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3372 }
3373
3374 /* Nope, must read the thread's current state */
3375 else
3376 {
3377 tt_status = call_ttrace (TT_LWP_GET_STATE,
3378 tid,
3379 (TTRACE_ARG_TYPE) & ttrace_state,
3380 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3381 TT_NIL);
3382
3383 if (errno)
3384 perror_with_name ("ttrace");
3385
3386 if (tt_status < 0)
3387 return 0;
3388 }
3389
3390 if (ttrace_state.tts_event & TTEVT_FORK)
3391 {
3392 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3393 return 1;
3394 }
3395
3396 return 0;
3397 }
3398 #endif
3399
3400
3401 #if defined(CHILD_HAS_VFORKED)
3402
3403 /* See child_has_forked for pid discussion.
3404 */
3405 int
3406 child_has_vforked (int tid, int *childpid)
3407 {
3408 int tt_status;
3409 ttstate_t ttrace_state;
3410 thread_info *tinfo;
3411
3412 /* Do we have cached thread state that we can consult? If so, use it. */
3413 tinfo = find_thread_info (map_from_gdb_tid (tid));
3414 if (tinfo != NULL)
3415 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3416
3417 /* Nope, must read the thread's current state */
3418 else
3419 {
3420 tt_status = call_ttrace (TT_LWP_GET_STATE,
3421 tid,
3422 (TTRACE_ARG_TYPE) & ttrace_state,
3423 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3424 TT_NIL);
3425
3426 if (errno)
3427 perror_with_name ("ttrace");
3428
3429 if (tt_status < 0)
3430 return 0;
3431 }
3432
3433 if (ttrace_state.tts_event & TTEVT_VFORK)
3434 {
3435 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3436 return 1;
3437 }
3438
3439 return 0;
3440 }
3441 #endif
3442
3443
3444 #if defined(CHILD_CAN_FOLLOW_VFORK_PRIOR_TO_EXEC)
3445 int
3446 child_can_follow_vfork_prior_to_exec (void)
3447 {
3448 /* ttrace does allow this.
3449
3450 ??rehrauer: However, I had major-league problems trying to
3451 convince wait_for_inferior to handle that case. Perhaps when
3452 it is rewritten to grok multiple processes in an explicit way...
3453 */
3454 return 0;
3455 }
3456 #endif
3457
3458
3459 #if defined(CHILD_INSERT_EXEC_CATCHPOINT)
3460 int
3461 child_insert_exec_catchpoint (int tid)
3462 {
3463 /* Enable reporting of exec events from the kernel. */
3464 /* ??rehrauer: For the moment, we're always enabling these events,
3465 and just ignoring them if there's no catchpoint to catch them.
3466 */
3467 return 0;
3468 }
3469 #endif
3470
3471
3472 #if defined(CHILD_REMOVE_EXEC_CATCHPOINT)
3473 int
3474 child_remove_exec_catchpoint (int tid)
3475 {
3476 /* Disable reporting of execevents from the kernel. */
3477 /* ??rehrauer: For the moment, we're always enabling these events,
3478 and just ignoring them if there's no catchpoint to catch them.
3479 */
3480 return 0;
3481 }
3482 #endif
3483
3484
3485 #if defined(CHILD_HAS_EXECD)
3486 int
3487 child_has_execd (int tid, char **execd_pathname)
3488 {
3489 int tt_status;
3490 ttstate_t ttrace_state;
3491 thread_info *tinfo;
3492
3493 /* Do we have cached thread state that we can consult? If so, use it. */
3494 tinfo = find_thread_info (map_from_gdb_tid (tid));
3495 if (tinfo != NULL)
3496 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3497
3498 /* Nope, must read the thread's current state */
3499 else
3500 {
3501 tt_status = call_ttrace (TT_LWP_GET_STATE,
3502 tid,
3503 (TTRACE_ARG_TYPE) & ttrace_state,
3504 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3505 TT_NIL);
3506
3507 if (errno)
3508 perror_with_name ("ttrace");
3509
3510 if (tt_status < 0)
3511 return 0;
3512 }
3513
3514 if (ttrace_state.tts_event & TTEVT_EXEC)
3515 {
3516 /* See child_pid_to_exec_file in this file: this is a macro.
3517 */
3518 char *exec_file = target_pid_to_exec_file (tid);
3519
3520 *execd_pathname = savestring (exec_file, strlen (exec_file));
3521 return 1;
3522 }
3523
3524 return 0;
3525 }
3526 #endif
3527
3528
3529 #if defined(CHILD_HAS_SYSCALL_EVENT)
3530 int
3531 child_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id)
3532 {
3533 int tt_status;
3534 ttstate_t ttrace_state;
3535 thread_info *tinfo;
3536
3537 /* Do we have cached thread state that we can consult? If so, use it. */
3538 tinfo = find_thread_info (map_from_gdb_tid (pid));
3539 if (tinfo != NULL)
3540 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3541
3542 /* Nope, must read the thread's current state */
3543 else
3544 {
3545 tt_status = call_ttrace (TT_LWP_GET_STATE,
3546 pid,
3547 (TTRACE_ARG_TYPE) & ttrace_state,
3548 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3549 TT_NIL);
3550
3551 if (errno)
3552 perror_with_name ("ttrace");
3553
3554 if (tt_status < 0)
3555 return 0;
3556 }
3557
3558 *kind = TARGET_WAITKIND_SPURIOUS; /* Until proven otherwise... */
3559 *syscall_id = -1;
3560
3561 if (ttrace_state.tts_event & TTEVT_SYSCALL_ENTRY)
3562 *kind = TARGET_WAITKIND_SYSCALL_ENTRY;
3563 else if (ttrace_state.tts_event & TTEVT_SYSCALL_RETURN)
3564 *kind = TARGET_WAITKIND_SYSCALL_RETURN;
3565 else
3566 return 0;
3567
3568 *syscall_id = ttrace_state.tts_scno;
3569 return 1;
3570 }
3571 #endif
3572 \f
3573
3574
3575 #if defined(CHILD_THREAD_ALIVE)
3576
3577 /* Check to see if the given thread is alive.
3578
3579 * We'll trust the thread list, as the more correct
3580 * approach of stopping the process and spinning down
3581 * the OS's thread list is _very_ expensive.
3582 *
3583 * May need a FIXME for that reason.
3584 */
3585 int
3586 child_thread_alive (ptid_t ptid)
3587 {
3588 lwpid_t gdp_tid = PIDGET (ptid);
3589 lwpid_t tid;
3590
3591 /* This spins down the lists twice.
3592 * Possible peformance improvement here!
3593 */
3594 tid = map_from_gdb_tid (gdb_tid);
3595 return !is_terminated (tid);
3596 }
3597
3598 #endif
3599 \f
3600
3601
3602 /* This function attempts to read the specified number of bytes from the
3603 save_state_t that is our view into the hardware registers, starting at
3604 ss_offset, and ending at ss_offset + sizeof_buf - 1
3605
3606 If this function succeeds, it deposits the fetched bytes into buf,
3607 and returns 0.
3608
3609 If it fails, it returns a negative result. The contents of buf are
3610 undefined it this function fails.
3611 */
3612 int
3613 read_from_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3614 int sizeof_buf)
3615 {
3616 int tt_status;
3617 register_value_t register_value = 0;
3618
3619 tt_status = call_ttrace (TT_LWP_RUREGS,
3620 tid,
3621 ss_offset,
3622 (TTRACE_ARG_TYPE) sizeof_buf,
3623 (TTRACE_ARG_TYPE) buf);
3624
3625 if (tt_status == 1)
3626 /* Map ttrace's version of success to our version.
3627 * Sometime ttrace returns 0, but that's ok here.
3628 */
3629 return 0;
3630
3631 return tt_status;
3632 }
3633 \f
3634
3635 /* This function attempts to write the specified number of bytes to the
3636 save_state_t that is our view into the hardware registers, starting at
3637 ss_offset, and ending at ss_offset + sizeof_buf - 1
3638
3639 If this function succeeds, it deposits the bytes in buf, and returns 0.
3640
3641 If it fails, it returns a negative result. The contents of the save_state_t
3642 are undefined it this function fails.
3643 */
3644 int
3645 write_to_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3646 int sizeof_buf)
3647 {
3648 int tt_status;
3649 register_value_t register_value = 0;
3650
3651 tt_status = call_ttrace (TT_LWP_WUREGS,
3652 tid,
3653 ss_offset,
3654 (TTRACE_ARG_TYPE) sizeof_buf,
3655 (TTRACE_ARG_TYPE) buf);
3656 return tt_status;
3657 }
3658 \f
3659
3660 /* This function is a sop to the largeish number of direct calls
3661 to call_ptrace that exist in other files. Rather than create
3662 functions whose name abstracts away from ptrace, and change all
3663 the present callers of call_ptrace, we'll do the expedient (and
3664 perhaps only practical) thing.
3665
3666 Note HP-UX explicitly disallows a mix of ptrace & ttrace on a traced
3667 process. Thus, we must translate all ptrace requests into their
3668 process-specific, ttrace equivalents.
3669 */
3670 int
3671 call_ptrace (int pt_request, int gdb_tid, PTRACE_ARG3_TYPE addr, int data)
3672 {
3673 ttreq_t tt_request;
3674 TTRACE_ARG_TYPE tt_addr = (TTRACE_ARG_TYPE) addr;
3675 TTRACE_ARG_TYPE tt_data = (TTRACE_ARG_TYPE) data;
3676 TTRACE_ARG_TYPE tt_addr2 = TT_NIL;
3677 int tt_status;
3678 register_value_t register_value;
3679 int read_buf;
3680
3681 /* Perform the necessary argument translation. Note that some
3682 cases are funky enough in the ttrace realm that we handle them
3683 very specially.
3684 */
3685 switch (pt_request)
3686 {
3687 /* The following cases cannot conveniently be handled conveniently
3688 by merely adjusting the ptrace arguments and feeding into the
3689 generic call to ttrace at the bottom of this function.
3690
3691 Note that because all branches of this switch end in "return",
3692 there's no need for any "break" statements.
3693 */
3694 case PT_SETTRC:
3695 return parent_attach_all ();
3696
3697 case PT_RUREGS:
3698 tt_status = read_from_register_save_state (gdb_tid,
3699 tt_addr,
3700 &register_value,
3701 sizeof (register_value));
3702 if (tt_status < 0)
3703 return tt_status;
3704 return register_value;
3705
3706 case PT_WUREGS:
3707 register_value = (int) tt_data;
3708 tt_status = write_to_register_save_state (gdb_tid,
3709 tt_addr,
3710 &register_value,
3711 sizeof (register_value));
3712 return tt_status;
3713 break;
3714
3715 case PT_READ_I:
3716 tt_status = call_ttrace (TT_PROC_RDTEXT, /* Implicit 4-byte xfer becomes block-xfer. */
3717 gdb_tid,
3718 tt_addr,
3719 (TTRACE_ARG_TYPE) 4,
3720 (TTRACE_ARG_TYPE) & read_buf);
3721 if (tt_status < 0)
3722 return tt_status;
3723 return read_buf;
3724
3725 case PT_READ_D:
3726 tt_status = call_ttrace (TT_PROC_RDDATA, /* Implicit 4-byte xfer becomes block-xfer. */
3727 gdb_tid,
3728 tt_addr,
3729 (TTRACE_ARG_TYPE) 4,
3730 (TTRACE_ARG_TYPE) & read_buf);
3731 if (tt_status < 0)
3732 return tt_status;
3733 return read_buf;
3734
3735 case PT_ATTACH:
3736 tt_status = call_real_ttrace (TT_PROC_ATTACH,
3737 map_from_gdb_tid (gdb_tid),
3738 (lwpid_t) TT_NIL,
3739 tt_addr,
3740 (TTRACE_ARG_TYPE) TT_VERSION,
3741 tt_addr2);
3742 if (tt_status < 0)
3743 return tt_status;
3744 return tt_status;
3745
3746 /* The following cases are handled by merely adjusting the ptrace
3747 arguments and feeding into the generic call to ttrace.
3748 */
3749 case PT_DETACH:
3750 tt_request = TT_PROC_DETACH;
3751 break;
3752
3753 case PT_WRITE_I:
3754 tt_request = TT_PROC_WRTEXT; /* Translates 4-byte xfer to block-xfer. */
3755 tt_data = 4; /* This many bytes. */
3756 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */
3757 break;
3758
3759 case PT_WRITE_D:
3760 tt_request = TT_PROC_WRDATA; /* Translates 4-byte xfer to block-xfer. */
3761 tt_data = 4; /* This many bytes. */
3762 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */
3763 break;
3764
3765 case PT_RDTEXT:
3766 tt_request = TT_PROC_RDTEXT;
3767 break;
3768
3769 case PT_RDDATA:
3770 tt_request = TT_PROC_RDDATA;
3771 break;
3772
3773 case PT_WRTEXT:
3774 tt_request = TT_PROC_WRTEXT;
3775 break;
3776
3777 case PT_WRDATA:
3778 tt_request = TT_PROC_WRDATA;
3779 break;
3780
3781 case PT_CONTINUE:
3782 tt_request = TT_PROC_CONTINUE;
3783 break;
3784
3785 case PT_STEP:
3786 tt_request = TT_LWP_SINGLE; /* Should not be making this request? */
3787 break;
3788
3789 case PT_KILL:
3790 tt_request = TT_PROC_EXIT;
3791 break;
3792
3793 case PT_GET_PROCESS_PATHNAME:
3794 tt_request = TT_PROC_GET_PATHNAME;
3795 break;
3796
3797 default:
3798 tt_request = pt_request; /* Let ttrace be the one to complain. */
3799 break;
3800 }
3801
3802 return call_ttrace (tt_request,
3803 gdb_tid,
3804 tt_addr,
3805 tt_data,
3806 tt_addr2);
3807 }
3808
3809 /* Kill that pesky process!
3810 */
3811 void
3812 kill_inferior (void)
3813 {
3814 int tid;
3815 int wait_status;
3816 thread_info *t;
3817 thread_info **paranoia;
3818 int para_count, i;
3819
3820 if (PIDGET (inferior_ptid) == 0)
3821 return;
3822
3823 /* Walk the list of "threads", some of which are "pseudo threads",
3824 aka "processes". For each that is NOT inferior_ptid, stop it,
3825 and detach it.
3826
3827 You see, we may not have just a single process to kill. If we're
3828 restarting or quitting or detaching just after the inferior has
3829 forked, then we've actually two processes to clean up.
3830
3831 But we can't just call target_mourn_inferior() for each, since that
3832 zaps the target vector.
3833 */
3834
3835 paranoia = (thread_info **) xmalloc (thread_head.count *
3836 sizeof (thread_info *));
3837 para_count = 0;
3838
3839 t = thread_head.head;
3840 while (t)
3841 {
3842
3843 paranoia[para_count] = t;
3844 for (i = 0; i < para_count; i++)
3845 {
3846 if (t->next == paranoia[i])
3847 {
3848 warning ("Bad data in gdb's thread data; repairing.");
3849 t->next = 0;
3850 }
3851 }
3852 para_count++;
3853
3854 if (t->am_pseudo && (t->pid != PIDGET (inferior_ptid)))
3855 {
3856 /* TT_PROC_STOP doesn't require a subsequent ttrace_wait, as it
3857 * generates no event.
3858 */
3859 call_ttrace (TT_PROC_STOP,
3860 t->pid,
3861 TT_NIL,
3862 TT_NIL,
3863 TT_NIL);
3864
3865 call_ttrace (TT_PROC_DETACH,
3866 t->pid,
3867 TT_NIL,
3868 (TTRACE_ARG_TYPE) TARGET_SIGNAL_0,
3869 TT_NIL);
3870 }
3871 t = t->next;
3872 }
3873
3874 xfree (paranoia);
3875
3876 call_ttrace (TT_PROC_STOP,
3877 PIDGET (inferior_ptid),
3878 TT_NIL,
3879 TT_NIL,
3880 TT_NIL);
3881 target_mourn_inferior ();
3882 clear_thread_info ();
3883 }
3884
3885
3886 #ifndef CHILD_RESUME
3887
3888 /* Sanity check a thread about to be continued.
3889 */
3890 static void
3891 thread_dropping_event_check (thread_info *p)
3892 {
3893 if (!p->handled)
3894 {
3895 /*
3896 * This seems to happen when we "next" over a
3897 * "fork()" while following the parent. If it's
3898 * the FORK event, that's ok. If it's a SIGNAL
3899 * in the unfollowed child, that's ok to--but
3900 * how can we know that's what's going on?
3901 *
3902 * FIXME!
3903 */
3904 if (p->have_state)
3905 {
3906 if (p->last_stop_state.tts_event == TTEVT_FORK)
3907 {
3908 /* Ok */
3909 ;
3910 }
3911 else if (p->last_stop_state.tts_event == TTEVT_SIGNAL)
3912 {
3913 /* Ok, close eyes and let it happen.
3914 */
3915 ;
3916 }
3917 else
3918 {
3919 /* This shouldn't happen--we're dropping a
3920 * real event.
3921 */
3922 warning ("About to continue process %d, thread %d with unhandled event %s.",
3923 p->pid, p->tid,
3924 get_printable_name_of_ttrace_event (
3925 p->last_stop_state.tts_event));
3926
3927 #ifdef PARANOIA
3928 if (debug_on)
3929 print_tthread (p);
3930 #endif
3931 }
3932 }
3933 else
3934 {
3935 /* No saved state, have to assume it failed.
3936 */
3937 warning ("About to continue process %d, thread %d with unhandled event.",
3938 p->pid, p->tid);
3939 #ifdef PARANOIA
3940 if (debug_on)
3941 print_tthread (p);
3942 #endif
3943 }
3944 }
3945
3946 } /* thread_dropping_event_check */
3947
3948 /* Use a loop over the threads to continue all the threads but
3949 * the one specified, which is to be stepped.
3950 */
3951 static void
3952 threads_continue_all_but_one (lwpid_t gdb_tid, int signal)
3953 {
3954 thread_info *p;
3955 int thread_signal;
3956 lwpid_t real_tid;
3957 lwpid_t scan_tid;
3958 ttstate_t state;
3959 int real_pid;
3960
3961 #ifdef THREAD_DEBUG
3962 if (debug_on)
3963 printf ("Using loop over threads to step/resume with signals\n");
3964 #endif
3965
3966 /* First update the thread list.
3967 */
3968 set_all_unseen ();
3969 real_tid = map_from_gdb_tid (gdb_tid);
3970 real_pid = get_pid_for (real_tid);
3971
3972 scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
3973 while (0 != scan_tid)
3974 {
3975
3976 #ifdef THREAD_DEBUG
3977 /* FIX: later should check state is stopped;
3978 * state.tts_flags & TTS_STATEMASK == TTS_WASSUSPENDED
3979 */
3980 if (debug_on)
3981 if (state.tts_flags & TTS_STATEMASK != TTS_WASSUSPENDED)
3982 printf ("About to continue non-stopped thread %d\n", scan_tid);
3983 #endif
3984
3985 p = find_thread_info (scan_tid);
3986 if (NULL == p)
3987 {
3988 add_tthread (real_pid, scan_tid);
3989 p = find_thread_info (scan_tid);
3990
3991 /* This is either a newly-created thread or the
3992 * result of a fork; in either case there's no
3993 * actual event to worry about.
3994 */
3995 p->handled = 1;
3996
3997 if (state.tts_event != TTEVT_NONE)
3998 {
3999 /* Oops, do need to worry!
4000 */
4001 warning ("Unexpected thread with \"%s\" event.",
4002 get_printable_name_of_ttrace_event (state.tts_event));
4003 }
4004 }
4005 else if (scan_tid != p->tid)
4006 error ("Bad data in thread database.");
4007
4008 #ifdef THREAD_DEBUG
4009 if (debug_on)
4010 if (p->terminated)
4011 printf ("Why are we continuing a dead thread?\n");
4012 #endif
4013
4014 p->seen = 1;
4015
4016 scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
4017 }
4018
4019 /* Remove unseen threads.
4020 */
4021 update_thread_list ();
4022
4023 /* Now run down the thread list and continue or step.
4024 */
4025 for (p = thread_head.head; p; p = p->next)
4026 {
4027
4028 /* Sanity check.
4029 */
4030 thread_dropping_event_check (p);
4031
4032 /* Pass the correct signals along.
4033 */
4034 if (p->have_signal)
4035 {
4036 thread_signal = p->signal_value;
4037 p->have_signal = 0;
4038 }
4039 else
4040 thread_signal = 0;
4041
4042 if (p->tid != real_tid)
4043 {
4044 /*
4045 * Not the thread of interest, so continue it
4046 * as the user expects.
4047 */
4048 if (p->stepping_mode == DO_STEP)
4049 {
4050 /* Just step this thread.
4051 */
4052 call_ttrace (
4053 TT_LWP_SINGLE,
4054 p->tid,
4055 TT_USE_CURRENT_PC,
4056 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4057 TT_NIL);
4058 }
4059 else
4060 {
4061 /* Regular continue (default case).
4062 */
4063 call_ttrace (
4064 TT_LWP_CONTINUE,
4065 p->tid,
4066 TT_USE_CURRENT_PC,
4067 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4068 TT_NIL);
4069 }
4070 }
4071 else
4072 {
4073 /* Step the thread of interest.
4074 */
4075 call_ttrace (
4076 TT_LWP_SINGLE,
4077 real_tid,
4078 TT_USE_CURRENT_PC,
4079 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4080 TT_NIL);
4081 }
4082 } /* Loop over threads */
4083 } /* End threads_continue_all_but_one */
4084
4085 /* Use a loop over the threads to continue all the threads.
4086 * This is done when a signal must be sent to any of the threads.
4087 */
4088 static void
4089 threads_continue_all_with_signals (lwpid_t gdb_tid, int signal)
4090 {
4091 thread_info *p;
4092 int thread_signal;
4093 lwpid_t real_tid;
4094 lwpid_t scan_tid;
4095 ttstate_t state;
4096 int real_pid;
4097
4098 #ifdef THREAD_DEBUG
4099 if (debug_on)
4100 printf ("Using loop over threads to resume with signals\n");
4101 #endif
4102
4103 /* Scan and update thread list.
4104 */
4105 set_all_unseen ();
4106 real_tid = map_from_gdb_tid (gdb_tid);
4107 real_pid = get_pid_for (real_tid);
4108
4109 scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
4110 while (0 != scan_tid)
4111 {
4112
4113 #ifdef THREAD_DEBUG
4114 if (debug_on)
4115 if (state.tts_flags & TTS_STATEMASK != TTS_WASSUSPENDED)
4116 warning ("About to continue non-stopped thread %d\n", scan_tid);
4117 #endif
4118
4119 p = find_thread_info (scan_tid);
4120 if (NULL == p)
4121 {
4122 add_tthread (real_pid, scan_tid);
4123 p = find_thread_info (scan_tid);
4124
4125 /* This is either a newly-created thread or the
4126 * result of a fork; in either case there's no
4127 * actual event to worry about.
4128 */
4129 p->handled = 1;
4130
4131 if (state.tts_event != TTEVT_NONE)
4132 {
4133 /* Oops, do need to worry!
4134 */
4135 warning ("Unexpected thread with \"%s\" event.",
4136 get_printable_name_of_ttrace_event (state.tts_event));
4137 }
4138 }
4139
4140 #ifdef THREAD_DEBUG
4141 if (debug_on)
4142 if (p->terminated)
4143 printf ("Why are we continuing a dead thread? (1)\n");
4144 #endif
4145
4146 p->seen = 1;
4147
4148 scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
4149 }
4150
4151 /* Remove unseen threads from our list.
4152 */
4153 update_thread_list ();
4154
4155 /* Continue the threads.
4156 */
4157 for (p = thread_head.head; p; p = p->next)
4158 {
4159
4160 /* Sanity check.
4161 */
4162 thread_dropping_event_check (p);
4163
4164 /* Pass the correct signals along.
4165 */
4166 if (p->tid == real_tid)
4167 {
4168 thread_signal = signal;
4169 p->have_signal = 0;
4170 }
4171 else if (p->have_signal)
4172 {
4173 thread_signal = p->signal_value;
4174 p->have_signal = 0;
4175 }
4176 else
4177 thread_signal = 0;
4178
4179 if (p->stepping_mode == DO_STEP)
4180 {
4181 call_ttrace (
4182 TT_LWP_SINGLE,
4183 p->tid,
4184 TT_USE_CURRENT_PC,
4185 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4186 TT_NIL);
4187 }
4188 else
4189 {
4190 /* Continue this thread (default case).
4191 */
4192 call_ttrace (
4193 TT_LWP_CONTINUE,
4194 p->tid,
4195 TT_USE_CURRENT_PC,
4196 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4197 TT_NIL);
4198 }
4199 }
4200 } /* End threads_continue_all_with_signals */
4201
4202 /* Step one thread only.
4203 */
4204 static void
4205 thread_fake_step (lwpid_t tid, enum target_signal signal)
4206 {
4207 thread_info *p;
4208
4209 #ifdef THREAD_DEBUG
4210 if (debug_on)
4211 {
4212 printf ("Doing a fake-step over a bpt, etc. for %d\n", tid);
4213
4214 if (is_terminated (tid))
4215 printf ("Why are we continuing a dead thread? (4)\n");
4216 }
4217 #endif
4218
4219 if (doing_fake_step)
4220 warning ("Step while step already in progress.");
4221
4222 /* See if there's a saved signal value for this
4223 * thread to be passed on, but no current signal.
4224 */
4225 p = find_thread_info (tid);
4226 if (p != NULL)
4227 {
4228 if (p->have_signal && signal == TARGET_SIGNAL_0)
4229 {
4230 /* Pass on a saved signal.
4231 */
4232 signal = p->signal_value;
4233 }
4234
4235 p->have_signal = 0;
4236 }
4237
4238 if (!p->handled)
4239 warning ("Internal error: continuing unhandled thread.");
4240
4241 call_ttrace (TT_LWP_SINGLE,
4242 tid,
4243 TT_USE_CURRENT_PC,
4244 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4245 TT_NIL);
4246
4247 /* Do bookkeeping so "call_ttrace_wait" knows it has to wait
4248 * for this thread only, and clear any saved signal info.
4249 */
4250 doing_fake_step = 1;
4251 fake_step_tid = tid;
4252
4253 } /* End thread_fake_step */
4254
4255 /* Continue one thread when a signal must be sent to it.
4256 */
4257 static void
4258 threads_continue_one_with_signal (lwpid_t gdb_tid, int signal)
4259 {
4260 thread_info *p;
4261 lwpid_t real_tid;
4262 int real_pid;
4263
4264 #ifdef THREAD_DEBUG
4265 if (debug_on)
4266 printf ("Continuing one thread with a signal\n");
4267 #endif
4268
4269 real_tid = map_from_gdb_tid (gdb_tid);
4270 real_pid = get_pid_for (real_tid);
4271
4272 p = find_thread_info (real_tid);
4273 if (NULL == p)
4274 {
4275 add_tthread (real_pid, real_tid);
4276 }
4277
4278 #ifdef THREAD_DEBUG
4279 if (debug_on)
4280 if (p->terminated)
4281 printf ("Why are we continuing a dead thread? (2)\n");
4282 #endif
4283
4284 if (!p->handled)
4285 warning ("Internal error: continuing unhandled thread.");
4286
4287 p->have_signal = 0;
4288
4289 call_ttrace (TT_LWP_CONTINUE,
4290 gdb_tid,
4291 TT_USE_CURRENT_PC,
4292 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4293 TT_NIL);
4294 }
4295 #endif
4296
4297 #ifndef CHILD_RESUME
4298
4299 /* Resume execution of the inferior process.
4300
4301 * This routine is in charge of setting the "handled" bits.
4302 *
4303 * If STEP is zero, continue it.
4304 * If STEP is nonzero, single-step it.
4305 *
4306 * If SIGNAL is nonzero, give it that signal.
4307 *
4308 * If TID is -1, apply to all threads.
4309 * If TID is not -1, apply to specified thread.
4310 *
4311 * STEP
4312 * \ !0 0
4313 * TID \________________________________________________
4314 * |
4315 * -1 | Step current Continue all threads
4316 * | thread and (but which gets any
4317 * | continue others signal?--We look at
4318 * | "inferior_ptid")
4319 * |
4320 * N | Step _this_ thread Continue _this_ thread
4321 * | and leave others and leave others
4322 * | stopped; internally stopped; used only for
4323 * | used by gdb, never hardware watchpoints
4324 * | a user command. and attach, never a
4325 * | user command.
4326 */
4327 void
4328 child_resume (ptid_t ptid, int step, enum target_signal signal)
4329 {
4330 int resume_all_threads;
4331 lwpid_t tid;
4332 process_state_t new_process_state;
4333 lwpid_t gdb_tid = PIDGET (ptid);
4334
4335 resume_all_threads =
4336 (gdb_tid == INFTTRACE_ALL_THREADS) ||
4337 (vfork_in_flight);
4338
4339 if (resume_all_threads)
4340 {
4341 /* Resume all threads, but first pick a tid value
4342 * so we can get the pid when in call_ttrace doing
4343 * the map.
4344 */
4345 if (vfork_in_flight)
4346 tid = vforking_child_pid;
4347 else
4348 tid = map_from_gdb_tid (PIDGET (inferior_ptid));
4349 }
4350 else
4351 tid = map_from_gdb_tid (gdb_tid);
4352
4353 #ifdef THREAD_DEBUG
4354 if (debug_on)
4355 {
4356 if (more_events_left)
4357 printf ("More events; ");
4358
4359 if (signal != 0)
4360 printf ("Sending signal %d; ", signal);
4361
4362 if (resume_all_threads)
4363 {
4364 if (step == 0)
4365 printf ("Continue process %d\n", tid);
4366 else
4367 printf ("Step/continue thread %d\n", tid);
4368 }
4369 else
4370 {
4371 if (step == 0)
4372 printf ("Continue thread %d\n", tid);
4373 else
4374 printf ("Step just thread %d\n", tid);
4375 }
4376
4377 if (vfork_in_flight)
4378 printf ("Vfork in flight\n");
4379 }
4380 #endif
4381
4382 if (process_state == RUNNING)
4383 warning ("Internal error in resume logic; doing resume or step anyway.");
4384
4385 if (!step /* Asked to continue... */
4386 && resume_all_threads /* whole process.. */
4387 && signal != 0 /* with a signal... */
4388 && more_events_left > 0)
4389 { /* but we can't yet--save it! */
4390
4391 /* Continue with signal means we have to set the pending
4392 * signal value for this thread.
4393 */
4394 thread_info *k;
4395
4396 #ifdef THREAD_DEBUG
4397 if (debug_on)
4398 printf ("Saving signal %d for thread %d\n", signal, tid);
4399 #endif
4400
4401 k = find_thread_info (tid);
4402 if (k != NULL)
4403 {
4404 k->have_signal = 1;
4405 k->signal_value = signal;
4406
4407 #ifdef THREAD_DEBUG
4408 if (debug_on)
4409 if (k->terminated)
4410 printf ("Why are we continuing a dead thread? (3)\n");
4411 #endif
4412
4413 }
4414
4415 #ifdef THREAD_DEBUG
4416 else if (debug_on)
4417 {
4418 printf ("No thread info for tid %d\n", tid);
4419 }
4420 #endif
4421 }
4422
4423 /* Are we faking this "continue" or "step"?
4424
4425 * We used to do steps by continuing all the threads for
4426 * which the events had been handled already. While
4427 * conceptually nicer (hides it all in a lower level), this
4428 * can lead to starvation and a hang (e.g. all but one thread
4429 * are unhandled at a breakpoint just before a "join" operation,
4430 * and one thread is in the join, and the user wants to step that
4431 * thread).
4432 */
4433 if (resume_all_threads /* Whole process, therefore user command */
4434 && more_events_left > 0)
4435 { /* But we can't do this yet--fake it! */
4436 thread_info *p;
4437
4438 if (!step)
4439 {
4440 /* No need to do any notes on a per-thread
4441 * basis--we're done!
4442 */
4443 #ifdef WAIT_BUFFER_DEBUG
4444 if (debug_on)
4445 printf ("Faking a process resume.\n");
4446 #endif
4447
4448 return;
4449 }
4450 else
4451 {
4452
4453 #ifdef WAIT_BUFFER_DEBUG
4454 if (debug_on)
4455 printf ("Faking a process step.\n");
4456 #endif
4457
4458 }
4459
4460 p = find_thread_info (tid);
4461 if (p == NULL)
4462 {
4463 warning ("No thread information for tid %d, 'next' command ignored.\n", tid);
4464 return;
4465 }
4466 else
4467 {
4468
4469 #ifdef THREAD_DEBUG
4470 if (debug_on)
4471 if (p->terminated)
4472 printf ("Why are we continuing a dead thread? (3.5)\n");
4473 #endif
4474
4475 if (p->stepping_mode != DO_DEFAULT)
4476 {
4477 warning ("Step or continue command applied to thread which is already stepping or continuing; command ignored.");
4478
4479 return;
4480 }
4481
4482 if (step)
4483 p->stepping_mode = DO_STEP;
4484 else
4485 p->stepping_mode = DO_CONTINUE;
4486
4487 return;
4488 } /* Have thread info */
4489 } /* Must fake step or go */
4490
4491 /* Execept for fake-steps, from here on we know we are
4492 * going to wind up with a running process which will
4493 * need a real wait.
4494 */
4495 new_process_state = RUNNING;
4496
4497 /* An address of TT_USE_CURRENT_PC tells ttrace to continue from where
4498 * it was. (If GDB wanted it to start some other way, we have already
4499 * written a new PC value to the child.)
4500 *
4501 * If this system does not support PT_STEP, a higher level function will
4502 * have called single_step() to transmute the step request into a
4503 * continue request (by setting breakpoints on all possible successor
4504 * instructions), so we don't have to worry about that here.
4505 */
4506 if (step)
4507 {
4508 if (resume_all_threads)
4509 {
4510 /*
4511 * Regular user step: other threads get a "continue".
4512 */
4513 threads_continue_all_but_one (tid, signal);
4514 clear_all_handled ();
4515 clear_all_stepping_mode ();
4516 }
4517
4518 else
4519 {
4520 /* "Fake step": gdb is stepping one thread over a
4521 * breakpoint, watchpoint, or out of a library load
4522 * event, etc. The rest just stay where they are.
4523 *
4524 * Also used when there are pending events: we really
4525 * step the current thread, but leave the rest stopped.
4526 * Users can't request this, but "wait_for_inferior"
4527 * does--a lot!
4528 */
4529 thread_fake_step (tid, signal);
4530
4531 /* Clear the "handled" state of this thread, because
4532 * we'll soon get a new event for it. Other events
4533 * stay as they were.
4534 */
4535 clear_handled (tid);
4536 clear_stepping_mode (tid);
4537 new_process_state = FAKE_STEPPING;
4538 }
4539 }
4540
4541 else
4542 {
4543 /* TT_LWP_CONTINUE can pass signals to threads,
4544 * TT_PROC_CONTINUE can't. So if there are any
4545 * signals to pass, we have to use the (slower)
4546 * loop over the stopped threads.
4547 *
4548 * Equally, if we have to not continue some threads,
4549 * due to saved events, we have to use the loop.
4550 */
4551 if ((signal != 0) || saved_signals_exist ())
4552 {
4553 if (resume_all_threads)
4554 {
4555
4556 #ifdef THREAD_DEBUG
4557 if (debug_on)
4558 printf ("Doing a continue by loop of all threads\n");
4559 #endif
4560
4561 threads_continue_all_with_signals (tid, signal);
4562
4563 clear_all_handled ();
4564 clear_all_stepping_mode ();
4565 }
4566
4567 else
4568 {
4569 #ifdef THREAD_DEBUG
4570 printf ("Doing a continue w/signal of just thread %d\n", tid);
4571 #endif
4572
4573 threads_continue_one_with_signal (tid, signal);
4574
4575 /* Clear the "handled" state of this thread, because
4576 * we'll soon get a new event for it. Other events
4577 * can stay as they were.
4578 */
4579 clear_handled (tid);
4580 clear_stepping_mode (tid);
4581 }
4582 }
4583
4584 else
4585 {
4586 /* No signals to send.
4587 */
4588 if (resume_all_threads)
4589 {
4590 #ifdef THREAD_DEBUG
4591 if (debug_on)
4592 printf ("Doing a continue by process of process %d\n", tid);
4593 #endif
4594
4595 if (more_events_left > 0)
4596 {
4597 warning ("Losing buffered events on continue.");
4598 more_events_left = 0;
4599 }
4600
4601 call_ttrace (TT_PROC_CONTINUE,
4602 tid,
4603 TT_NIL,
4604 TT_NIL,
4605 TT_NIL);
4606
4607 clear_all_handled ();
4608 clear_all_stepping_mode ();
4609 }
4610
4611 else
4612 {
4613 #ifdef THREAD_DEBUG
4614 if (debug_on)
4615 {
4616 printf ("Doing a continue of just thread %d\n", tid);
4617 if (is_terminated (tid))
4618 printf ("Why are we continuing a dead thread? (5)\n");
4619 }
4620 #endif
4621
4622 call_ttrace (TT_LWP_CONTINUE,
4623 tid,
4624 TT_NIL,
4625 TT_NIL,
4626 TT_NIL);
4627
4628 /* Clear the "handled" state of this thread, because
4629 * we'll soon get a new event for it. Other events
4630 * can stay as they were.
4631 */
4632 clear_handled (tid);
4633 clear_stepping_mode (tid);
4634 }
4635 }
4636 }
4637
4638 process_state = new_process_state;
4639
4640 #ifdef WAIT_BUFFER_DEBUG
4641 if (debug_on)
4642 printf ("Process set to %s\n",
4643 get_printable_name_of_process_state (process_state));
4644 #endif
4645
4646 }
4647 #endif /* CHILD_RESUME */
4648 \f
4649
4650 #ifdef ATTACH_DETACH
4651 /*
4652 * Like it says.
4653 *
4654 * One worry is that we may not be attaching to "inferior_ptid"
4655 * and thus may not want to clear out our data. FIXME?
4656 *
4657 */
4658 static void
4659 update_thread_state_after_attach (int pid, attach_continue_t kind_of_go)
4660 {
4661 int tt_status;
4662 ttstate_t thread_state;
4663 lwpid_t a_thread;
4664 lwpid_t tid;
4665
4666 /* The process better be stopped.
4667 */
4668 if (process_state != STOPPED
4669 && process_state != VFORKING)
4670 warning ("Internal error attaching.");
4671
4672 /* Clear out old tthread info and start over. This has the
4673 * side effect of ensuring that the TRAP is reported as being
4674 * in the right thread (re-mapped from tid to pid).
4675 *
4676 * It's because we need to add the tthread _now_ that we
4677 * need to call "clear_thread_info" _now_, and that's why
4678 * "require_notification_of_events" doesn't clear the thread
4679 * info (it's called later than this routine).
4680 */
4681 clear_thread_info ();
4682 a_thread = 0;
4683
4684 for (tid = get_process_first_stopped_thread_id (pid, &thread_state);
4685 tid != 0;
4686 tid = get_process_next_stopped_thread_id (pid, &thread_state))
4687 {
4688 thread_info *p;
4689
4690 if (a_thread == 0)
4691 {
4692 a_thread = tid;
4693 #ifdef THREAD_DEBUG
4694 if (debug_on)
4695 printf ("Attaching to process %d, thread %d\n",
4696 pid, a_thread);
4697 #endif
4698 }
4699
4700 /* Tell ourselves and the "rest of gdb" that this thread
4701 * exists.
4702 *
4703 * This isn't really a hack. Other thread-based versions
4704 * of gdb (e.g. gnu-nat.c) seem to do the same thing.
4705 *
4706 * We don't need to do mapping here, as we know this
4707 * is the first thread and thus gets the real pid
4708 * (and is "inferior_ptid").
4709 *
4710 * NOTE: it probably isn't the originating thread,
4711 * but that doesn't matter (we hope!).
4712 */
4713 add_tthread (pid, tid);
4714 p = find_thread_info (tid);
4715 if (NULL == p) /* ?We just added it! */
4716 error ("Internal error adding a thread on attach.");
4717
4718 copy_ttstate_t (&p->last_stop_state, &thread_state);
4719 p->have_state = 1;
4720
4721 if (DO_ATTACH_CONTINUE == kind_of_go)
4722 {
4723 /*
4724 * If we are going to CONTINUE afterwards,
4725 * raising a SIGTRAP, don't bother trying to
4726 * handle this event. But check first!
4727 */
4728 switch (p->last_stop_state.tts_event)
4729 {
4730
4731 case TTEVT_NONE:
4732 /* Ok to set this handled.
4733 */
4734 break;
4735
4736 default:
4737 warning ("Internal error; skipping event %s on process %d, thread %d.",
4738 get_printable_name_of_ttrace_event (
4739 p->last_stop_state.tts_event),
4740 p->pid, p->tid);
4741 }
4742
4743 set_handled (pid, tid);
4744
4745 }
4746 else
4747 {
4748 /* There will be no "continue" opertion, so the
4749 * process remains stopped. Don't set any events
4750 * handled except the "gimmies".
4751 */
4752 switch (p->last_stop_state.tts_event)
4753 {
4754
4755 case TTEVT_NONE:
4756 /* Ok to ignore this.
4757 */
4758 set_handled (pid, tid);
4759 break;
4760
4761 case TTEVT_EXEC:
4762 case TTEVT_FORK:
4763 /* Expected "other" FORK or EXEC event from a
4764 * fork or vfork.
4765 */
4766 break;
4767
4768 default:
4769 printf ("Internal error: failed to handle event %s on process %d, thread %d.",
4770 get_printable_name_of_ttrace_event (
4771 p->last_stop_state.tts_event),
4772 p->pid, p->tid);
4773 }
4774 }
4775
4776 add_thread (tid); /* in thread.c */
4777 }
4778
4779 #ifdef PARANOIA
4780 if (debug_on)
4781 print_tthreads ();
4782 #endif
4783
4784 /* One mustn't call ttrace_wait() after attaching via ttrace,
4785 'cause the process is stopped already.
4786
4787 However, the upper layers of gdb's execution control will
4788 want to wait after attaching (but not after forks, in
4789 which case they will be doing a "target_resume", anticipating
4790 a later TTEVT_EXEC or TTEVT_FORK event).
4791
4792 To make this attach() implementation more compatible with
4793 others, we'll make the attached-to process raise a SIGTRAP.
4794
4795 Issue: this continues only one thread. That could be
4796 dangerous if the thread is blocked--the process won't run
4797 and no trap will be raised. FIX! (check state.tts_flags?
4798 need one that's either TTS_WASRUNNING--but we've stopped
4799 it and made it TTS_WASSUSPENDED. Hum...FIXME!)
4800 */
4801 if (DO_ATTACH_CONTINUE == kind_of_go)
4802 {
4803 tt_status = call_real_ttrace (
4804 TT_LWP_CONTINUE,
4805 pid,
4806 a_thread,
4807 TT_USE_CURRENT_PC,
4808 (TTRACE_ARG_TYPE) target_signal_to_host (TARGET_SIGNAL_TRAP),
4809 TT_NIL);
4810 if (errno)
4811 perror_with_name ("ttrace");
4812
4813 clear_handled (a_thread); /* So TRAP will be reported. */
4814
4815 /* Now running.
4816 */
4817 process_state = RUNNING;
4818 }
4819
4820 attach_flag = 1;
4821 }
4822 #endif /* ATTACH_DETACH */
4823 \f
4824
4825 #ifdef ATTACH_DETACH
4826 /* Start debugging the process whose number is PID.
4827 * (A _real_ pid).
4828 */
4829 int
4830 attach (int pid)
4831 {
4832 int tt_status;
4833
4834 tt_status = call_real_ttrace (
4835 TT_PROC_ATTACH,
4836 pid,
4837 (lwpid_t) TT_NIL,
4838 TT_NIL,
4839 (TTRACE_ARG_TYPE) TT_VERSION,
4840 TT_NIL);
4841 if (errno)
4842 perror_with_name ("ttrace attach");
4843
4844 /* If successful, the process is now stopped.
4845 */
4846 process_state = STOPPED;
4847
4848 /* Our caller ("attach_command" in "infcmd.c")
4849 * expects to do a "wait_for_inferior" after
4850 * the attach, so make sure the inferior is
4851 * running when we're done.
4852 */
4853 update_thread_state_after_attach (pid, DO_ATTACH_CONTINUE);
4854
4855 return pid;
4856 }
4857
4858
4859 #if defined(CHILD_POST_ATTACH)
4860 void
4861 child_post_attach (int pid)
4862 {
4863 #ifdef THREAD_DEBUG
4864 if (debug_on)
4865 printf ("child-post-attach call\n");
4866 #endif
4867
4868 require_notification_of_events (pid);
4869 }
4870 #endif
4871
4872
4873 /* Stop debugging the process whose number is PID
4874 and continue it with signal number SIGNAL.
4875 SIGNAL = 0 means just continue it.
4876 */
4877 void
4878 detach (int signal)
4879 {
4880 errno = 0;
4881 call_ttrace (TT_PROC_DETACH,
4882 PIDGET (inferior_ptid),
4883 TT_NIL,
4884 (TTRACE_ARG_TYPE) signal,
4885 TT_NIL);
4886 attach_flag = 0;
4887
4888 clear_thread_info ();
4889
4890 /* Process-state? */
4891 }
4892 #endif /* ATTACH_DETACH */
4893 \f
4894
4895 /* Default the type of the ttrace transfer to int. */
4896 #ifndef TTRACE_XFER_TYPE
4897 #define TTRACE_XFER_TYPE int
4898 #endif
4899
4900 void
4901 _initialize_kernel_u_addr (void)
4902 {
4903 }
4904
4905 #if !defined (CHILD_XFER_MEMORY)
4906 /* NOTE! I tried using TTRACE_READDATA, etc., to read and write memory
4907 in the NEW_SUN_TTRACE case.
4908 It ought to be straightforward. But it appears that writing did
4909 not write the data that I specified. I cannot understand where
4910 it got the data that it actually did write. */
4911
4912 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
4913 to debugger memory starting at MYADDR. Copy to inferior if
4914 WRITE is nonzero. TARGET is ignored.
4915
4916 Returns the length copied, which is either the LEN argument or zero.
4917 This xfer function does not do partial moves, since child_ops
4918 doesn't allow memory operations to cross below us in the target stack
4919 anyway. */
4920
4921 int
4922 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
4923 struct mem_attrib *attrib,
4924 struct target_ops *target)
4925 {
4926 register int i;
4927 /* Round starting address down to longword boundary. */
4928 register CORE_ADDR addr = memaddr & -sizeof (TTRACE_XFER_TYPE);
4929 /* Round ending address up; get number of longwords that makes. */
4930 register int count
4931 = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1)
4932 / sizeof (TTRACE_XFER_TYPE);
4933 /* Allocate buffer of that many longwords. */
4934 register TTRACE_XFER_TYPE *buffer
4935 = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
4936
4937 if (write)
4938 {
4939 /* Fill start and end extra bytes of buffer with existing memory data. */
4940
4941 if (addr != memaddr || len < (int) sizeof (TTRACE_XFER_TYPE))
4942 {
4943 /* Need part of initial word -- fetch it. */
4944 buffer[0] = call_ttrace (TT_LWP_RDTEXT,
4945 PIDGET (inferior_ptid),
4946 (TTRACE_ARG_TYPE) addr,
4947 TT_NIL,
4948 TT_NIL);
4949 }
4950
4951 if (count > 1) /* FIXME, avoid if even boundary */
4952 {
4953 buffer[count - 1] = call_ttrace (TT_LWP_RDTEXT,
4954 PIDGET (inferior_ptid),
4955 ((TTRACE_ARG_TYPE)
4956 (addr + (count - 1) * sizeof (TTRACE_XFER_TYPE))),
4957 TT_NIL,
4958 TT_NIL);
4959 }
4960
4961 /* Copy data to be written over corresponding part of buffer */
4962
4963 memcpy ((char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
4964 myaddr,
4965 len);
4966
4967 /* Write the entire buffer. */
4968
4969 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4970 {
4971 errno = 0;
4972 call_ttrace (TT_LWP_WRDATA,
4973 PIDGET (inferior_ptid),
4974 (TTRACE_ARG_TYPE) addr,
4975 (TTRACE_ARG_TYPE) buffer[i],
4976 TT_NIL);
4977 if (errno)
4978 {
4979 /* Using the appropriate one (I or D) is necessary for
4980 Gould NP1, at least. */
4981 errno = 0;
4982 call_ttrace (TT_LWP_WRTEXT,
4983 PIDGET (inferior_ptid),
4984 (TTRACE_ARG_TYPE) addr,
4985 (TTRACE_ARG_TYPE) buffer[i],
4986 TT_NIL);
4987 }
4988 if (errno)
4989 return 0;
4990 }
4991 }
4992 else
4993 {
4994 /* Read all the longwords */
4995 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4996 {
4997 errno = 0;
4998 buffer[i] = call_ttrace (TT_LWP_RDTEXT,
4999 PIDGET (inferior_ptid),
5000 (TTRACE_ARG_TYPE) addr,
5001 TT_NIL,
5002 TT_NIL);
5003 if (errno)
5004 return 0;
5005 QUIT;
5006 }
5007
5008 /* Copy appropriate bytes out of the buffer. */
5009 memcpy (myaddr,
5010 (char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
5011 len);
5012 }
5013 return len;
5014 }
5015 \f
5016
5017 static void
5018 udot_info (void)
5019 {
5020 int udot_off; /* Offset into user struct */
5021 int udot_val; /* Value from user struct at udot_off */
5022 char mess[128]; /* For messages */
5023
5024 if (!target_has_execution)
5025 {
5026 error ("The program is not being run.");
5027 }
5028
5029 #if !defined (KERNEL_U_SIZE)
5030
5031 /* Adding support for this command is easy. Typically you just add a
5032 routine, called "kernel_u_size" that returns the size of the user
5033 struct, to the appropriate *-nat.c file and then add to the native
5034 config file "#define KERNEL_U_SIZE kernel_u_size()" */
5035 error ("Don't know how large ``struct user'' is in this version of gdb.");
5036
5037 #else
5038
5039 for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val))
5040 {
5041 if ((udot_off % 24) == 0)
5042 {
5043 if (udot_off > 0)
5044 {
5045 printf_filtered ("\n");
5046 }
5047 printf_filtered ("%04x:", udot_off);
5048 }
5049 udot_val = call_ttrace (TT_LWP_RUREGS,
5050 PIDGET (inferior_ptid),
5051 (TTRACE_ARG_TYPE) udot_off,
5052 TT_NIL,
5053 TT_NIL);
5054 if (errno != 0)
5055 {
5056 sprintf (mess, "\nreading user struct at offset 0x%x", udot_off);
5057 perror_with_name (mess);
5058 }
5059 /* Avoid using nonportable (?) "*" in print specs */
5060 printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val);
5061 }
5062 printf_filtered ("\n");
5063
5064 #endif
5065 }
5066 #endif /* !defined (CHILD_XFER_MEMORY). */
5067
5068 /* TTrace version of "target_pid_to_exec_file"
5069 */
5070 char *
5071 child_pid_to_exec_file (int tid)
5072 {
5073 static char exec_file_buffer[1024];
5074 int tt_status;
5075 CORE_ADDR top_of_stack;
5076 char four_chars[4];
5077 int name_index;
5078 int i;
5079 int done;
5080 ptid_t saved_inferior_ptid;
5081
5082 /* As of 10.x HP-UX, there's an explicit request to get the
5083 *pathname.
5084 */
5085 tt_status = call_ttrace (TT_PROC_GET_PATHNAME,
5086 tid,
5087 (TTRACE_ARG_TYPE) exec_file_buffer,
5088 (TTRACE_ARG_TYPE) sizeof (exec_file_buffer) - 1,
5089 TT_NIL);
5090 if (tt_status >= 0)
5091 return exec_file_buffer;
5092
5093 /* ??rehrauer: The above request may or may not be broken. It
5094 doesn't seem to work when I use it. But, it may be designed
5095 to only work immediately after an exec event occurs. (I'm
5096 waiting for COSL to explain.)
5097
5098 In any case, if it fails, try a really, truly amazingly gross
5099 hack that DDE uses, of pawing through the process' data
5100 segment to find the pathname.
5101 */
5102 top_of_stack = (TARGET_PTR_BIT == 64 ? 0x800003ffff7f0000 : 0x7b03a000);
5103 name_index = 0;
5104 done = 0;
5105
5106 /* On the chance that pid != inferior_ptid, set inferior_ptid
5107 to pid, so that (grrrr!) implicit uses of inferior_ptid get
5108 the right id.
5109 */
5110 saved_inferior_ptid = inferior_ptid;
5111 inferior_ptid = pid_to_ptid (tid);
5112
5113 /* Try to grab a null-terminated string. */
5114 while (!done)
5115 {
5116 if (target_read_memory (top_of_stack, four_chars, 4) != 0)
5117 {
5118 inferior_ptid = saved_inferior_ptid;
5119 return NULL;
5120 }
5121 for (i = 0; i < 4; i++)
5122 {
5123 exec_file_buffer[name_index++] = four_chars[i];
5124 done = (four_chars[i] == '\0');
5125 if (done)
5126 break;
5127 }
5128 top_of_stack += 4;
5129 }
5130
5131 if (exec_file_buffer[0] == '\0')
5132 {
5133 inferior_ptid = saved_inferior_ptid;
5134 return NULL;
5135 }
5136
5137 inferior_ptid = saved_inferior_ptid;
5138 return exec_file_buffer;
5139 }
5140
5141
5142 void
5143 pre_fork_inferior (void)
5144 {
5145 int status;
5146
5147 status = pipe (startup_semaphore.parent_channel);
5148 if (status < 0)
5149 {
5150 warning ("error getting parent pipe for startup semaphore");
5151 return;
5152 }
5153
5154 status = pipe (startup_semaphore.child_channel);
5155 if (status < 0)
5156 {
5157 warning ("error getting child pipe for startup semaphore");
5158 return;
5159 }
5160 }
5161
5162 /* Called via #define REQUIRE_ATTACH from inftarg.c,
5163 * ultimately from "follow_inferior_fork" in infrun.c,
5164 * itself called from "resume".
5165 *
5166 * This seems to be intended to attach after a fork or
5167 * vfork, while "attach" is used to attach to a pid
5168 * given by the user. The check for an existing attach
5169 * seems odd--it always fails in our test system.
5170 */
5171 int
5172 hppa_require_attach (int pid)
5173 {
5174 int tt_status;
5175 CORE_ADDR pc;
5176 CORE_ADDR pc_addr;
5177 unsigned int regs_offset;
5178 process_state_t old_process_state = process_state;
5179
5180 /* Are we already attached? There appears to be no explicit
5181 * way to answer this via ttrace, so we try something which
5182 * should be innocuous if we are attached. If that fails,
5183 * then we assume we're not attached, and so attempt to make
5184 * it so.
5185 */
5186 errno = 0;
5187 tt_status = call_real_ttrace (TT_PROC_STOP,
5188 pid,
5189 (lwpid_t) TT_NIL,
5190 (TTRACE_ARG_TYPE) TT_NIL,
5191 (TTRACE_ARG_TYPE) TT_NIL,
5192 TT_NIL);
5193
5194 if (errno)
5195 {
5196 /* No change to process-state!
5197 */
5198 errno = 0;
5199 pid = attach (pid);
5200 }
5201 else
5202 {
5203 /* If successful, the process is now stopped. But if
5204 * we're VFORKING, the parent is still running, so don't
5205 * change the process state.
5206 */
5207 if (process_state != VFORKING)
5208 process_state = STOPPED;
5209
5210 /* If we were already attached, you'd think that we
5211 * would need to start going again--but you'd be wrong,
5212 * as the fork-following code is actually in the middle
5213 * of the "resume" routine in in "infrun.c" and so
5214 * will (almost) immediately do a resume.
5215 *
5216 * On the other hand, if we are VFORKING, which means
5217 * that the child and the parent share a process for a
5218 * while, we know that "resume" won't be resuming
5219 * until the child EXEC event is seen. But we still
5220 * don't want to continue, as the event is already
5221 * there waiting.
5222 */
5223 update_thread_state_after_attach (pid, DONT_ATTACH_CONTINUE);
5224 } /* STOP succeeded */
5225
5226 return pid;
5227 }
5228
5229 int
5230 hppa_require_detach (int pid, int signal)
5231 {
5232 int tt_status;
5233
5234 /* If signal is non-zero, we must pass the signal on to the active
5235 thread prior to detaching. We do this by continuing the threads
5236 with the signal.
5237 */
5238 if (signal != 0)
5239 {
5240 errno = 0;
5241 threads_continue_all_with_signals (pid, signal);
5242 }
5243
5244 errno = 0;
5245 tt_status = call_ttrace (TT_PROC_DETACH,
5246 pid,
5247 TT_NIL,
5248 TT_NIL,
5249 TT_NIL);
5250
5251 errno = 0; /* Ignore any errors. */
5252
5253 /* process_state? */
5254
5255 return pid;
5256 }
5257
5258 /* Given the starting address of a memory page, hash it to a bucket in
5259 the memory page dictionary.
5260 */
5261 static int
5262 get_dictionary_bucket_of_page (CORE_ADDR page_start)
5263 {
5264 int hash;
5265
5266 hash = (page_start / memory_page_dictionary.page_size);
5267 hash = hash % MEMORY_PAGE_DICTIONARY_BUCKET_COUNT;
5268
5269 return hash;
5270 }
5271
5272
5273 /* Given a memory page's starting address, get (i.e., find an existing
5274 or create a new) dictionary entry for the page. The page will be
5275 write-protected when this function returns, but may have a reference
5276 count of 0 (if the page was newly-added to the dictionary).
5277 */
5278 static memory_page_t *
5279 get_dictionary_entry_of_page (int pid, CORE_ADDR page_start)
5280 {
5281 int bucket;
5282 memory_page_t *page = NULL;
5283 memory_page_t *previous_page = NULL;
5284
5285 /* We're going to be using the dictionary now, than-kew. */
5286 require_memory_page_dictionary ();
5287
5288 /* Try to find an existing dictionary entry for this page. Hash
5289 on the page's starting address.
5290 */
5291 bucket = get_dictionary_bucket_of_page (page_start);
5292 page = &memory_page_dictionary.buckets[bucket];
5293 while (page != NULL)
5294 {
5295 if (page->page_start == page_start)
5296 break;
5297 previous_page = page;
5298 page = page->next;
5299 }
5300
5301 /* Did we find a dictionary entry for this page? If not, then
5302 add it to the dictionary now.
5303 */
5304 if (page == NULL)
5305 {
5306 /* Create a new entry. */
5307 page = (memory_page_t *) xmalloc (sizeof (memory_page_t));
5308 page->page_start = page_start;
5309 page->reference_count = 0;
5310 page->next = NULL;
5311 page->previous = NULL;
5312
5313 /* We'll write-protect the page now, if that's allowed. */
5314 page->original_permissions = write_protect_page (pid, page_start);
5315
5316 /* Add the new entry to the dictionary. */
5317 page->previous = previous_page;
5318 previous_page->next = page;
5319
5320 memory_page_dictionary.page_count++;
5321 }
5322
5323 return page;
5324 }
5325
5326
5327 static void
5328 remove_dictionary_entry_of_page (int pid, memory_page_t *page)
5329 {
5330 /* Restore the page's original permissions. */
5331 unwrite_protect_page (pid, page->page_start, page->original_permissions);
5332
5333 /* Kick the page out of the dictionary. */
5334 if (page->previous != NULL)
5335 page->previous->next = page->next;
5336 if (page->next != NULL)
5337 page->next->previous = page->previous;
5338
5339 /* Just in case someone retains a handle to this after it's freed. */
5340 page->page_start = (CORE_ADDR) 0;
5341
5342 memory_page_dictionary.page_count--;
5343
5344 xfree (page);
5345 }
5346
5347
5348 static void
5349 hppa_enable_syscall_events (int pid)
5350 {
5351 int tt_status;
5352 ttevent_t ttrace_events;
5353
5354 /* Get the set of events that are currently enabled. */
5355 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5356 pid,
5357 (TTRACE_ARG_TYPE) & ttrace_events,
5358 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5359 TT_NIL);
5360 if (errno)
5361 perror_with_name ("ttrace");
5362
5363 /* Add syscall events to that set. */
5364 ttrace_events.tte_events |= TTEVT_SYSCALL_ENTRY;
5365 ttrace_events.tte_events |= TTEVT_SYSCALL_RETURN;
5366
5367 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5368 pid,
5369 (TTRACE_ARG_TYPE) & ttrace_events,
5370 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5371 TT_NIL);
5372 if (errno)
5373 perror_with_name ("ttrace");
5374 }
5375
5376
5377 static void
5378 hppa_disable_syscall_events (int pid)
5379 {
5380 int tt_status;
5381 ttevent_t ttrace_events;
5382
5383 /* Get the set of events that are currently enabled. */
5384 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5385 pid,
5386 (TTRACE_ARG_TYPE) & ttrace_events,
5387 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5388 TT_NIL);
5389 if (errno)
5390 perror_with_name ("ttrace");
5391
5392 /* Remove syscall events from that set. */
5393 ttrace_events.tte_events &= ~TTEVT_SYSCALL_ENTRY;
5394 ttrace_events.tte_events &= ~TTEVT_SYSCALL_RETURN;
5395
5396 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5397 pid,
5398 (TTRACE_ARG_TYPE) & ttrace_events,
5399 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5400 TT_NIL);
5401 if (errno)
5402 perror_with_name ("ttrace");
5403 }
5404
5405
5406 /* The address range beginning with START and ending with START+LEN-1
5407 (inclusive) is to be watched via page-protection by a new watchpoint.
5408 Set protection for all pages that overlap that range.
5409
5410 Note that our caller sets TYPE to:
5411 0 for a bp_hardware_watchpoint,
5412 1 for a bp_read_watchpoint,
5413 2 for a bp_access_watchpoint
5414
5415 (Yes, this is intentionally (though lord only knows why) different
5416 from the TYPE that is passed to hppa_remove_hw_watchpoint.)
5417 */
5418 int
5419 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
5420 {
5421 CORE_ADDR page_start;
5422 int dictionary_was_empty;
5423 int page_size;
5424 int page_id;
5425 LONGEST range_size_in_pages;
5426
5427 if (type != 0)
5428 error ("read or access hardware watchpoints not supported on HP-UX");
5429
5430 /* Examine all pages in the address range. */
5431 require_memory_page_dictionary ();
5432
5433 dictionary_was_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5434
5435 page_size = memory_page_dictionary.page_size;
5436 page_start = (start / page_size) * page_size;
5437 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5438
5439 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5440 {
5441 memory_page_t *page;
5442
5443 /* This gets the page entered into the dictionary if it was
5444 not already entered.
5445 */
5446 page = get_dictionary_entry_of_page (pid, page_start);
5447 page->reference_count++;
5448 }
5449
5450 /* Our implementation depends on seeing calls to kernel code, for the
5451 following reason. Here we ask to be notified of syscalls.
5452
5453 When a protected page is accessed by user code, HP-UX raises a SIGBUS.
5454 Fine.
5455
5456 But when kernel code accesses the page, it doesn't give a SIGBUS.
5457 Rather, the system call that touched the page fails, with errno=EFAULT.
5458 Not good for us.
5459
5460 We could accomodate this "feature" by asking to be notified of syscall
5461 entries & exits; upon getting an entry event, disabling page-protections;
5462 upon getting an exit event, reenabling page-protections and then checking
5463 if any watchpoints triggered.
5464
5465 However, this turns out to be a real performance loser. syscalls are
5466 usually a frequent occurrence. Having to unprotect-reprotect all watched
5467 pages, and also to then read all watched memory locations and compare for
5468 triggers, can be quite expensive.
5469
5470 Instead, we'll only ask to be notified of syscall exits. When we get
5471 one, we'll check whether errno is set. If not, or if it's not EFAULT,
5472 we can just continue the inferior.
5473
5474 If errno is set upon syscall exit to EFAULT, we must perform some fairly
5475 hackish stuff to determine whether the failure really was due to a
5476 page-protect trap on a watched location.
5477 */
5478 if (dictionary_was_empty)
5479 hppa_enable_syscall_events (pid);
5480
5481 return 1;
5482 }
5483
5484
5485 /* The address range beginning with START and ending with START+LEN-1
5486 (inclusive) was being watched via page-protection by a watchpoint
5487 which has been removed. Remove protection for all pages that
5488 overlap that range, which are not also being watched by other
5489 watchpoints.
5490 */
5491 int
5492 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len,
5493 enum bptype type)
5494 {
5495 CORE_ADDR page_start;
5496 int dictionary_is_empty;
5497 int page_size;
5498 int page_id;
5499 LONGEST range_size_in_pages;
5500
5501 if (type != 0)
5502 error ("read or access hardware watchpoints not supported on HP-UX");
5503
5504 /* Examine all pages in the address range. */
5505 require_memory_page_dictionary ();
5506
5507 page_size = memory_page_dictionary.page_size;
5508 page_start = (start / page_size) * page_size;
5509 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5510
5511 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5512 {
5513 memory_page_t *page;
5514
5515 page = get_dictionary_entry_of_page (pid, page_start);
5516 page->reference_count--;
5517
5518 /* Was this the last reference of this page? If so, then we
5519 must scrub the entry from the dictionary, and also restore
5520 the page's original permissions.
5521 */
5522 if (page->reference_count == 0)
5523 remove_dictionary_entry_of_page (pid, page);
5524 }
5525
5526 dictionary_is_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5527
5528 /* If write protections are currently disallowed, then that implies that
5529 wait_for_inferior believes that the inferior is within a system call.
5530 Since we want to see both syscall entry and return, it's clearly not
5531 good to disable syscall events in this state!
5532
5533 ??rehrauer: Yeah, it'd be better if we had a specific flag that said,
5534 "inferior is between syscall events now". Oh well.
5535 */
5536 if (dictionary_is_empty && memory_page_dictionary.page_protections_allowed)
5537 hppa_disable_syscall_events (pid);
5538
5539 return 1;
5540 }
5541
5542
5543 /* Could we implement a watchpoint of this type via our available
5544 hardware support?
5545
5546 This query does not consider whether a particular address range
5547 could be so watched, but just whether support is generally available
5548 for such things. See hppa_range_profitable_for_hw_watchpoint for a
5549 query that answers whether a particular range should be watched via
5550 hardware support.
5551 */
5552 int
5553 hppa_can_use_hw_watchpoint (enum bptype type, int cnt, enum bptype ot)
5554 {
5555 return (type == bp_hardware_watchpoint);
5556 }
5557
5558
5559 /* Assuming we could set a hardware watchpoint on this address, do
5560 we think it would be profitable ("a good idea") to do so? If not,
5561 we can always set a regular (aka single-step & test) watchpoint
5562 on the address...
5563 */
5564 int
5565 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len)
5566 {
5567 int range_is_stack_based;
5568 int range_is_accessible;
5569 CORE_ADDR page_start;
5570 int page_size;
5571 int page;
5572 LONGEST range_size_in_pages;
5573
5574 /* ??rehrauer: For now, say that all addresses are potentially
5575 profitable. Possibly later we'll want to test the address
5576 for "stackness"?
5577 */
5578 range_is_stack_based = 0;
5579
5580 /* If any page in the range is inaccessible, then we cannot
5581 really use hardware watchpointing, even though our client
5582 thinks we can. In that case, it's actually an error to
5583 attempt to use hw watchpoints, so we'll tell our client
5584 that the range is "unprofitable", and hope that they listen...
5585 */
5586 range_is_accessible = 1; /* Until proven otherwise. */
5587
5588 /* Examine all pages in the address range. */
5589 errno = 0;
5590 page_size = sysconf (_SC_PAGE_SIZE);
5591
5592 /* If we can't determine page size, we're hosed. Tell our
5593 client it's unprofitable to use hw watchpoints for this
5594 range.
5595 */
5596 if (errno || (page_size <= 0))
5597 {
5598 errno = 0;
5599 return 0;
5600 }
5601
5602 page_start = (start / page_size) * page_size;
5603 range_size_in_pages = len / (LONGEST) page_size;
5604
5605 for (page = 0; page < range_size_in_pages; page++, page_start += page_size)
5606 {
5607 int tt_status;
5608 int page_permissions;
5609
5610 /* Is this page accessible? */
5611 errno = 0;
5612 tt_status = call_ttrace (TT_PROC_GET_MPROTECT,
5613 pid,
5614 (TTRACE_ARG_TYPE) page_start,
5615 TT_NIL,
5616 (TTRACE_ARG_TYPE) & page_permissions);
5617 if (errno || (tt_status < 0))
5618 {
5619 errno = 0;
5620 range_is_accessible = 0;
5621 break;
5622 }
5623
5624 /* Yes, go for another... */
5625 }
5626
5627 return (!range_is_stack_based && range_is_accessible);
5628 }
5629
5630
5631 char *
5632 hppa_pid_or_tid_to_str (ptid_t ptid)
5633 {
5634 static char buf[100]; /* Static because address returned. */
5635 pid_t id = PIDGET (ptid);
5636
5637 /* Does this appear to be a process? If so, print it that way. */
5638 if (is_process_id (id))
5639 return child_pid_to_str (ptid);
5640
5641 /* Else, print both the GDB thread number and the system thread id. */
5642 sprintf (buf, "thread %d (", pid_to_thread_id (ptid));
5643 strcat (buf, hppa_tid_to_str (ptid));
5644 strcat (buf, ")\0");
5645
5646 return buf;
5647 }
5648 \f
5649
5650 /* If the current pid is not the pid this module reported
5651 * from "ptrace_wait" with the most recent event, then the
5652 * user has switched threads.
5653 *
5654 * If the last reported event was a breakpoint, then return
5655 * the old thread id, else return 0.
5656 */
5657 pid_t
5658 hppa_switched_threads (pid_t gdb_pid)
5659 {
5660 if (gdb_pid == old_gdb_pid)
5661 {
5662 /*
5663 * Core gdb is working with the same pid that it
5664 * was before we reported the last event. This
5665 * is ok: e.g. we reported hitting a thread-specific
5666 * breakpoint, but we were reporting the wrong
5667 * thread, so the core just ignored the event.
5668 *
5669 * No thread switch has happened.
5670 */
5671 return (pid_t) 0;
5672 }
5673 else if (gdb_pid == reported_pid)
5674 {
5675 /*
5676 * Core gdb is working with the pid we reported, so
5677 * any continue or step will be able to figure out
5678 * that it needs to step over any hit breakpoints
5679 * without our (i.e. PREPARE_TO_PROCEED's) help.
5680 */
5681 return (pid_t) 0;
5682 }
5683 else if (!reported_bpt)
5684 {
5685 /*
5686 * The core switched, but we didn't just report a
5687 * breakpoint, so there's no just-hit breakpoint
5688 * instruction at "reported_pid"'s PC, and thus there
5689 * is no need to step over it.
5690 */
5691 return (pid_t) 0;
5692 }
5693 else
5694 {
5695 /* There's been a real switch, and we reported
5696 * a hit breakpoint. Let "hppa_prepare_to_proceed"
5697 * know, so it can see whether the breakpoint is
5698 * still active.
5699 */
5700 return reported_pid;
5701 }
5702
5703 /* Keep compiler happy with an obvious return at the end.
5704 */
5705 return (pid_t) 0;
5706 }
5707
5708 void
5709 hppa_ensure_vforking_parent_remains_stopped (int pid)
5710 {
5711 /* Nothing to do when using ttrace. Only the ptrace-based implementation
5712 must do real work.
5713 */
5714 }
5715
5716
5717 int
5718 hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
5719 {
5720 return 0; /* No, the parent vfork is available now. */
5721 }
5722 \f
5723
5724 /* Write a register as a 64bit value. This may be necessary if the
5725 native OS is too braindamaged to allow some (or all) registers to
5726 be written in 32bit hunks such as hpux11 and the PC queue registers.
5727
5728 This is horribly gross and disgusting. */
5729
5730 int
5731 ttrace_write_reg_64 (int gdb_tid, CORE_ADDR dest_addr, CORE_ADDR src_addr)
5732 {
5733 pid_t pid;
5734 lwpid_t tid;
5735 int tt_status;
5736
5737 tid = map_from_gdb_tid (gdb_tid);
5738 pid = get_pid_for (tid);
5739
5740 errno = 0;
5741 tt_status = ttrace (TT_LWP_WUREGS,
5742 pid,
5743 tid,
5744 (TTRACE_ARG_TYPE) dest_addr,
5745 8,
5746 (TTRACE_ARG_TYPE) src_addr );
5747
5748 #ifdef THREAD_DEBUG
5749 if (errno)
5750 {
5751 /* Don't bother for a known benign error: if you ask for the
5752 first thread state, but there is only one thread and it's
5753 not stopped, ttrace complains.
5754
5755 We have this inside the #ifdef because our caller will do
5756 this check for real. */
5757 if( request != TT_PROC_GET_FIRST_LWP_STATE
5758 || errno != EPROTO )
5759 {
5760 if( debug_on )
5761 printf( "TT fail for %s, with pid %d, tid %d, status %d \n",
5762 get_printable_name_of_ttrace_request (TT_LWP_WUREGS),
5763 pid, tid, tt_status );
5764 }
5765 }
5766 #endif
5767
5768 return tt_status;
5769 }
5770
5771 void
5772 _initialize_infttrace (void)
5773 {
5774 /* Initialize the ttrace-based hardware watchpoint implementation. */
5775 memory_page_dictionary.page_count = (LONGEST) - 1;
5776 memory_page_dictionary.page_protections_allowed = 1;
5777
5778 errno = 0;
5779 memory_page_dictionary.page_size = sysconf (_SC_PAGE_SIZE);
5780
5781 /* We do a lot of casts from pointers to TTRACE_ARG_TYPE; make sure
5782 this is okay. */
5783 if (sizeof (TTRACE_ARG_TYPE) < sizeof (void *))
5784 internal_error (__FILE__, __LINE__, "failed internal consistency check");
5785
5786 if (errno || (memory_page_dictionary.page_size <= 0))
5787 perror_with_name ("sysconf");
5788 }
This page took 0.203399 seconds and 4 git commands to generate.