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