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