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