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