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