1/* Low level Unix child interface to ttrace, for GDB when running under HP-UX.
2
3   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4   1998, 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
5
6   This file is part of GDB.
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 59 Temple Place - Suite 330,
21   Boston, MA 02111-1307, USA.  */
22
23#include "defs.h"
24#include "frame.h"
25#include "inferior.h"
26#include "target.h"
27#include "gdb_string.h"
28#include "gdb_wait.h"
29#include "command.h"
30#include "gdbthread.h"
31#include "infttrace.h"
32
33/* We need pstat functionality so that we can get the exec file
34   for a process we attach to.
35
36   According to HP, we should use the 64bit interfaces, so we
37   define _PSTAT64 to achieve this.  */
38#define _PSTAT64
39#include <sys/pstat.h>
40
41/* Some hackery to work around a use of the #define name NO_FLAGS
42 * in both gdb and HPUX (bfd.h and /usr/include/machine/vmparam.h).
43 */
44#ifdef  NO_FLAGS
45#define INFTTRACE_TEMP_HACK NO_FLAGS
46#undef  NO_FLAGS
47#endif
48
49#include <sys/param.h>
50#include <sys/dir.h>
51#include <signal.h>
52#include <sys/ioctl.h>
53
54#include <sys/ttrace.h>
55#include <sys/mman.h>
56
57#ifndef NO_PTRACE_H
58#ifdef PTRACE_IN_WRONG_PLACE
59#include <ptrace.h>
60#else
61#include <sys/ptrace.h>
62#endif
63#endif /* NO_PTRACE_H */
64
65/* Second half of the hackery above.  Non-ANSI C, so
66 * we can't use "#error", alas.
67 */
68#ifdef NO_FLAGS
69#if (NO_FLAGS != INFTTRACE_TEMP_HACK )
70  /* #error "Hackery to remove warning didn't work right" */
71#else
72  /* Ok, new def'n of NO_FLAGS is same as old one; no action needed. */
73#endif
74#else
75  /* #error "Didn't get expected re-definition of NO_FLAGS" */
76#define NO_FLAGS INFTTRACE_TEMP_HACK
77#endif
78
79#if !defined (PT_SETTRC)
80#define PT_SETTRC	0	/* Make process traceable by parent */
81#endif
82#if !defined (PT_READ_I)
83#define PT_READ_I	1	/* Read word from text space */
84#endif
85#if !defined (PT_READ_D)
86#define	PT_READ_D	2	/* Read word from data space */
87#endif
88#if !defined (PT_READ_U)
89#define PT_READ_U	3	/* Read word from kernel user struct */
90#endif
91#if !defined (PT_WRITE_I)
92#define PT_WRITE_I	4	/* Write word to text space */
93#endif
94#if !defined (PT_WRITE_D)
95#define PT_WRITE_D	5	/* Write word to data space */
96#endif
97#if !defined (PT_WRITE_U)
98#define PT_WRITE_U	6	/* Write word to kernel user struct */
99#endif
100#if !defined (PT_CONTINUE)
101#define PT_CONTINUE	7	/* Continue after signal */
102#endif
103#if !defined (PT_STEP)
104#define PT_STEP		9	/* Set flag for single stepping */
105#endif
106#if !defined (PT_KILL)
107#define PT_KILL		8	/* Send child a SIGKILL signal */
108#endif
109
110#ifndef PT_ATTACH
111#define PT_ATTACH PTRACE_ATTACH
112#endif
113#ifndef PT_DETACH
114#define PT_DETACH PTRACE_DETACH
115#endif
116
117#include "gdbcore.h"
118#ifdef	HAVE_SYS_FILE_H
119#include <sys/file.h>
120#endif
121
122/* This semaphore is used to coordinate the child and parent processes
123   after a fork(), and before an exec() by the child.  See parent_attach_all
124   for details.
125 */
126typedef struct
127  {
128    int parent_channel[2];	/* Parent "talks" to [1], child "listens" to [0] */
129    int child_channel[2];	/* Child "talks" to [1], parent "listens" to [0] */
130  }
131startup_semaphore_t;
132
133#define SEM_TALK (1)
134#define SEM_LISTEN (0)
135
136static startup_semaphore_t startup_semaphore;
137
138/* See can_touch_threads_of_process for details. */
139static int vforking_child_pid = 0;
140static int vfork_in_flight = 0;
141
142/* 1 if ok as results of a ttrace or ttrace_wait call, 0 otherwise.
143 */
144#define TT_OK( _status, _errno ) \
145    (((_status) == 1) && ((_errno) == 0))
146
147#define TTRACE_ARG_TYPE uint64_t
148
149/* When supplied as the "addr" operand, ttrace interprets this
150   to mean, "from the current address".
151 */
152#define TT_USE_CURRENT_PC ((TTRACE_ARG_TYPE) TT_NOPC)
153
154/* When supplied as the "addr", "data" or "addr2" operand for most
155   requests, ttrace interprets this to mean, "pay no heed to this
156   argument".
157 */
158#define TT_NIL ((TTRACE_ARG_TYPE) TT_NULLARG)
159
160/* This is capable of holding the value of a 32-bit register.  The
161   value is always left-aligned in the buffer; i.e., [0] contains
162   the most-significant byte of the register's value, and [sizeof(reg)]
163   contains the least-significant value.
164
165   ??rehrauer: Yes, this assumes that an int is 32-bits on HP-UX, and
166   that registers are 32-bits on HP-UX.  The latter assumption changes
167   with PA2.0.
168 */
169typedef 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 */
287extern int not_same_real_pid;
288
289/* This is used to count buffered events.
290 */
291static unsigned int more_events_left = 0;
292
293/* Process state.
294 */
295typedef enum process_state_enum
296  {
297    STOPPED,
298    FAKE_STEPPING,
299    FAKE_CONTINUE,		/* For later use */
300    RUNNING,
301    FORKING,
302    VFORKING
303  }
304process_state_t;
305
306static process_state_t process_state = STOPPED;
307
308/* User-specified stepping modality.
309 */
310typedef enum stepping_mode_enum
311  {
312    DO_DEFAULT,			/* ...which is a continue! */
313    DO_STEP,
314    DO_CONTINUE
315  }
316stepping_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 */
327typedef enum attach_continue_enum
328  {
329    DO_ATTACH_CONTINUE,
330    DONT_ATTACH_CONTINUE
331  }
332attach_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 */
340static int doing_fake_step = 0;
341static lwpid_t fake_step_tid = 0;
342
343
344/****************************************************
345 * Thread information structure routines and types. *
346 ****************************************************
347 */
348typedef
349struct 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  }
369thread_info;
370
371typedef
372struct thread_info_header_struct
373  {
374    int count;
375    thread_info *head;
376    thread_info *head_pseudo;
377
378  }
379thread_info_header;
380
381static thread_info_header thread_head =
382{0, NULL, NULL};
383static thread_info_header deleted_threads =
384{0, NULL, NULL};
385
386static ptid_t saved_real_ptid;
387
388
389/*************************************************
390 *          Debugging support functions          *
391 *************************************************
392 */
393CORE_ADDR
394get_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
416static char *
417get_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 */
435char *
436get_printable_name_of_ttrace_event (ttevents_t event)
437{
438  /* This enumeration is "gappy", so don't use a table. */
439  switch (event)
440    {
441
442    case TTEVT_NONE:
443      return "TTEVT_NONE";
444    case TTEVT_SIGNAL:
445      return "TTEVT_SIGNAL";
446    case TTEVT_FORK:
447      return "TTEVT_FORK";
448    case TTEVT_EXEC:
449      return "TTEVT_EXEC";
450    case TTEVT_EXIT:
451      return "TTEVT_EXIT";
452    case TTEVT_VFORK:
453      return "TTEVT_VFORK";
454    case TTEVT_SYSCALL_RETURN:
455      return "TTEVT_SYSCALL_RETURN";
456    case TTEVT_LWP_CREATE:
457      return "TTEVT_LWP_CREATE";
458    case TTEVT_LWP_TERMINATE:
459      return "TTEVT_LWP_TERMINATE";
460    case TTEVT_LWP_EXIT:
461      return "TTEVT_LWP_EXIT";
462    case TTEVT_LWP_ABORT_SYSCALL:
463      return "TTEVT_LWP_ABORT_SYSCALL";
464    case TTEVT_SYSCALL_ENTRY:
465      return "TTEVT_SYSCALL_ENTRY";
466    case TTEVT_SYSCALL_RESTART:
467      return "TTEVT_SYSCALL_RESTART";
468    default:
469      return "?new event?";
470    }
471}
472
473
474/* This function translates the ttrace request enumeration into
475 * a character string that is its printable (aka "human readable")
476 * name.
477 */
478char *
479get_printable_name_of_ttrace_request (ttreq_t request)
480{
481  if (!IS_TTRACE_REQ (request))
482    return "?bad req?";
483
484  /* This enumeration is "gappy", so don't use a table. */
485  switch (request)
486    {
487    case TT_PROC_SETTRC:
488      return "TT_PROC_SETTRC";
489    case TT_PROC_ATTACH:
490      return "TT_PROC_ATTACH";
491    case TT_PROC_DETACH:
492      return "TT_PROC_DETACH";
493    case TT_PROC_RDTEXT:
494      return "TT_PROC_RDTEXT";
495    case TT_PROC_WRTEXT:
496      return "TT_PROC_WRTEXT";
497    case TT_PROC_RDDATA:
498      return "TT_PROC_RDDATA";
499    case TT_PROC_WRDATA:
500      return "TT_PROC_WRDATA";
501    case TT_PROC_STOP:
502      return "TT_PROC_STOP";
503    case TT_PROC_CONTINUE:
504      return "TT_PROC_CONTINUE";
505    case TT_PROC_GET_PATHNAME:
506      return "TT_PROC_GET_PATHNAME";
507    case TT_PROC_GET_EVENT_MASK:
508      return "TT_PROC_GET_EVENT_MASK";
509    case TT_PROC_SET_EVENT_MASK:
510      return "TT_PROC_SET_EVENT_MASK";
511    case TT_PROC_GET_FIRST_LWP_STATE:
512      return "TT_PROC_GET_FIRST_LWP_STATE";
513    case TT_PROC_GET_NEXT_LWP_STATE:
514      return "TT_PROC_GET_NEXT_LWP_STATE";
515    case TT_PROC_EXIT:
516      return "TT_PROC_EXIT";
517    case TT_PROC_GET_MPROTECT:
518      return "TT_PROC_GET_MPROTECT";
519    case TT_PROC_SET_MPROTECT:
520      return "TT_PROC_SET_MPROTECT";
521    case TT_PROC_SET_SCBM:
522      return "TT_PROC_SET_SCBM";
523    case TT_LWP_STOP:
524      return "TT_LWP_STOP";
525    case TT_LWP_CONTINUE:
526      return "TT_LWP_CONTINUE";
527    case TT_LWP_SINGLE:
528      return "TT_LWP_SINGLE";
529    case TT_LWP_RUREGS:
530      return "TT_LWP_RUREGS";
531    case TT_LWP_WUREGS:
532      return "TT_LWP_WUREGS";
533    case TT_LWP_GET_EVENT_MASK:
534      return "TT_LWP_GET_EVENT_MASK";
535    case TT_LWP_SET_EVENT_MASK:
536      return "TT_LWP_SET_EVENT_MASK";
537    case TT_LWP_GET_STATE:
538      return "TT_LWP_GET_STATE";
539    default:
540      return "?new req?";
541    }
542}
543
544
545/* This function translates the process state enumeration into
546 * a character string that is its printable (aka "human readable")
547 * name.
548 */
549static char *
550get_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 */
571static void
572clear_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 */
582static void
583copy_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 */
590static int
591any_thread_records (void)
592{
593  return (thread_head.count > 0);
594}
595
596/* Create, fill in and link in a thread descriptor.
597 */
598static thread_info *
599create_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 */
674static void
675clear_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 */
716static thread_info *
717find_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 */
747static lwpid_t
748map_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 */
796static lwpid_t
797map_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 */
826static int
827saved_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 */
844static int
845is_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 */
856static int
857is_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 */
869static int
870is_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 */
908static thread_info *
909add_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 */
922static void
923del_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 */
1007static int
1008get_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 */
1033static void
1034set_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 */
1047static int
1048was_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 */
1061static void
1062clear_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 */
1080static void
1081clear_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 */
1103static void
1104clear_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 */
1122static void
1123clear_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 */
1145static void
1146set_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 */
1159static void
1160print_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
1191static void
1192print_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 */
1231static void
1232update_thread_list (void)
1233{
1234  thread_info *p;
1235  thread_info *chase;
1236
1237  chase = NULL;
1238  for (p = thread_head.head; p; p = p->next)
1239    {
1240      /* Is this an "unseen" thread which really happens to be a process?
1241         If so, is it inferior_ptid and is a vfork in flight?  If yes to
1242         all, then DON'T REMOVE IT!  We're in the midst of moving a vfork
1243         operation, which is a multiple step thing, to the point where we
1244         can touch the parent again.  We've most likely stopped to examine
1245         the child at a late stage in the vfork, and if we're not following
1246         the child, we'd best not treat the parent as a dead "thread"...
1247       */
1248      if ((!p->seen) && p->am_pseudo && vfork_in_flight
1249	  && (p->pid != vforking_child_pid))
1250	p->seen = 1;
1251
1252      if (!p->seen)
1253	{
1254	  /* Remove this one
1255	   */
1256
1257#ifdef THREAD_DEBUG
1258	  if (debug_on)
1259	    printf ("Delete unseen thread: %d \n", p->tid);
1260#endif
1261	  del_tthread (p->tid);
1262	}
1263    }
1264}
1265
1266
1267
1268/************************************************
1269 *            O/S call wrappers                 *
1270 ************************************************
1271 */
1272
1273/* This function simply calls ttrace with the given arguments.
1274 * It exists so that all calls to ttrace are isolated.  All
1275 * parameters should be as specified by "man 2 ttrace".
1276 *
1277 * No other "raw" calls to ttrace should exist in this module.
1278 */
1279static int
1280call_real_ttrace (ttreq_t request, pid_t pid, lwpid_t tid, TTRACE_ARG_TYPE addr,
1281		  TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2)
1282{
1283  int tt_status;
1284
1285  errno = 0;
1286  tt_status = ttrace (request, pid, tid, addr, data, addr2);
1287
1288#ifdef THREAD_DEBUG
1289  if (errno)
1290    {
1291      /* Don't bother for a known benign error: if you ask for the
1292       * first thread state, but there is only one thread and it's
1293       * not stopped, ttrace complains.
1294       *
1295       * We have this inside the #ifdef because our caller will do
1296       * this check for real.
1297       */
1298      if (request != TT_PROC_GET_FIRST_LWP_STATE
1299	  || errno != EPROTO)
1300	{
1301	  if (debug_on)
1302	    printf ("TT fail for %s, with pid %d, tid %d, status %d \n",
1303		    get_printable_name_of_ttrace_request (request),
1304		    pid, tid, tt_status);
1305	}
1306    }
1307#endif
1308
1309#if 0
1310  /* ??rehrauer: It would probably be most robust to catch and report
1311   * failed requests here.  However, some clients of this interface
1312   * seem to expect to catch & deal with them, so we'd best not.
1313   */
1314  if (errno)
1315    {
1316      strcpy (reason_for_failure, "ttrace (");
1317      strcat (reason_for_failure, get_printable_name_of_ttrace_request (request));
1318      strcat (reason_for_failure, ")");
1319      printf ("ttrace error, errno = %d\n", errno);
1320      perror_with_name (reason_for_failure);
1321    }
1322#endif
1323
1324  return tt_status;
1325}
1326
1327
1328/* This function simply calls ttrace_wait with the given arguments.
1329 * It exists so that all calls to ttrace_wait are isolated.
1330 *
1331 * No "raw" calls to ttrace_wait should exist elsewhere.
1332 */
1333static int
1334call_real_ttrace_wait (int pid, lwpid_t tid, ttwopt_t option, ttstate_t *tsp,
1335		       size_t tsp_size)
1336{
1337  int ttw_status;
1338  thread_info *tinfo = NULL;
1339
1340  errno = 0;
1341  ttw_status = ttrace_wait (pid, tid, option, tsp, tsp_size);
1342
1343  if (errno)
1344    {
1345#ifdef THREAD_DEBUG
1346      if (debug_on)
1347	printf ("TW fail with pid %d, tid %d \n", pid, tid);
1348#endif
1349
1350      perror_with_name ("ttrace wait");
1351    }
1352
1353  return ttw_status;
1354}
1355
1356
1357/* A process may have one or more kernel threads, of which all or
1358   none may be stopped.  This function returns the ID of the first
1359   kernel thread in a stopped state, or 0 if none are stopped.
1360
1361   This function can be used with get_process_next_stopped_thread_id
1362   to iterate over the IDs of all stopped threads of this process.
1363 */
1364static lwpid_t
1365get_process_first_stopped_thread_id (int pid, ttstate_t *thread_state)
1366{
1367  int tt_status;
1368
1369  tt_status = call_real_ttrace (TT_PROC_GET_FIRST_LWP_STATE,
1370				(pid_t) pid,
1371				(lwpid_t) TT_NIL,
1372				(TTRACE_ARG_TYPE) thread_state,
1373				(TTRACE_ARG_TYPE) sizeof (*thread_state),
1374				TT_NIL);
1375
1376  if (errno)
1377    {
1378      if (errno == EPROTO)
1379	{
1380	  /* This is an error we can handle: there isn't any stopped
1381	   * thread.  This happens when we're re-starting the application
1382	   * and it has only one thread.  GET_NEXT handles the case of
1383	   * no more stopped threads well; GET_FIRST doesn't.  (A ttrace
1384	   * "feature".)
1385	   */
1386	  tt_status = 1;
1387	  errno = 0;
1388	  return 0;
1389	}
1390      else
1391	perror_with_name ("ttrace");
1392    }
1393
1394  if (tt_status < 0)
1395    /* Failed somehow.
1396     */
1397    return 0;
1398
1399  return thread_state->tts_lwpid;
1400}
1401
1402
1403/* This function returns the ID of the "next" kernel thread in a
1404   stopped state, or 0 if there are none.  "Next" refers to the
1405   thread following that of the last successful call to this
1406   function or to get_process_first_stopped_thread_id, using
1407   the value of thread_state returned by that call.
1408
1409   This function can be used with get_process_first_stopped_thread_id
1410   to iterate over the IDs of all stopped threads of this process.
1411 */
1412static lwpid_t
1413get_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 */
1454static lwpid_t
1455get_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 */
1465int
1466is_process_ttrace_request (ttreq_t tt_request)
1467{
1468  return IS_TTRACE_PROCREQ (tt_request);
1469}
1470
1471
1472/* This function translates a thread ttrace request into
1473 * the equivalent process request for a one-thread process.
1474 */
1475static ttreq_t
1476make_process_version (ttreq_t request)
1477{
1478  if (!IS_TTRACE_REQ (request))
1479    {
1480      error ("Internal error, bad ttrace request made\n");
1481      return -1;
1482    }
1483
1484  switch (request)
1485    {
1486    case TT_LWP_STOP:
1487      return TT_PROC_STOP;
1488
1489    case TT_LWP_CONTINUE:
1490      return TT_PROC_CONTINUE;
1491
1492    case TT_LWP_GET_EVENT_MASK:
1493      return TT_PROC_GET_EVENT_MASK;
1494
1495    case TT_LWP_SET_EVENT_MASK:
1496      return TT_PROC_SET_EVENT_MASK;
1497
1498    case TT_LWP_SINGLE:
1499    case TT_LWP_RUREGS:
1500    case TT_LWP_WUREGS:
1501    case TT_LWP_GET_STATE:
1502      return -1;		/* No equivalent */
1503
1504    default:
1505      return request;
1506    }
1507}
1508
1509
1510/* This function translates the "pid" used by the rest of
1511 * gdb to a real pid and a tid.  It then calls "call_real_ttrace"
1512 * with the given arguments.
1513 *
1514 * In general, other parts of this module should call this
1515 * function when they are dealing with external users, who only
1516 * have tids to pass (but they call it "pid" for historical
1517 * reasons).
1518 */
1519static int
1520call_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 */
1719static void
1720stop_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
1757static int
1758can_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 */
1785static int
1786select_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 */
1939static void
1940check_thread_consistency (pid_t real_pid)
1941{
1942  int tid;			/* really lwpid_t */
1943  ttstate_t tstate;
1944  thread_info *p;
1945
1946  /* Spin down the O/S list of threads, checking that they
1947   * match what we've got.
1948   */
1949  for (tid = get_process_first_stopped_thread_id (real_pid, &tstate);
1950       tid != 0;
1951       tid = get_process_next_stopped_thread_id (real_pid, &tstate))
1952    {
1953
1954      p = find_thread_info (tid);
1955
1956      if (NULL == p)
1957	{
1958	  warning ("No internal thread data for thread %d.", tid);
1959	  continue;
1960	}
1961
1962      if (!p->seen)
1963	{
1964	  warning ("Inconsistent internal thread data for thread %d.", tid);
1965	}
1966
1967      if (p->terminated)
1968	{
1969	  warning ("Thread %d is not terminated, internal error.", tid);
1970	  continue;
1971	}
1972
1973
1974#define TT_COMPARE( fld ) \
1975            tstate.fld != p->last_stop_state.fld
1976
1977      if (p->have_state)
1978	{
1979	  if (TT_COMPARE (tts_pid)
1980	      || TT_COMPARE (tts_lwpid)
1981	      || TT_COMPARE (tts_user_tid)
1982	      || TT_COMPARE (tts_event)
1983	      || TT_COMPARE (tts_flags)
1984	      || TT_COMPARE (tts_scno)
1985	      || TT_COMPARE (tts_scnargs))
1986	    {
1987	      warning ("Internal thread data for thread %d is wrong.", tid);
1988	      continue;
1989	    }
1990	}
1991    }
1992}
1993#endif /* PARANOIA */
1994
1995
1996/* This function wraps calls to "call_real_ttrace_wait" so
1997 * that a actual wait is only done when all pending events
1998 * have been reported.
1999 *
2000 * Note that typically it is called with a pid of "0", i.e.
2001 * the "don't care" value.
2002 *
2003 * Return value is the status of the pseudo wait.
2004 */
2005static int
2006call_ttrace_wait (int pid, ttwopt_t option, ttstate_t *tsp, size_t tsp_size)
2007{
2008  /* This holds the actual, for-real, true process ID.
2009   */
2010  static int real_pid;
2011
2012  /* As an argument to ttrace_wait, zero pid
2013   * means "Any process", and zero tid means
2014   * "Any thread of the specified process".
2015   */
2016  int wait_pid = 0;
2017  lwpid_t wait_tid = 0;
2018  lwpid_t real_tid;
2019
2020  int ttw_status = 0;		/* To be returned */
2021
2022  thread_info *tinfo = NULL;
2023
2024  if (pid != 0)
2025    {
2026      /* Unexpected case.
2027       */
2028#ifdef THREAD_DEBUG
2029      if (debug_on)
2030	printf ("TW: Pid to wait on is %d\n", pid);
2031#endif
2032
2033      if (!any_thread_records ())
2034	error ("No thread records for ttrace call w. specific pid");
2035
2036      /* OK, now the task is to translate the incoming tid into
2037       * a pid/tid pair.
2038       */
2039      real_tid = map_from_gdb_tid (pid);
2040      real_pid = get_pid_for (real_tid);
2041#ifdef THREAD_DEBUG
2042      if (debug_on)
2043	printf ("==TW: real pid %d, real tid %d\n", real_pid, real_tid);
2044#endif
2045    }
2046
2047
2048  /* Sanity checks and set-up.
2049   *                             Process State
2050   *
2051   *                        Stopped   Running    Fake-step  (v)Fork
2052   *                      \________________________________________
2053   *                      |
2054   *  No buffered events  |  error     wait       wait      wait
2055   *                      |
2056   *  Buffered events     |  debuffer  error      wait      debuffer (?)
2057   *
2058   */
2059  if (more_events_left == 0)
2060    {
2061
2062      if (process_state == RUNNING)
2063	{
2064	  /* OK--normal call of ttrace_wait with no buffered events.
2065	   */
2066	  ;
2067	}
2068      else if (process_state == FAKE_STEPPING)
2069	{
2070	  /* Ok--call of ttrace_wait to support
2071	   * fake stepping with no buffered events.
2072	   *
2073	   * But we better be fake-stepping!
2074	   */
2075	  if (!doing_fake_step)
2076	    {
2077	      warning ("Inconsistent thread state.");
2078	    }
2079	}
2080      else if ((process_state == FORKING)
2081	       || (process_state == VFORKING))
2082	{
2083	  /* Ok--there are two processes, so waiting
2084	   * for the second while the first is stopped
2085	   * is ok.  Handled bits stay as they were.
2086	   */
2087	  ;
2088	}
2089      else if (process_state == STOPPED)
2090	{
2091	  warning ("Process not running at wait call.");
2092	}
2093      else
2094	/* No known state.
2095	 */
2096	warning ("Inconsistent process state.");
2097    }
2098
2099  else
2100    {
2101      /* More events left
2102       */
2103      if (process_state == STOPPED)
2104	{
2105	  /* OK--buffered events being unbuffered.
2106	   */
2107	  ;
2108	}
2109      else if (process_state == RUNNING)
2110	{
2111	  /* An error--shouldn't have buffered events
2112	   * when running.
2113	   */
2114	  warning ("Trying to continue with buffered events:");
2115	}
2116      else if (process_state == FAKE_STEPPING)
2117	{
2118	  /*
2119	   * Better be fake-stepping!
2120	   */
2121	  if (!doing_fake_step)
2122	    {
2123	      warning ("Losing buffered thread events!\n");
2124	    }
2125	}
2126      else if ((process_state == FORKING)
2127	       || (process_state == VFORKING))
2128	{
2129	  /* Ok--there are two processes, so waiting
2130	   * for the second while the first is stopped
2131	   * is ok.  Handled bits stay as they were.
2132	   */
2133	  ;
2134	}
2135      else
2136	warning ("Process in unknown state with buffered events.");
2137    }
2138
2139  /* Sometimes we have to wait for a particular thread
2140   * (if we're stepping over a bpt).  In that case, we
2141   * _know_ it's going to complete the single-step we
2142   * asked for (because we're only doing the step under
2143   * certain very well-understood circumstances), so it
2144   * can't block.
2145   */
2146  if (doing_fake_step)
2147    {
2148      wait_tid = fake_step_tid;
2149      wait_pid = get_pid_for (fake_step_tid);
2150
2151#ifdef WAIT_BUFFER_DEBUG
2152      if (debug_on)
2153	printf ("Doing a wait after a fake-step for %d, pid %d\n",
2154		wait_tid, wait_pid);
2155#endif
2156    }
2157
2158  if (more_events_left == 0	/* No buffered events, need real ones. */
2159      || process_state != STOPPED)
2160    {
2161      /* If there are no buffered events, and so we need
2162       * real ones, or if we are FORKING, VFORKING,
2163       * FAKE_STEPPING or RUNNING, and thus have to do
2164       * a real wait, then do a real wait.
2165       */
2166
2167#ifdef WAIT_BUFFER_DEBUG
2168      /* Normal case... */
2169      if (debug_on)
2170	printf ("TW: do it for real; pid %d, tid %d\n", wait_pid, wait_tid);
2171#endif
2172
2173      /* The actual wait call.
2174       */
2175      ttw_status = call_real_ttrace_wait (wait_pid, wait_tid, option, tsp, tsp_size);
2176
2177      /* Note that the routines we'll call will be using "call_real_ttrace",
2178       * not "call_ttrace", and thus need the real pid rather than the pseudo-tid
2179       * the rest of the world uses (which is actually the tid).
2180       */
2181      real_pid = tsp->tts_pid;
2182
2183      /* For most events: Stop the world!
2184
2185       * It's sometimes not safe to stop all threads of a process.
2186       * Sometimes it's not even safe to ask for the thread state
2187       * of a process!
2188       */
2189      if (can_touch_threads_of_process (real_pid, tsp->tts_event))
2190	{
2191	  /* If we're really only stepping a single thread, then don't
2192	   * try to stop all the others -- we only do this single-stepping
2193	   * business when all others were already stopped...and the stop
2194	   * would mess up other threads' events.
2195	   *
2196	   * Similiarly, if there are other threads with events,
2197	   * don't do the stop.
2198	   */
2199	  if (!doing_fake_step)
2200	    {
2201	      if (more_events_left > 0)
2202		warning ("Internal error in stopping process");
2203
2204	      stop_all_threads_of_process (real_pid);
2205
2206	      /* At this point, we could scan and update_thread_list(),
2207	       * and only use the local list for the rest of the
2208	       * module! We'd get rid of the scans in the various
2209	       * continue routines (adding one in attach).  It'd
2210	       * be great--UPGRADE ME!
2211	       */
2212	    }
2213	}
2214
2215#ifdef PARANOIA
2216      else if (debug_on)
2217	{
2218	  if (more_events_left > 0)
2219	    printf ("== Can't stop process; more events!\n");
2220	  else
2221	    printf ("== Can't stop process!\n");
2222	}
2223#endif
2224
2225      process_state = STOPPED;
2226
2227#ifdef WAIT_BUFFER_DEBUG
2228      if (debug_on)
2229	printf ("Process set to STOPPED\n");
2230#endif
2231    }
2232
2233  else
2234    {
2235      /* Fake a call to ttrace_wait.  The process must be
2236       * STOPPED, as we aren't going to do any wait.
2237       */
2238#ifdef WAIT_BUFFER_DEBUG
2239      if (debug_on)
2240	printf ("TW: fake it\n");
2241#endif
2242
2243      if (process_state != STOPPED)
2244	{
2245	  warning ("Process not stopped at wait call, in state '%s'.\n",
2246		   get_printable_name_of_process_state (process_state));
2247	}
2248
2249      if (doing_fake_step)
2250	error ("Internal error in stepping over breakpoint");
2251
2252      ttw_status = 0;		/* Faking it is always successful! */
2253    }				/* End of fake or not? if */
2254
2255  /* Pick an event to pass to our caller.  Be paranoid.
2256   */
2257  if (!select_stopped_thread_of_process (real_pid, tsp))
2258    warning ("Can't find event, using previous event.");
2259
2260  else if (tsp->tts_event == TTEVT_NONE)
2261    warning ("Internal error: no thread has a real event.");
2262
2263  else if (doing_fake_step)
2264    {
2265      if (fake_step_tid != tsp->tts_lwpid)
2266	warning ("Internal error in stepping over breakpoint.");
2267
2268      /* This wait clears the (current) fake-step if there was one.
2269       */
2270      doing_fake_step = 0;
2271      fake_step_tid = 0;
2272    }
2273
2274  /* We now have a correct tsp and ttw_status for the thread
2275   * which we want to report.  So it's "handled"!  This call
2276   * will add it to our list if it's not there already.
2277   */
2278  set_handled (real_pid, tsp->tts_lwpid);
2279
2280  /* Save a copy of the ttrace state of this thread, in our local
2281     thread descriptor.
2282
2283     This caches the state.  The implementation of queries like
2284     hpux_has_execd can then use this cached state, rather than
2285     be forced to make an explicit ttrace call to get it.
2286
2287     (Guard against the condition that this is the first time we've
2288     waited on, i.e., seen this thread, and so haven't yet entered
2289     it into our list of threads.)
2290   */
2291  tinfo = find_thread_info (tsp->tts_lwpid);
2292  if (tinfo != NULL)
2293    {
2294      copy_ttstate_t (&tinfo->last_stop_state, tsp);
2295      tinfo->have_state = 1;
2296    }
2297
2298  return ttw_status;
2299}				/* call_ttrace_wait */
2300
2301#if defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
2302int
2303child_reported_exec_events_per_exec_call (void)
2304{
2305  return 1;			/* ttrace reports the event once per call. */
2306}
2307#endif
2308
2309
2310
2311/* Our implementation of hardware watchpoints involves making memory
2312   pages write-protected.  We must remember a page's original permissions,
2313   and we must also know when it is appropriate to restore a page's
2314   permissions to its original state.
2315
2316   We use a "dictionary" of hardware-watched pages to do this.  Each
2317   hardware-watched page is recorded in the dictionary.  Each page's
2318   dictionary entry contains the original permissions and a reference
2319   count.  Pages are hashed into the dictionary by their start address.
2320
2321   When hardware watchpoint is set on page X for the first time, page X
2322   is added to the dictionary with a reference count of 1.  If other
2323   hardware watchpoints are subsequently set on page X, its reference
2324   count is incremented.  When hardware watchpoints are removed from
2325   page X, its reference count is decremented.  If a page's reference
2326   count drops to 0, it's permissions are restored and the page's entry
2327   is thrown out of the dictionary.
2328 */
2329typedef 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}
2337memory_page_t;
2338
2339#define MEMORY_PAGE_DICTIONARY_BUCKET_COUNT  128
2340
2341static 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  }
2349memory_page_dictionary;
2350
2351
2352static void
2353require_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
2374static void
2375retire_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 */
2385static int
2386write_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 */
2424static void
2425unwrite_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 */
2447void
2448hppa_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 */
2474void
2475hppa_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 */
2501static int
2502count_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 */
2599int
2600ptrace_wait (ptid_t ptid, int *status)
2601{
2602  ttstate_t tsp;
2603  int ttwait_return;
2604  int real_pid;
2605  ttstate_t state;
2606  lwpid_t real_tid;
2607  int return_pid;
2608
2609  /* The ptrace implementation of this also ignores pid.
2610   */
2611  *status = 0;
2612
2613  ttwait_return = call_ttrace_wait (0, TTRACE_WAITOK, &tsp, sizeof (tsp));
2614  if (ttwait_return < 0)
2615    {
2616      /* ??rehrauer: It appears that if our inferior exits and we
2617         haven't asked for exit events, that we're not getting any
2618         indication save a negative return from ttrace_wait and an
2619         errno set to ESRCH?
2620       */
2621      if (errno == ESRCH)
2622	{
2623	  *status = 0;		/* WIFEXITED */
2624	  return PIDGET (inferior_ptid);
2625	}
2626
2627      warning ("Call of ttrace_wait returned with errno %d.",
2628	       errno);
2629      *status = ttwait_return;
2630      return PIDGET (inferior_ptid);
2631    }
2632
2633  real_pid = tsp.tts_pid;
2634  real_tid = tsp.tts_lwpid;
2635
2636  /* One complication is that the "tts_event" structure has
2637   * a set of flags, and more than one can be set.  So we
2638   * either have to force an order (as we do here), or handle
2639   * more than one flag at a time.
2640   */
2641  if (tsp.tts_event & TTEVT_LWP_CREATE)
2642    {
2643
2644      /* Unlike what you might expect, this event is reported in
2645       * the _creating_ thread, and the _created_ thread (whose tid
2646       * we have) is still running.  So we have to stop it.  This
2647       * has already been done in "call_ttrace_wait", but should we
2648       * ever abandon the "stop-the-world" model, here's the command
2649       * to use:
2650       *
2651       *    call_ttrace( TT_LWP_STOP, real_tid, TT_NIL, TT_NIL, TT_NIL );
2652       *
2653       * Note that this would depend on being called _after_ "add_tthread"
2654       * below for the tid-to-pid translation to be done in "call_ttrace".
2655       */
2656
2657#ifdef THREAD_DEBUG
2658      if (debug_on)
2659	printf ("New thread: pid %d, tid %d, creator tid %d\n",
2660		real_pid, tsp.tts_u.tts_thread.tts_target_lwpid,
2661		real_tid);
2662#endif
2663
2664      /* Now we have to return the tid of the created thread, not
2665       * the creating thread, or "wait_for_inferior" won't know we
2666       * have a new "process" (thread).  Plus we should record it
2667       * right, too.
2668       */
2669      real_tid = tsp.tts_u.tts_thread.tts_target_lwpid;
2670
2671      add_tthread (real_pid, real_tid);
2672    }
2673
2674  else if ((tsp.tts_event & TTEVT_LWP_TERMINATE)
2675	   || (tsp.tts_event & TTEVT_LWP_EXIT))
2676    {
2677
2678#ifdef THREAD_DEBUG
2679      if (debug_on)
2680	printf ("Thread dies: %d\n", real_tid);
2681#endif
2682
2683      del_tthread (real_tid);
2684    }
2685
2686  else if (tsp.tts_event & TTEVT_EXEC)
2687    {
2688
2689#ifdef THREAD_DEBUG
2690      if (debug_on)
2691	printf ("Pid %d has zero'th thread %d; inferior pid is %d\n",
2692		real_pid, real_tid, PIDGET (inferior_ptid));
2693#endif
2694
2695      add_tthread (real_pid, real_tid);
2696    }
2697
2698#ifdef THREAD_DEBUG
2699  else if (debug_on)
2700    {
2701      printf ("Process-level event %s, using tid %d\n",
2702	      get_printable_name_of_ttrace_event (tsp.tts_event),
2703	      real_tid);
2704
2705      /* OK to do this, as "add_tthread" won't add
2706       * duplicate entries.  Also OK not to do it,
2707       * as this event isn't one which can change the
2708       * thread state.
2709       */
2710      add_tthread (real_pid, real_tid);
2711    }
2712#endif
2713
2714
2715  /* How many events are left to report later?
2716   * In a non-stop-the-world model, this isn't needed.
2717   *
2718   * Note that it's not always safe to query the thread state of a process,
2719   * which is what count_unhandled_events does.  (If unsafe, we're left with
2720   * no other resort than to assume that no more events remain...)
2721   */
2722  if (can_touch_threads_of_process (real_pid, tsp.tts_event))
2723    more_events_left = count_unhandled_events (real_pid, real_tid);
2724
2725  else
2726    {
2727      if (more_events_left > 0)
2728	warning ("Vfork or fork causing loss of %d buffered events.",
2729		 more_events_left);
2730
2731      more_events_left = 0;
2732    }
2733
2734  /* Attempt to translate the ttrace_wait-returned status into the
2735     ptrace equivalent.
2736
2737     ??rehrauer: This is somewhat fragile.  We really ought to rewrite
2738     clients that expect to pick apart a ptrace wait status, to use
2739     something a little more abstract.
2740   */
2741  if ((tsp.tts_event & TTEVT_EXEC)
2742      || (tsp.tts_event & TTEVT_FORK)
2743      || (tsp.tts_event & TTEVT_VFORK))
2744    {
2745      /* Forks come in pairs (parent and child), so core gdb
2746       * will do two waits.  Be ready to notice this.
2747       */
2748      if (tsp.tts_event & TTEVT_FORK)
2749	{
2750	  process_state = FORKING;
2751
2752#ifdef WAIT_BUFFER_DEBUG
2753	  if (debug_on)
2754	    printf ("Process set to FORKING\n");
2755#endif
2756	}
2757      else if (tsp.tts_event & TTEVT_VFORK)
2758	{
2759	  process_state = VFORKING;
2760
2761#ifdef WAIT_BUFFER_DEBUG
2762	  if (debug_on)
2763	    printf ("Process set to VFORKING\n");
2764#endif
2765	}
2766
2767      /* Make an exec or fork look like a breakpoint.  Definitely a hack,
2768         but I don't think non HP-UX-specific clients really carefully
2769         inspect the first events they get after inferior startup, so
2770         it probably almost doesn't matter what we claim this is.
2771       */
2772
2773#ifdef THREAD_DEBUG
2774      if (debug_on)
2775	printf ("..a process 'event'\n");
2776#endif
2777
2778      /* Also make fork and exec events look like bpts, so they can be caught.
2779       */
2780      *status = 0177 | (_SIGTRAP << 8);
2781    }
2782
2783  /* Special-cases: We ask for syscall entry and exit events to implement
2784     "fast" (aka "hardware") watchpoints.
2785
2786     When we get a syscall entry, we want to disable page-protections,
2787     and resume the inferior; this isn't an event we wish for
2788     wait_for_inferior to see.  Note that we must resume ONLY the
2789     thread that reported the syscall entry; we don't want to allow
2790     other threads to run with the page protections off, as they might
2791     then be able to write to watch memory without it being caught.
2792
2793     When we get a syscall exit, we want to reenable page-protections,
2794     but we don't want to resume the inferior; this is an event we wish
2795     wait_for_inferior to see.  Make it look like the signal we normally
2796     get for a single-step completion.  This should cause wait_for_inferior
2797     to evaluate whether any watchpoint triggered.
2798
2799     Or rather, that's what we'd LIKE to do for syscall exit; we can't,
2800     due to some HP-UX "features".  Some syscalls have problems with
2801     write-protections on some pages, and some syscalls seem to have
2802     pending writes to those pages at the time we're getting the return
2803     event.  So, we'll single-step the inferior to get out of the syscall,
2804     and then reenable protections.
2805
2806     Note that we're intentionally allowing the syscall exit case to
2807     fall through into the succeeding cases, as sometimes we single-
2808     step out of one syscall only to immediately enter another...
2809   */
2810  else if ((tsp.tts_event & TTEVT_SYSCALL_ENTRY)
2811	   || (tsp.tts_event & TTEVT_SYSCALL_RETURN))
2812    {
2813      /* Make a syscall event look like a breakpoint.  Same comments
2814         as for exec & fork events.
2815       */
2816#ifdef THREAD_DEBUG
2817      if (debug_on)
2818	printf ("..a syscall 'event'\n");
2819#endif
2820
2821      /* Also make syscall events look like bpts, so they can be caught.
2822       */
2823      *status = 0177 | (_SIGTRAP << 8);
2824    }
2825
2826  else if ((tsp.tts_event & TTEVT_LWP_CREATE)
2827	   || (tsp.tts_event & TTEVT_LWP_TERMINATE)
2828	   || (tsp.tts_event & TTEVT_LWP_EXIT))
2829    {
2830      /* Make a thread event look like a breakpoint.  Same comments
2831       * as for exec & fork events.
2832       */
2833#ifdef THREAD_DEBUG
2834      if (debug_on)
2835	printf ("..a thread 'event'\n");
2836#endif
2837
2838      /* Also make thread events look like bpts, so they can be caught.
2839       */
2840      *status = 0177 | (_SIGTRAP << 8);
2841    }
2842
2843  else if ((tsp.tts_event & TTEVT_EXIT))
2844    {				/* WIFEXITED */
2845
2846#ifdef THREAD_DEBUG
2847      if (debug_on)
2848	printf ("..an exit\n");
2849#endif
2850
2851      /* Prevent rest of gdb from thinking this is
2852       * a new thread if for some reason it's never
2853       * seen the main thread before.
2854       */
2855      inferior_ptid = pid_to_ptid (map_to_gdb_tid (real_tid));	/* HACK, FIX */
2856
2857      *status = 0 | (tsp.tts_u.tts_exit.tts_exitcode);
2858    }
2859
2860  else if (tsp.tts_event & TTEVT_SIGNAL)
2861    {				/* WIFSTOPPED */
2862#ifdef THREAD_DEBUG
2863      if (debug_on)
2864	printf ("..a signal, %d\n", tsp.tts_u.tts_signal.tts_signo);
2865#endif
2866
2867      *status = 0177 | (tsp.tts_u.tts_signal.tts_signo << 8);
2868    }
2869
2870  else
2871    {				/* !WIFSTOPPED */
2872
2873      /* This means the process or thread terminated.  But we should've
2874         caught an explicit exit/termination above.  So warn (this is
2875         really an internal error) and claim the process or thread
2876         terminated with a SIGTRAP.
2877       */
2878
2879      warning ("process_wait: unknown process state");
2880
2881#ifdef THREAD_DEBUG
2882      if (debug_on)
2883	printf ("Process-level event %s, using tid %d\n",
2884		get_printable_name_of_ttrace_event (tsp.tts_event),
2885		real_tid);
2886#endif
2887
2888      *status = _SIGTRAP;
2889    }
2890
2891#ifdef THREAD_DEBUG
2892  if (debug_on)
2893    printf ("Done waiting, pid is %d, tid %d\n", real_pid, real_tid);
2894#endif
2895
2896  /* All code external to this module uses the tid, but calls
2897   * it "pid".  There's some tweaking so that the outside sees
2898   * the first thread as having the same number as the starting
2899   * pid.
2900   */
2901  return_pid = map_to_gdb_tid (real_tid);
2902
2903  if (real_tid == 0 || return_pid == 0)
2904    {
2905      warning ("Internal error: process-wait failed.");
2906    }
2907
2908  return return_pid;
2909}
2910
2911
2912/* This function causes the caller's process to be traced by its
2913   parent.  This is intended to be called after GDB forks itself,
2914   and before the child execs the target.  Despite the name, it
2915   is called by the child.
2916
2917   Note that HP-UX ttrace is rather funky in how this is done.
2918   If the parent wants to get the initial exec event of a child,
2919   it must set the ttrace event mask of the child to include execs.
2920   (The child cannot do this itself.)  This must be done after the
2921   child is forked, but before it execs.
2922
2923   To coordinate the parent and child, we implement a semaphore using
2924   pipes.  After SETTRC'ing itself, the child tells the parent that
2925   it is now traceable by the parent, and waits for the parent's
2926   acknowledgement.  The parent can then set the child's event mask,
2927   and notify the child that it can now exec.
2928
2929   (The acknowledgement by parent happens as a result of a call to
2930   child_acknowledge_created_inferior.)
2931 */
2932int
2933parent_attach_all (int p1, PTRACE_ARG3_TYPE p2, int p3)
2934{
2935  int tt_status;
2936
2937  /* We need a memory home for a constant, to pass it to ttrace.
2938     The value of the constant is arbitrary, so long as both
2939     parent and child use the same value.  Might as well use the
2940     "magic" constant provided by ttrace...
2941   */
2942  uint64_t tc_magic_child = TT_VERSION;
2943  uint64_t tc_magic_parent = 0;
2944
2945  tt_status = call_real_ttrace (
2946				 TT_PROC_SETTRC,
2947				 (int) TT_NIL,
2948				 (lwpid_t) TT_NIL,
2949				 TT_NIL,
2950				 (TTRACE_ARG_TYPE) TT_VERSION,
2951				 TT_NIL);
2952
2953  if (tt_status < 0)
2954    return tt_status;
2955
2956  /* Notify the parent that we're potentially ready to exec(). */
2957  write (startup_semaphore.child_channel[SEM_TALK],
2958	 &tc_magic_child,
2959	 sizeof (tc_magic_child));
2960
2961  /* Wait for acknowledgement from the parent. */
2962  read (startup_semaphore.parent_channel[SEM_LISTEN],
2963	&tc_magic_parent,
2964	sizeof (tc_magic_parent));
2965
2966  if (tc_magic_child != tc_magic_parent)
2967    warning ("mismatched semaphore magic");
2968
2969  /* Discard our copy of the semaphore. */
2970  (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
2971  (void) close (startup_semaphore.parent_channel[SEM_TALK]);
2972  (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
2973  (void) close (startup_semaphore.child_channel[SEM_TALK]);
2974
2975  return tt_status;
2976}
2977
2978/* Despite being file-local, this routine is dealing with
2979 * actual process IDs, not thread ids.  That's because it's
2980 * called before the first "wait" call, and there's no map
2981 * yet from tids to pids.
2982 *
2983 * When it is called, a forked child is running, but waiting on
2984 * the semaphore.  If you stop the child and re-start it,
2985 * things get confused, so don't do that!  An attached child is
2986 * stopped.
2987 *
2988 * Since this is called after either attach or run, we
2989 * have to be the common part of both.
2990 */
2991static void
2992require_notification_of_events (int real_pid)
2993{
2994  int tt_status;
2995  ttevent_t notifiable_events;
2996
2997  lwpid_t tid;
2998  ttstate_t thread_state;
2999
3000#ifdef THREAD_DEBUG
3001  if (debug_on)
3002    printf ("Require notif, pid is %d\n", real_pid);
3003#endif
3004
3005  /* Temporary HACK: tell inftarg.c/child_wait to not
3006   * loop until pids are the same.
3007   */
3008  not_same_real_pid = 0;
3009
3010  sigemptyset (&notifiable_events.tte_signals);
3011  notifiable_events.tte_opts = TTEO_NONE;
3012
3013  /* This ensures that forked children inherit their parent's
3014   * event mask, which we're setting here.
3015   *
3016   * NOTE: if you debug gdb with itself, then the ultimate
3017   *       debuggee gets flags set by the outermost gdb, as
3018   *       a child of a child will still inherit.
3019   */
3020  notifiable_events.tte_opts |= TTEO_PROC_INHERIT;
3021
3022  notifiable_events.tte_events = TTEVT_DEFAULT;
3023  notifiable_events.tte_events |= TTEVT_SIGNAL;
3024  notifiable_events.tte_events |= TTEVT_EXEC;
3025  notifiable_events.tte_events |= TTEVT_EXIT;
3026  notifiable_events.tte_events |= TTEVT_FORK;
3027  notifiable_events.tte_events |= TTEVT_VFORK;
3028  notifiable_events.tte_events |= TTEVT_LWP_CREATE;
3029  notifiable_events.tte_events |= TTEVT_LWP_EXIT;
3030  notifiable_events.tte_events |= TTEVT_LWP_TERMINATE;
3031
3032  tt_status = call_real_ttrace (
3033				 TT_PROC_SET_EVENT_MASK,
3034				 real_pid,
3035				 (lwpid_t) TT_NIL,
3036				 (TTRACE_ARG_TYPE) & notifiable_events,
3037			       (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3038				 TT_NIL);
3039}
3040
3041static void
3042require_notification_of_exec_events (int real_pid)
3043{
3044  int tt_status;
3045  ttevent_t notifiable_events;
3046
3047  lwpid_t tid;
3048  ttstate_t thread_state;
3049
3050#ifdef THREAD_DEBUG
3051  if (debug_on)
3052    printf ("Require notif, pid is %d\n", real_pid);
3053#endif
3054
3055  /* Temporary HACK: tell inftarg.c/child_wait to not
3056   * loop until pids are the same.
3057   */
3058  not_same_real_pid = 0;
3059
3060  sigemptyset (&notifiable_events.tte_signals);
3061  notifiable_events.tte_opts = TTEO_NOSTRCCHLD;
3062
3063  /* This ensures that forked children don't inherit their parent's
3064   * event mask, which we're setting here.
3065   */
3066  notifiable_events.tte_opts &= ~TTEO_PROC_INHERIT;
3067
3068  notifiable_events.tte_events = TTEVT_DEFAULT;
3069  notifiable_events.tte_events |= TTEVT_EXEC;
3070  notifiable_events.tte_events |= TTEVT_EXIT;
3071
3072  tt_status = call_real_ttrace (
3073				 TT_PROC_SET_EVENT_MASK,
3074				 real_pid,
3075				 (lwpid_t) TT_NIL,
3076				 (TTRACE_ARG_TYPE) & notifiable_events,
3077			       (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3078				 TT_NIL);
3079}
3080
3081
3082/* This function is called by the parent process, with pid being the
3083 * ID of the child process, after the debugger has forked.
3084 */
3085void
3086child_acknowledge_created_inferior (int pid)
3087{
3088  /* We need a memory home for a constant, to pass it to ttrace.
3089     The value of the constant is arbitrary, so long as both
3090     parent and child use the same value.  Might as well use the
3091     "magic" constant provided by ttrace...
3092   */
3093  uint64_t tc_magic_parent = TT_VERSION;
3094  uint64_t tc_magic_child = 0;
3095
3096  /* Wait for the child to tell us that it has forked. */
3097  read (startup_semaphore.child_channel[SEM_LISTEN],
3098	&tc_magic_child,
3099	sizeof (tc_magic_child));
3100
3101  /* Clear thread info now.  We'd like to do this in
3102   * "require...", but that messes up attach.
3103   */
3104  clear_thread_info ();
3105
3106  /* Tell the "rest of gdb" that the initial thread exists.
3107   * This isn't really a hack.  Other thread-based versions
3108   * of gdb (e.g. gnu-nat.c) seem to do the same thing.
3109   *
3110   * Q: Why don't we also add this thread to the local
3111   *    list via "add_tthread"?
3112   *
3113   * A: Because we don't know the tid, and can't stop the
3114   *    the process safely to ask what it is.  Anyway, we'll
3115   *    add it when it gets the EXEC event.
3116   */
3117  add_thread (pid_to_ptid (pid));		/* in thread.c */
3118
3119  /* We can now set the child's ttrace event mask.
3120   */
3121  require_notification_of_exec_events (pid);
3122
3123  /* Tell ourselves that the process is running.
3124   */
3125  process_state = RUNNING;
3126
3127  /* Notify the child that it can exec. */
3128  write (startup_semaphore.parent_channel[SEM_TALK],
3129	 &tc_magic_parent,
3130	 sizeof (tc_magic_parent));
3131
3132  /* Discard our copy of the semaphore. */
3133  (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
3134  (void) close (startup_semaphore.parent_channel[SEM_TALK]);
3135  (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
3136  (void) close (startup_semaphore.child_channel[SEM_TALK]);
3137}
3138
3139
3140/*
3141 * arrange for notification of all events by
3142 * calling require_notification_of_events.
3143 */
3144void
3145child_post_startup_inferior (ptid_t ptid)
3146{
3147  require_notification_of_events (PIDGET (ptid));
3148}
3149
3150/* From here on, we should expect tids rather than pids.
3151 */
3152static void
3153hppa_enable_catch_fork (int tid)
3154{
3155  int tt_status;
3156  ttevent_t ttrace_events;
3157
3158  /* Get the set of events that are currently enabled.
3159   */
3160  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3161			   tid,
3162			   (TTRACE_ARG_TYPE) & ttrace_events,
3163			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3164			   TT_NIL);
3165  if (errno)
3166    perror_with_name ("ttrace");
3167
3168  /* Add forks to that set. */
3169  ttrace_events.tte_events |= TTEVT_FORK;
3170
3171#ifdef THREAD_DEBUG
3172  if (debug_on)
3173    printf ("enable fork, tid is %d\n", tid);
3174#endif
3175
3176  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3177			   tid,
3178			   (TTRACE_ARG_TYPE) & ttrace_events,
3179			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3180			   TT_NIL);
3181  if (errno)
3182    perror_with_name ("ttrace");
3183}
3184
3185
3186static void
3187hppa_disable_catch_fork (int tid)
3188{
3189  int tt_status;
3190  ttevent_t ttrace_events;
3191
3192  /* Get the set of events that are currently enabled.
3193   */
3194  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3195			   tid,
3196			   (TTRACE_ARG_TYPE) & ttrace_events,
3197			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3198			   TT_NIL);
3199
3200  if (errno)
3201    perror_with_name ("ttrace");
3202
3203  /* Remove forks from that set. */
3204  ttrace_events.tte_events &= ~TTEVT_FORK;
3205
3206#ifdef THREAD_DEBUG
3207  if (debug_on)
3208    printf ("disable fork, tid is %d\n", tid);
3209#endif
3210
3211  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3212			   tid,
3213			   (TTRACE_ARG_TYPE) & ttrace_events,
3214			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3215			   TT_NIL);
3216
3217  if (errno)
3218    perror_with_name ("ttrace");
3219}
3220
3221
3222#if defined(CHILD_INSERT_FORK_CATCHPOINT)
3223int
3224child_insert_fork_catchpoint (int tid)
3225{
3226  /* Enable reporting of fork events from the kernel. */
3227  /* ??rehrauer: For the moment, we're always enabling these events,
3228     and just ignoring them if there's no catchpoint to catch them.
3229   */
3230  return 0;
3231}
3232#endif
3233
3234
3235#if defined(CHILD_REMOVE_FORK_CATCHPOINT)
3236int
3237child_remove_fork_catchpoint (int tid)
3238{
3239  /* Disable reporting of fork events from the kernel. */
3240  /* ??rehrauer: For the moment, we're always enabling these events,
3241     and just ignoring them if there's no catchpoint to catch them.
3242   */
3243  return 0;
3244}
3245#endif
3246
3247
3248static void
3249hppa_enable_catch_vfork (int tid)
3250{
3251  int tt_status;
3252  ttevent_t ttrace_events;
3253
3254  /* Get the set of events that are currently enabled.
3255   */
3256  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3257			   tid,
3258			   (TTRACE_ARG_TYPE) & ttrace_events,
3259			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3260			   TT_NIL);
3261
3262  if (errno)
3263    perror_with_name ("ttrace");
3264
3265  /* Add vforks to that set. */
3266  ttrace_events.tte_events |= TTEVT_VFORK;
3267
3268#ifdef THREAD_DEBUG
3269  if (debug_on)
3270    printf ("enable vfork, tid is %d\n", tid);
3271#endif
3272
3273  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3274			   tid,
3275			   (TTRACE_ARG_TYPE) & ttrace_events,
3276			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3277			   TT_NIL);
3278
3279  if (errno)
3280    perror_with_name ("ttrace");
3281}
3282
3283
3284static void
3285hppa_disable_catch_vfork (int tid)
3286{
3287  int tt_status;
3288  ttevent_t ttrace_events;
3289
3290  /* Get the set of events that are currently enabled. */
3291  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3292			   tid,
3293			   (TTRACE_ARG_TYPE) & ttrace_events,
3294			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3295			   TT_NIL);
3296
3297  if (errno)
3298    perror_with_name ("ttrace");
3299
3300  /* Remove vforks from that set. */
3301  ttrace_events.tte_events &= ~TTEVT_VFORK;
3302
3303#ifdef THREAD_DEBUG
3304  if (debug_on)
3305    printf ("disable vfork, tid is %d\n", tid);
3306#endif
3307  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3308			   tid,
3309			   (TTRACE_ARG_TYPE) & ttrace_events,
3310			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3311			   TT_NIL);
3312
3313  if (errno)
3314    perror_with_name ("ttrace");
3315}
3316
3317
3318#if defined(CHILD_INSERT_VFORK_CATCHPOINT)
3319int
3320child_insert_vfork_catchpoint (int tid)
3321{
3322  /* Enable reporting of vfork events from the kernel. */
3323  /* ??rehrauer: For the moment, we're always enabling these events,
3324     and just ignoring them if there's no catchpoint to catch them.
3325   */
3326  return 0;
3327}
3328#endif
3329
3330
3331#if defined(CHILD_REMOVE_VFORK_CATCHPOINT)
3332int
3333child_remove_vfork_catchpoint (int tid)
3334{
3335  /* Disable reporting of vfork events from the kernel. */
3336  /* ??rehrauer: For the moment, we're always enabling these events,
3337     and just ignoring them if there's no catchpoint to catch them.
3338   */
3339  return 0;
3340}
3341#endif
3342
3343/* Q: Do we need to map the returned process ID to a thread ID?
3344
3345 * A: I don't think so--here we want a _real_ pid.  Any later
3346 *    operations will call "require_notification_of_events" and
3347 *    start the mapping.
3348 */
3349int
3350hpux_has_forked (int tid, int *childpid)
3351{
3352  int tt_status;
3353  ttstate_t ttrace_state;
3354  thread_info *tinfo;
3355
3356  /* Do we have cached thread state that we can consult?  If so, use it. */
3357  tinfo = find_thread_info (map_from_gdb_tid (tid));
3358  if (tinfo != NULL)
3359    {
3360      copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3361    }
3362
3363  /* Nope, must read the thread's current state */
3364  else
3365    {
3366      tt_status = call_ttrace (TT_LWP_GET_STATE,
3367			       tid,
3368			       (TTRACE_ARG_TYPE) & ttrace_state,
3369			       (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3370			       TT_NIL);
3371
3372      if (errno)
3373	perror_with_name ("ttrace");
3374
3375      if (tt_status < 0)
3376	return 0;
3377    }
3378
3379  if (ttrace_state.tts_event & TTEVT_FORK)
3380    {
3381      *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3382      return 1;
3383    }
3384
3385  return 0;
3386}
3387
3388/* See hpux_has_forked for pid discussion.
3389 */
3390int
3391hpux_has_vforked (int tid, int *childpid)
3392{
3393  int tt_status;
3394  ttstate_t ttrace_state;
3395  thread_info *tinfo;
3396
3397  /* Do we have cached thread state that we can consult?  If so, use it. */
3398  tinfo = find_thread_info (map_from_gdb_tid (tid));
3399  if (tinfo != NULL)
3400    copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3401
3402  /* Nope, must read the thread's current state */
3403  else
3404    {
3405      tt_status = call_ttrace (TT_LWP_GET_STATE,
3406			       tid,
3407			       (TTRACE_ARG_TYPE) & ttrace_state,
3408			       (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3409			       TT_NIL);
3410
3411      if (errno)
3412	perror_with_name ("ttrace");
3413
3414      if (tt_status < 0)
3415	return 0;
3416    }
3417
3418  if (ttrace_state.tts_event & TTEVT_VFORK)
3419    {
3420      *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3421      return 1;
3422    }
3423
3424  return 0;
3425}
3426
3427
3428#if defined(CHILD_INSERT_EXEC_CATCHPOINT)
3429int
3430child_insert_exec_catchpoint (int tid)
3431{
3432  /* Enable reporting of exec events from the kernel. */
3433  /* ??rehrauer: For the moment, we're always enabling these events,
3434     and just ignoring them if there's no catchpoint to catch them.
3435   */
3436  return 0;
3437}
3438#endif
3439
3440
3441#if defined(CHILD_REMOVE_EXEC_CATCHPOINT)
3442int
3443child_remove_exec_catchpoint (int tid)
3444{
3445  /* Disable reporting of execevents from the kernel. */
3446  /* ??rehrauer: For the moment, we're always enabling these events,
3447     and just ignoring them if there's no catchpoint to catch them.
3448   */
3449  return 0;
3450}
3451#endif
3452
3453
3454int
3455hpux_has_execd (int tid, char **execd_pathname)
3456{
3457  int tt_status;
3458  ttstate_t ttrace_state;
3459  thread_info *tinfo;
3460
3461  /* Do we have cached thread state that we can consult?  If so, use it. */
3462  tinfo = find_thread_info (map_from_gdb_tid (tid));
3463  if (tinfo != NULL)
3464    copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3465
3466  /* Nope, must read the thread's current state */
3467  else
3468    {
3469      tt_status = call_ttrace (TT_LWP_GET_STATE,
3470			       tid,
3471			       (TTRACE_ARG_TYPE) & ttrace_state,
3472			       (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3473			       TT_NIL);
3474
3475      if (errno)
3476	perror_with_name ("ttrace");
3477
3478      if (tt_status < 0)
3479	return 0;
3480    }
3481
3482  if (ttrace_state.tts_event & TTEVT_EXEC)
3483    {
3484      /* See child_pid_to_exec_file in this file: this is a macro.
3485       */
3486      char *exec_file = target_pid_to_exec_file (tid);
3487
3488      *execd_pathname = savestring (exec_file, strlen (exec_file));
3489      return 1;
3490    }
3491
3492  return 0;
3493}
3494
3495
3496int
3497hpux_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id)
3498{
3499  int tt_status;
3500  ttstate_t ttrace_state;
3501  thread_info *tinfo;
3502
3503  /* Do we have cached thread state that we can consult?  If so, use it. */
3504  tinfo = find_thread_info (map_from_gdb_tid (pid));
3505  if (tinfo != NULL)
3506    copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3507
3508  /* Nope, must read the thread's current state */
3509  else
3510    {
3511      tt_status = call_ttrace (TT_LWP_GET_STATE,
3512			       pid,
3513			       (TTRACE_ARG_TYPE) & ttrace_state,
3514			       (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3515			       TT_NIL);
3516
3517      if (errno)
3518	perror_with_name ("ttrace");
3519
3520      if (tt_status < 0)
3521	return 0;
3522    }
3523
3524  *kind = TARGET_WAITKIND_SPURIOUS;	/* Until proven otherwise... */
3525  *syscall_id = -1;
3526
3527  if (ttrace_state.tts_event & TTEVT_SYSCALL_ENTRY)
3528    *kind = TARGET_WAITKIND_SYSCALL_ENTRY;
3529  else if (ttrace_state.tts_event & TTEVT_SYSCALL_RETURN)
3530    *kind = TARGET_WAITKIND_SYSCALL_RETURN;
3531  else
3532    return 0;
3533
3534  *syscall_id = ttrace_state.tts_scno;
3535  return 1;
3536}
3537
3538
3539
3540#if defined(CHILD_THREAD_ALIVE)
3541
3542/* Check to see if the given thread is alive.
3543
3544 * We'll trust the thread list, as the more correct
3545 * approach of stopping the process and spinning down
3546 * the OS's thread list is _very_ expensive.
3547 *
3548 * May need a FIXME for that reason.
3549 */
3550int
3551child_thread_alive (ptid_t ptid)
3552{
3553  lwpid_t gdb_tid = PIDGET (ptid);
3554  lwpid_t tid;
3555
3556  /* This spins down the lists twice.
3557   * Possible peformance improvement here!
3558   */
3559  tid = map_from_gdb_tid (gdb_tid);
3560  return !is_terminated (tid);
3561}
3562
3563#endif
3564
3565
3566
3567/* This function attempts to read the specified number of bytes from the
3568   save_state_t that is our view into the hardware registers, starting at
3569   ss_offset, and ending at ss_offset + sizeof_buf - 1
3570
3571   If this function succeeds, it deposits the fetched bytes into buf,
3572   and returns 0.
3573
3574   If it fails, it returns a negative result.  The contents of buf are
3575   undefined it this function fails.
3576 */
3577int
3578read_from_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3579			       int sizeof_buf)
3580{
3581  int tt_status;
3582  register_value_t register_value = 0;
3583
3584  tt_status = call_ttrace (TT_LWP_RUREGS,
3585			   tid,
3586			   ss_offset,
3587			   (TTRACE_ARG_TYPE) sizeof_buf,
3588			   (TTRACE_ARG_TYPE) buf);
3589
3590  if (tt_status == 1)
3591    /* Map ttrace's version of success to our version.
3592     * Sometime ttrace returns 0, but that's ok here.
3593     */
3594    return 0;
3595
3596  return tt_status;
3597}
3598
3599
3600/* This function attempts to write the specified number of bytes to the
3601   save_state_t that is our view into the hardware registers, starting at
3602   ss_offset, and ending at ss_offset + sizeof_buf - 1
3603
3604   If this function succeeds, it deposits the bytes in buf, and returns 0.
3605
3606   If it fails, it returns a negative result.  The contents of the save_state_t
3607   are undefined it this function fails.
3608 */
3609int
3610write_to_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3611			      int sizeof_buf)
3612{
3613  int tt_status;
3614  register_value_t register_value = 0;
3615
3616  tt_status = call_ttrace (TT_LWP_WUREGS,
3617			   tid,
3618			   ss_offset,
3619			   (TTRACE_ARG_TYPE) sizeof_buf,
3620			   (TTRACE_ARG_TYPE) buf);
3621  return tt_status;
3622}
3623
3624
3625/* This function is a sop to the largeish number of direct calls
3626   to call_ptrace that exist in other files.  Rather than create
3627   functions whose name abstracts away from ptrace, and change all
3628   the present callers of call_ptrace, we'll do the expedient (and
3629   perhaps only practical) thing.
3630
3631   Note HP-UX explicitly disallows a mix of ptrace & ttrace on a traced
3632   process.  Thus, we must translate all ptrace requests into their
3633   process-specific, ttrace equivalents.
3634 */
3635int
3636call_ptrace (int pt_request, int gdb_tid, PTRACE_ARG3_TYPE addr, int data)
3637{
3638  ttreq_t tt_request;
3639  TTRACE_ARG_TYPE tt_addr = (TTRACE_ARG_TYPE) addr;
3640  TTRACE_ARG_TYPE tt_data = (TTRACE_ARG_TYPE) data;
3641  TTRACE_ARG_TYPE tt_addr2 = TT_NIL;
3642  int tt_status;
3643  register_value_t register_value;
3644  int read_buf;
3645
3646  /* Perform the necessary argument translation.  Note that some
3647     cases are funky enough in the ttrace realm that we handle them
3648     very specially.
3649   */
3650  switch (pt_request)
3651    {
3652      /* The following cases cannot conveniently be handled conveniently
3653         by merely adjusting the ptrace arguments and feeding into the
3654         generic call to ttrace at the bottom of this function.
3655
3656         Note that because all branches of this switch end in "return",
3657         there's no need for any "break" statements.
3658       */
3659    case PT_SETTRC:
3660      return parent_attach_all (0, 0, 0);
3661
3662    case PT_RUREGS:
3663      tt_status = read_from_register_save_state (gdb_tid,
3664						 tt_addr,
3665						 &register_value,
3666						 sizeof (register_value));
3667      if (tt_status < 0)
3668	return tt_status;
3669      return register_value;
3670
3671    case PT_WUREGS:
3672      register_value = (int) tt_data;
3673      tt_status = write_to_register_save_state (gdb_tid,
3674						tt_addr,
3675						&register_value,
3676						sizeof (register_value));
3677      return tt_status;
3678      break;
3679
3680    case PT_READ_I:
3681      tt_status = call_ttrace (TT_PROC_RDTEXT,	/* Implicit 4-byte xfer becomes block-xfer. */
3682			       gdb_tid,
3683			       tt_addr,
3684			       (TTRACE_ARG_TYPE) 4,
3685			       (TTRACE_ARG_TYPE) & read_buf);
3686      if (tt_status < 0)
3687	return tt_status;
3688      return read_buf;
3689
3690    case PT_READ_D:
3691      tt_status = call_ttrace (TT_PROC_RDDATA,	/* Implicit 4-byte xfer becomes block-xfer. */
3692			       gdb_tid,
3693			       tt_addr,
3694			       (TTRACE_ARG_TYPE) 4,
3695			       (TTRACE_ARG_TYPE) & read_buf);
3696      if (tt_status < 0)
3697	return tt_status;
3698      return read_buf;
3699
3700    case PT_ATTACH:
3701      tt_status = call_real_ttrace (TT_PROC_ATTACH,
3702				    map_from_gdb_tid (gdb_tid),
3703				    (lwpid_t) TT_NIL,
3704				    tt_addr,
3705				    (TTRACE_ARG_TYPE) TT_VERSION,
3706				    tt_addr2);
3707      if (tt_status < 0)
3708	return tt_status;
3709      return tt_status;
3710
3711      /* The following cases are handled by merely adjusting the ptrace
3712         arguments and feeding into the generic call to ttrace.
3713       */
3714    case PT_DETACH:
3715      tt_request = TT_PROC_DETACH;
3716      break;
3717
3718    case PT_WRITE_I:
3719      tt_request = TT_PROC_WRTEXT;	/* Translates 4-byte xfer to block-xfer. */
3720      tt_data = 4;		/* This many bytes. */
3721      tt_addr2 = (TTRACE_ARG_TYPE) & data;	/* Address of xfer source. */
3722      break;
3723
3724    case PT_WRITE_D:
3725      tt_request = TT_PROC_WRDATA;	/* Translates 4-byte xfer to block-xfer. */
3726      tt_data = 4;		/* This many bytes. */
3727      tt_addr2 = (TTRACE_ARG_TYPE) & data;	/* Address of xfer source. */
3728      break;
3729
3730    case PT_RDTEXT:
3731      tt_request = TT_PROC_RDTEXT;
3732      break;
3733
3734    case PT_RDDATA:
3735      tt_request = TT_PROC_RDDATA;
3736      break;
3737
3738    case PT_WRTEXT:
3739      tt_request = TT_PROC_WRTEXT;
3740      break;
3741
3742    case PT_WRDATA:
3743      tt_request = TT_PROC_WRDATA;
3744      break;
3745
3746    case PT_CONTINUE:
3747      tt_request = TT_PROC_CONTINUE;
3748      break;
3749
3750    case PT_STEP:
3751      tt_request = TT_LWP_SINGLE;	/* Should not be making this request? */
3752      break;
3753
3754    case PT_KILL:
3755      tt_request = TT_PROC_EXIT;
3756      break;
3757
3758    case PT_GET_PROCESS_PATHNAME:
3759      tt_request = TT_PROC_GET_PATHNAME;
3760      break;
3761
3762    default:
3763      tt_request = pt_request;	/* Let ttrace be the one to complain. */
3764      break;
3765    }
3766
3767  return call_ttrace (tt_request,
3768		      gdb_tid,
3769		      tt_addr,
3770		      tt_data,
3771		      tt_addr2);
3772}
3773
3774/* Kill that pesky process!
3775 */
3776void
3777kill_inferior (void)
3778{
3779  int tid;
3780  int wait_status;
3781  thread_info *t;
3782  thread_info **paranoia;
3783  int para_count, i;
3784
3785  if (PIDGET (inferior_ptid) == 0)
3786    return;
3787
3788  /* Walk the list of "threads", some of which are "pseudo threads",
3789     aka "processes".  For each that is NOT inferior_ptid, stop it,
3790     and detach it.
3791
3792     You see, we may not have just a single process to kill.  If we're
3793     restarting or quitting or detaching just after the inferior has
3794     forked, then we've actually two processes to clean up.
3795
3796     But we can't just call target_mourn_inferior() for each, since that
3797     zaps the target vector.
3798   */
3799
3800  paranoia = (thread_info **) xmalloc (thread_head.count *
3801				       sizeof (thread_info *));
3802  para_count = 0;
3803
3804  t = thread_head.head;
3805  while (t)
3806    {
3807
3808      paranoia[para_count] = t;
3809      for (i = 0; i < para_count; i++)
3810	{
3811	  if (t->next == paranoia[i])
3812	    {
3813	      warning ("Bad data in gdb's thread data; repairing.");
3814	      t->next = 0;
3815	    }
3816	}
3817      para_count++;
3818
3819      if (t->am_pseudo && (t->pid != PIDGET (inferior_ptid)))
3820	{
3821	  call_ttrace (TT_PROC_EXIT,
3822		       t->pid,
3823		       TT_NIL,
3824		       TT_NIL,
3825		       TT_NIL);
3826	}
3827      t = t->next;
3828    }
3829
3830  xfree (paranoia);
3831
3832  call_ttrace (TT_PROC_EXIT,
3833	       PIDGET (inferior_ptid),
3834	       TT_NIL,
3835	       TT_NIL,
3836	       TT_NIL);
3837  target_mourn_inferior ();
3838  clear_thread_info ();
3839}
3840
3841
3842#ifndef DEPRECATED_CHILD_RESUME
3843
3844/* Sanity check a thread about to be continued.
3845 */
3846static void
3847thread_dropping_event_check (thread_info *p)
3848{
3849  if (!p->handled)
3850    {
3851      /*
3852       * This seems to happen when we "next" over a
3853       * "fork()" while following the parent.  If it's
3854       * the FORK event, that's ok.  If it's a SIGNAL
3855       * in the unfollowed child, that's ok to--but
3856       * how can we know that's what's going on?
3857       *
3858       * FIXME!
3859       */
3860      if (p->have_state)
3861	{
3862	  if (p->last_stop_state.tts_event == TTEVT_FORK)
3863	    {
3864	      /* Ok */
3865	      ;
3866	    }
3867	  else if (p->last_stop_state.tts_event == TTEVT_SIGNAL)
3868	    {
3869	      /* Ok, close eyes and let it happen.
3870	       */
3871	      ;
3872	    }
3873	  else
3874	    {
3875	      /* This shouldn't happen--we're dropping a
3876	       * real event.
3877	       */
3878	      warning ("About to continue process %d, thread %d with unhandled event %s.",
3879		       p->pid, p->tid,
3880		       get_printable_name_of_ttrace_event (
3881					     p->last_stop_state.tts_event));
3882
3883#ifdef PARANOIA
3884	      if (debug_on)
3885		print_tthread (p);
3886#endif
3887	    }
3888	}
3889      else
3890	{
3891	  /* No saved state, have to assume it failed.
3892	   */
3893	  warning ("About to continue process %d, thread %d with unhandled event.",
3894		   p->pid, p->tid);
3895#ifdef PARANOIA
3896	  if (debug_on)
3897	    print_tthread (p);
3898#endif
3899	}
3900    }
3901
3902}				/* thread_dropping_event_check */
3903
3904/* Use a loop over the threads to continue all the threads but
3905 * the one specified, which is to be stepped.
3906 */
3907static void
3908threads_continue_all_but_one (lwpid_t gdb_tid, int signal)
3909{
3910  thread_info *p;
3911  int thread_signal;
3912  lwpid_t real_tid;
3913  lwpid_t scan_tid;
3914  ttstate_t state;
3915  int real_pid;
3916
3917#ifdef THREAD_DEBUG
3918  if (debug_on)
3919    printf ("Using loop over threads to step/resume with signals\n");
3920#endif
3921
3922  /* First update the thread list.
3923   */
3924  set_all_unseen ();
3925  real_tid = map_from_gdb_tid (gdb_tid);
3926  real_pid = get_pid_for (real_tid);
3927
3928  scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
3929  while (0 != scan_tid)
3930    {
3931
3932#ifdef THREAD_DEBUG
3933      /* FIX: later should check state is stopped;
3934       * state.tts_flags & TTS_STATEMASK == TTS_WASSUSPENDED
3935       */
3936      if (debug_on)
3937 	if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
3938	  printf ("About to continue non-stopped thread %d\n", scan_tid);
3939#endif
3940
3941      p = find_thread_info (scan_tid);
3942      if (NULL == p)
3943	{
3944	  add_tthread (real_pid, scan_tid);
3945	  p = find_thread_info (scan_tid);
3946
3947	  /* This is either a newly-created thread or the
3948	   * result of a fork; in either case there's no
3949	   * actual event to worry about.
3950	   */
3951	  p->handled = 1;
3952
3953	  if (state.tts_event != TTEVT_NONE)
3954	    {
3955	      /* Oops, do need to worry!
3956	       */
3957	      warning ("Unexpected thread with \"%s\" event.",
3958		       get_printable_name_of_ttrace_event (state.tts_event));
3959	    }
3960	}
3961      else if (scan_tid != p->tid)
3962	error ("Bad data in thread database.");
3963
3964#ifdef THREAD_DEBUG
3965      if (debug_on)
3966	if (p->terminated)
3967	  printf ("Why are we continuing a dead thread?\n");
3968#endif
3969
3970      p->seen = 1;
3971
3972      scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
3973    }
3974
3975  /* Remove unseen threads.
3976   */
3977  update_thread_list ();
3978
3979  /* Now run down the thread list and continue or step.
3980   */
3981  for (p = thread_head.head; p; p = p->next)
3982    {
3983
3984      /* Sanity check.
3985       */
3986      thread_dropping_event_check (p);
3987
3988      /* Pass the correct signals along.
3989       */
3990      if (p->have_signal)
3991	{
3992	  thread_signal = p->signal_value;
3993	  p->have_signal = 0;
3994	}
3995      else
3996	thread_signal = 0;
3997
3998      if (p->tid != real_tid)
3999	{
4000	  /*
4001	   * Not the thread of interest, so continue it
4002	   * as the user expects.
4003	   */
4004	  if (p->stepping_mode == DO_STEP)
4005	    {
4006	      /* Just step this thread.
4007	       */
4008	      call_ttrace (
4009			    TT_LWP_SINGLE,
4010			    p->tid,
4011			    TT_USE_CURRENT_PC,
4012			    (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4013			    TT_NIL);
4014	    }
4015	  else
4016	    {
4017	      /* Regular continue (default case).
4018	       */
4019	      call_ttrace (
4020			    TT_LWP_CONTINUE,
4021			    p->tid,
4022			    TT_USE_CURRENT_PC,
4023		    (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4024			    TT_NIL);
4025	    }
4026	}
4027      else
4028	{
4029	  /* Step the thread of interest.
4030	   */
4031	  call_ttrace (
4032			TT_LWP_SINGLE,
4033			real_tid,
4034			TT_USE_CURRENT_PC,
4035			(TTRACE_ARG_TYPE) target_signal_to_host (signal),
4036			TT_NIL);
4037	}
4038    }				/* Loop over threads */
4039}				/* End threads_continue_all_but_one */
4040
4041/* Use a loop over the threads to continue all the threads.
4042 * This is done when a signal must be sent to any of the threads.
4043 */
4044static void
4045threads_continue_all_with_signals (lwpid_t gdb_tid, int signal)
4046{
4047  thread_info *p;
4048  int thread_signal;
4049  lwpid_t real_tid;
4050  lwpid_t scan_tid;
4051  ttstate_t state;
4052  int real_pid;
4053
4054#ifdef THREAD_DEBUG
4055  if (debug_on)
4056    printf ("Using loop over threads to resume with signals\n");
4057#endif
4058
4059  /* Scan and update thread list.
4060   */
4061  set_all_unseen ();
4062  real_tid = map_from_gdb_tid (gdb_tid);
4063  real_pid = get_pid_for (real_tid);
4064
4065  scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
4066  while (0 != scan_tid)
4067    {
4068
4069#ifdef THREAD_DEBUG
4070      if (debug_on)
4071	if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
4072	  warning ("About to continue non-stopped thread %d\n", scan_tid);
4073#endif
4074
4075      p = find_thread_info (scan_tid);
4076      if (NULL == p)
4077	{
4078	  add_tthread (real_pid, scan_tid);
4079	  p = find_thread_info (scan_tid);
4080
4081	  /* This is either a newly-created thread or the
4082	   * result of a fork; in either case there's no
4083	   * actual event to worry about.
4084	   */
4085	  p->handled = 1;
4086
4087	  if (state.tts_event != TTEVT_NONE)
4088	    {
4089	      /* Oops, do need to worry!
4090	       */
4091	      warning ("Unexpected thread with \"%s\" event.",
4092		       get_printable_name_of_ttrace_event (state.tts_event));
4093	    }
4094	}
4095
4096#ifdef THREAD_DEBUG
4097      if (debug_on)
4098	if (p->terminated)
4099	  printf ("Why are we continuing a dead thread? (1)\n");
4100#endif
4101
4102      p->seen = 1;
4103
4104      scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
4105    }
4106
4107  /* Remove unseen threads from our list.
4108   */
4109  update_thread_list ();
4110
4111  /* Continue the threads.
4112   */
4113  for (p = thread_head.head; p; p = p->next)
4114    {
4115
4116      /* Sanity check.
4117       */
4118      thread_dropping_event_check (p);
4119
4120      /* Pass the correct signals along.
4121       */
4122      if (p->tid == real_tid)
4123	{
4124	  thread_signal = signal;
4125	  p->have_signal = 0;
4126	}
4127      else if (p->have_signal)
4128	{
4129	  thread_signal = p->signal_value;
4130	  p->have_signal = 0;
4131	}
4132      else
4133	thread_signal = 0;
4134
4135      if (p->stepping_mode == DO_STEP)
4136	{
4137	  call_ttrace (
4138			TT_LWP_SINGLE,
4139			p->tid,
4140			TT_USE_CURRENT_PC,
4141			(TTRACE_ARG_TYPE) target_signal_to_host (signal),
4142			TT_NIL);
4143	}
4144      else
4145	{
4146	  /* Continue this thread (default case).
4147	   */
4148	  call_ttrace (
4149			TT_LWP_CONTINUE,
4150			p->tid,
4151			TT_USE_CURRENT_PC,
4152		    (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4153			TT_NIL);
4154	}
4155    }
4156}				/* End threads_continue_all_with_signals */
4157
4158/* Step one thread only.
4159 */
4160static void
4161thread_fake_step (lwpid_t tid, enum target_signal signal)
4162{
4163  thread_info *p;
4164
4165#ifdef THREAD_DEBUG
4166  if (debug_on)
4167    {
4168      printf ("Doing a fake-step over a bpt, etc. for %d\n", tid);
4169
4170      if (is_terminated (tid))
4171	printf ("Why are we continuing a dead thread? (4)\n");
4172    }
4173#endif
4174
4175  if (doing_fake_step)
4176    warning ("Step while step already in progress.");
4177
4178  /* See if there's a saved signal value for this
4179   * thread to be passed on, but no current signal.
4180   */
4181  p = find_thread_info (tid);
4182  if (p != NULL)
4183    {
4184      if (p->have_signal && signal == TARGET_SIGNAL_0)
4185	{
4186	  /* Pass on a saved signal.
4187	   */
4188	  signal = p->signal_value;
4189	}
4190
4191      p->have_signal = 0;
4192    }
4193
4194  if (!p->handled)
4195    warning ("Internal error: continuing unhandled thread.");
4196
4197  call_ttrace (TT_LWP_SINGLE,
4198	       tid,
4199	       TT_USE_CURRENT_PC,
4200	       (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4201	       TT_NIL);
4202
4203  /* Do bookkeeping so "call_ttrace_wait" knows it has to wait
4204   * for this thread only, and clear any saved signal info.
4205   */
4206  doing_fake_step = 1;
4207  fake_step_tid = tid;
4208
4209}				/* End thread_fake_step */
4210
4211/* Continue one thread when a signal must be sent to it.
4212 */
4213static void
4214threads_continue_one_with_signal (lwpid_t gdb_tid, int signal)
4215{
4216  thread_info *p;
4217  lwpid_t real_tid;
4218  int real_pid;
4219
4220#ifdef THREAD_DEBUG
4221  if (debug_on)
4222    printf ("Continuing one thread with a signal\n");
4223#endif
4224
4225  real_tid = map_from_gdb_tid (gdb_tid);
4226  real_pid = get_pid_for (real_tid);
4227
4228  p = find_thread_info (real_tid);
4229  if (NULL == p)
4230    {
4231      add_tthread (real_pid, real_tid);
4232    }
4233
4234#ifdef THREAD_DEBUG
4235  if (debug_on)
4236    if (p->terminated)
4237      printf ("Why are we continuing a dead thread? (2)\n");
4238#endif
4239
4240  if (!p->handled)
4241    warning ("Internal error: continuing unhandled thread.");
4242
4243  p->have_signal = 0;
4244
4245  call_ttrace (TT_LWP_CONTINUE,
4246	       gdb_tid,
4247	       TT_USE_CURRENT_PC,
4248	       (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4249	       TT_NIL);
4250}
4251#endif
4252
4253#ifndef DEPRECATED_CHILD_RESUME
4254
4255/* Resume execution of the inferior process.
4256
4257 * This routine is in charge of setting the "handled" bits.
4258 *
4259 *   If STEP is zero,      continue it.
4260 *   If STEP is nonzero,   single-step it.
4261 *
4262 *   If SIGNAL is nonzero, give it that signal.
4263 *
4264 *   If TID is -1,         apply to all threads.
4265 *   If TID is not -1,     apply to specified thread.
4266 *
4267 *           STEP
4268 *      \      !0                        0
4269 *  TID  \________________________________________________
4270 *       |
4271 *   -1  |   Step current            Continue all threads
4272 *       |   thread and              (but which gets any
4273 *       |   continue others         signal?--We look at
4274 *       |                           "inferior_ptid")
4275 *       |
4276 *    N  |   Step _this_ thread      Continue _this_ thread
4277 *       |   and leave others        and leave others
4278 *       |   stopped; internally     stopped; used only for
4279 *       |   used by gdb, never      hardware watchpoints
4280 *       |   a user command.         and attach, never a
4281 *       |                           user command.
4282 */
4283void
4284child_resume (ptid_t ptid, int step, enum target_signal signal)
4285{
4286  int resume_all_threads;
4287  lwpid_t tid;
4288  process_state_t new_process_state;
4289  lwpid_t gdb_tid = PIDGET (ptid);
4290
4291  resume_all_threads =
4292    (gdb_tid == INFTTRACE_ALL_THREADS) ||
4293    (vfork_in_flight);
4294
4295  if (resume_all_threads)
4296    {
4297      /* Resume all threads, but first pick a tid value
4298       * so we can get the pid when in call_ttrace doing
4299       * the map.
4300       */
4301      if (vfork_in_flight)
4302	tid = vforking_child_pid;
4303      else
4304	tid = map_from_gdb_tid (PIDGET (inferior_ptid));
4305    }
4306  else
4307    tid = map_from_gdb_tid (gdb_tid);
4308
4309#ifdef THREAD_DEBUG
4310  if (debug_on)
4311    {
4312      if (more_events_left)
4313	printf ("More events; ");
4314
4315      if (signal != 0)
4316	printf ("Sending signal %d; ", signal);
4317
4318      if (resume_all_threads)
4319	{
4320	  if (step == 0)
4321	    printf ("Continue process %d\n", tid);
4322	  else
4323	    printf ("Step/continue thread %d\n", tid);
4324	}
4325      else
4326	{
4327	  if (step == 0)
4328	    printf ("Continue thread %d\n", tid);
4329	  else
4330	    printf ("Step just thread %d\n", tid);
4331	}
4332
4333      if (vfork_in_flight)
4334	printf ("Vfork in flight\n");
4335    }
4336#endif
4337
4338  if (process_state == RUNNING)
4339    warning ("Internal error in resume logic; doing resume or step anyway.");
4340
4341  if (!step			/* Asked to continue...       */
4342      && resume_all_threads	/* whole process..            */
4343      && signal != 0		/* with a signal...           */
4344      && more_events_left > 0)
4345    {				/* but we can't yet--save it! */
4346
4347      /* Continue with signal means we have to set the pending
4348       * signal value for this thread.
4349       */
4350      thread_info *k;
4351
4352#ifdef THREAD_DEBUG
4353      if (debug_on)
4354	printf ("Saving signal %d for thread %d\n", signal, tid);
4355#endif
4356
4357      k = find_thread_info (tid);
4358      if (k != NULL)
4359	{
4360	  k->have_signal = 1;
4361	  k->signal_value = signal;
4362
4363#ifdef THREAD_DEBUG
4364	  if (debug_on)
4365	    if (k->terminated)
4366	      printf ("Why are we continuing a dead thread? (3)\n");
4367#endif
4368
4369	}
4370
4371#ifdef THREAD_DEBUG
4372      else if (debug_on)
4373	{
4374	  printf ("No thread info for tid %d\n", tid);
4375	}
4376#endif
4377    }
4378
4379  /* Are we faking this "continue" or "step"?
4380
4381   * We used to do steps by continuing all the threads for
4382   * which the events had been handled already.  While
4383   * conceptually nicer (hides it all in a lower level), this
4384   * can lead to starvation and a hang (e.g. all but one thread
4385   * are unhandled at a breakpoint just before a "join" operation,
4386   * and one thread is in the join, and the user wants to step that
4387   * thread).
4388   */
4389  if (resume_all_threads	/* Whole process, therefore user command */
4390      && more_events_left > 0)
4391    {				/* But we can't do this yet--fake it! */
4392      thread_info *p;
4393
4394      if (!step)
4395	{
4396	  /* No need to do any notes on a per-thread
4397	   * basis--we're done!
4398	   */
4399#ifdef WAIT_BUFFER_DEBUG
4400	  if (debug_on)
4401	    printf ("Faking a process resume.\n");
4402#endif
4403
4404	  return;
4405	}
4406      else
4407	{
4408
4409#ifdef WAIT_BUFFER_DEBUG
4410	  if (debug_on)
4411	    printf ("Faking a process step.\n");
4412#endif
4413
4414	}
4415
4416      p = find_thread_info (tid);
4417      if (p == NULL)
4418	{
4419	  warning ("No thread information for tid %d, 'next' command ignored.\n", tid);
4420	  return;
4421	}
4422      else
4423	{
4424
4425#ifdef THREAD_DEBUG
4426	  if (debug_on)
4427	    if (p->terminated)
4428	      printf ("Why are we continuing a dead thread? (3.5)\n");
4429#endif
4430
4431	  if (p->stepping_mode != DO_DEFAULT)
4432	    {
4433	      warning ("Step or continue command applied to thread which is already stepping or continuing; command ignored.");
4434
4435	      return;
4436	    }
4437
4438	  if (step)
4439	    p->stepping_mode = DO_STEP;
4440	  else
4441	    p->stepping_mode = DO_CONTINUE;
4442
4443	  return;
4444	}			/* Have thread info */
4445    }				/* Must fake step or go */
4446
4447  /* Execept for fake-steps, from here on we know we are
4448   * going to wind up with a running process which will
4449   * need a real wait.
4450   */
4451  new_process_state = RUNNING;
4452
4453  /* An address of TT_USE_CURRENT_PC tells ttrace to continue from where
4454   * it was.  (If GDB wanted it to start some other way, we have already
4455   * written a new PC value to the child.)
4456   *
4457   * If this system does not support PT_STEP, a higher level function will
4458   * have called single_step() to transmute the step request into a
4459   * continue request (by setting breakpoints on all possible successor
4460   * instructions), so we don't have to worry about that here.
4461   */
4462  if (step)
4463    {
4464      if (resume_all_threads)
4465	{
4466	  /*
4467	   * Regular user step: other threads get a "continue".
4468	   */
4469	  threads_continue_all_but_one (tid, signal);
4470	  clear_all_handled ();
4471	  clear_all_stepping_mode ();
4472	}
4473
4474      else
4475	{
4476	  /* "Fake step": gdb is stepping one thread over a
4477	   * breakpoint, watchpoint, or out of a library load
4478	   * event, etc.  The rest just stay where they are.
4479	   *
4480	   * Also used when there are pending events: we really
4481	   * step the current thread, but leave the rest stopped.
4482	   * Users can't request this, but "wait_for_inferior"
4483	   * does--a lot!
4484	   */
4485	  thread_fake_step (tid, signal);
4486
4487	  /* Clear the "handled" state of this thread, because
4488	   * we'll soon get a new event for it.  Other events
4489	   * stay as they were.
4490	   */
4491	  clear_handled (tid);
4492	  clear_stepping_mode (tid);
4493	  new_process_state = FAKE_STEPPING;
4494	}
4495    }
4496
4497  else
4498    {
4499      /* TT_LWP_CONTINUE can pass signals to threads, TT_PROC_CONTINUE can't.
4500	 Therefore, we really can't use TT_PROC_CONTINUE here.
4501
4502	 Consider a process which stopped due to signal which gdb decides
4503	 to handle and not pass on to the inferior.  In that case we must
4504	 clear the pending signal by restarting the inferior using
4505	 TT_LWP_CONTINUE and pass zero as the signal number.  Else the
4506	 pending signal will be passed to the inferior.  interrupt.exp
4507	 in the testsuite does this precise thing and fails due to the
4508	 unwanted signal delivery to the inferior.  */
4509      /* drow/2002-12-05: However, note that we must use TT_PROC_CONTINUE
4510	 if we are tracing a vfork.  */
4511      if (vfork_in_flight)
4512	{
4513	  call_ttrace (TT_PROC_CONTINUE, tid, TT_NIL, TT_NIL, TT_NIL);
4514	  clear_all_handled ();
4515	  clear_all_stepping_mode ();
4516	}
4517      else if (resume_all_threads)
4518	{
4519#ifdef THREAD_DEBUG
4520	  if (debug_on)
4521	    printf ("Doing a continue by loop of all threads\n");
4522#endif
4523
4524	  threads_continue_all_with_signals (tid, signal);
4525
4526	  clear_all_handled ();
4527	  clear_all_stepping_mode ();
4528	}
4529      else
4530	{
4531#ifdef THREAD_DEBUG
4532	  printf ("Doing a continue w/signal of just thread %d\n", tid);
4533#endif
4534
4535	  threads_continue_one_with_signal (tid, signal);
4536
4537	  /* Clear the "handled" state of this thread, because we
4538	     will soon get a new event for it.  Other events can
4539	     stay as they were.  */
4540	  clear_handled (tid);
4541	  clear_stepping_mode (tid);
4542	}
4543    }
4544
4545  process_state = new_process_state;
4546
4547#ifdef WAIT_BUFFER_DEBUG
4548  if (debug_on)
4549    printf ("Process set to %s\n",
4550	    get_printable_name_of_process_state (process_state));
4551#endif
4552
4553}
4554#endif /* DEPRECATED_CHILD_RESUME */
4555
4556/*
4557 * Like it says.
4558 *
4559 * One worry is that we may not be attaching to "inferior_ptid"
4560 * and thus may not want to clear out our data.  FIXME?
4561 *
4562 */
4563static void
4564update_thread_state_after_attach (int pid, attach_continue_t kind_of_go)
4565{
4566  int tt_status;
4567  ttstate_t thread_state;
4568  lwpid_t a_thread;
4569  lwpid_t tid;
4570
4571  /* The process better be stopped.
4572   */
4573  if (process_state != STOPPED
4574      && process_state != VFORKING)
4575    warning ("Internal error attaching.");
4576
4577  /* Clear out old tthread info and start over.  This has the
4578   * side effect of ensuring that the TRAP is reported as being
4579   * in the right thread (re-mapped from tid to pid).
4580   *
4581   * It's because we need to add the tthread _now_ that we
4582   * need to call "clear_thread_info" _now_, and that's why
4583   * "require_notification_of_events" doesn't clear the thread
4584   * info (it's called later than this routine).
4585   */
4586  clear_thread_info ();
4587  a_thread = 0;
4588
4589  for (tid = get_process_first_stopped_thread_id (pid, &thread_state);
4590       tid != 0;
4591       tid = get_process_next_stopped_thread_id (pid, &thread_state))
4592    {
4593      thread_info *p;
4594
4595      if (a_thread == 0)
4596	{
4597	  a_thread = tid;
4598#ifdef THREAD_DEBUG
4599	  if (debug_on)
4600	    printf ("Attaching to process %d, thread %d\n",
4601		    pid, a_thread);
4602#endif
4603	}
4604
4605      /* Tell ourselves and the "rest of gdb" that this thread
4606       * exists.
4607       *
4608       * This isn't really a hack.  Other thread-based versions
4609       * of gdb (e.g. gnu-nat.c) seem to do the same thing.
4610       *
4611       * We don't need to do mapping here, as we know this
4612       * is the first thread and thus gets the real pid
4613       * (and is "inferior_ptid").
4614       *
4615       * NOTE: it probably isn't the originating thread,
4616       *       but that doesn't matter (we hope!).
4617       */
4618      add_tthread (pid, tid);
4619      p = find_thread_info (tid);
4620      if (NULL == p)		/* ?We just added it! */
4621	error ("Internal error adding a thread on attach.");
4622
4623      copy_ttstate_t (&p->last_stop_state, &thread_state);
4624      p->have_state = 1;
4625
4626      if (DO_ATTACH_CONTINUE == kind_of_go)
4627	{
4628	  /*
4629	   * If we are going to CONTINUE afterwards,
4630	   * raising a SIGTRAP, don't bother trying to
4631	   * handle this event.  But check first!
4632	   */
4633	  switch (p->last_stop_state.tts_event)
4634	    {
4635
4636	    case TTEVT_NONE:
4637	      /* Ok to set this handled.
4638	       */
4639	      break;
4640
4641	    default:
4642	      warning ("Internal error; skipping event %s on process %d, thread %d.",
4643		       get_printable_name_of_ttrace_event (
4644					      p->last_stop_state.tts_event),
4645		       p->pid, p->tid);
4646	    }
4647
4648	  set_handled (pid, tid);
4649
4650	}
4651      else
4652	{
4653	  /* There will be no "continue" opertion, so the
4654	   * process remains stopped.  Don't set any events
4655	   * handled except the "gimmies".
4656	   */
4657	  switch (p->last_stop_state.tts_event)
4658	    {
4659
4660	    case TTEVT_NONE:
4661	      /* Ok to ignore this.
4662	       */
4663	      set_handled (pid, tid);
4664	      break;
4665
4666	    case TTEVT_EXEC:
4667	    case TTEVT_FORK:
4668	      /* Expected "other" FORK or EXEC event from a
4669	       * fork or vfork.
4670	       */
4671	      break;
4672
4673	    default:
4674	      printf ("Internal error: failed to handle event %s on process %d, thread %d.",
4675		      get_printable_name_of_ttrace_event (
4676					      p->last_stop_state.tts_event),
4677		      p->pid, p->tid);
4678	    }
4679	}
4680
4681      add_thread (pid_to_ptid (pid));		/* in thread.c */
4682    }
4683
4684#ifdef PARANOIA
4685  if (debug_on)
4686    print_tthreads ();
4687#endif
4688
4689  /* One mustn't call ttrace_wait() after attaching via ttrace,
4690     'cause the process is stopped already.
4691
4692     However, the upper layers of gdb's execution control will
4693     want to wait after attaching (but not after forks, in
4694     which case they will be doing a "target_resume", anticipating
4695     a later TTEVT_EXEC or TTEVT_FORK event).
4696
4697     To make this attach() implementation more compatible with
4698     others, we'll make the attached-to process raise a SIGTRAP.
4699
4700     Issue: this continues only one thread.  That could be
4701     dangerous if the thread is blocked--the process won't run
4702     and no trap will be raised.  FIX! (check state.tts_flags?
4703     need one that's either TTS_WASRUNNING--but we've stopped
4704     it and made it TTS_WASSUSPENDED.  Hum...FIXME!)
4705   */
4706  if (DO_ATTACH_CONTINUE == kind_of_go)
4707    {
4708      tt_status = call_real_ttrace (
4709				     TT_LWP_CONTINUE,
4710				     pid,
4711				     a_thread,
4712				     TT_USE_CURRENT_PC,
4713	       (TTRACE_ARG_TYPE) target_signal_to_host (TARGET_SIGNAL_TRAP),
4714				     TT_NIL);
4715      if (errno)
4716	perror_with_name ("ttrace");
4717
4718      clear_handled (a_thread);	/* So TRAP will be reported. */
4719
4720      /* Now running.
4721       */
4722      process_state = RUNNING;
4723    }
4724
4725  attach_flag = 1;
4726}
4727
4728
4729/* Start debugging the process whose number is PID.
4730 * (A _real_ pid).
4731 */
4732int
4733attach (int pid)
4734{
4735  int tt_status;
4736
4737  tt_status = call_real_ttrace (
4738				 TT_PROC_ATTACH,
4739				 pid,
4740				 (lwpid_t) TT_NIL,
4741				 TT_NIL,
4742				 (TTRACE_ARG_TYPE) TT_VERSION,
4743				 TT_NIL);
4744  if (errno)
4745    perror_with_name ("ttrace attach");
4746
4747  /* If successful, the process is now stopped.
4748   */
4749  process_state = STOPPED;
4750
4751  /* Our caller ("attach_command" in "infcmd.c")
4752   * expects to do a "wait_for_inferior" after
4753   * the attach, so make sure the inferior is
4754   * running when we're done.
4755   */
4756  update_thread_state_after_attach (pid, DO_ATTACH_CONTINUE);
4757
4758  return pid;
4759}
4760
4761
4762#if defined(CHILD_POST_ATTACH)
4763void
4764child_post_attach (int pid)
4765{
4766#ifdef THREAD_DEBUG
4767  if (debug_on)
4768    printf ("child-post-attach call\n");
4769#endif
4770
4771  require_notification_of_events (pid);
4772}
4773#endif
4774
4775
4776/* Stop debugging the process whose number is PID
4777   and continue it with signal number SIGNAL.
4778   SIGNAL = 0 means just continue it.
4779 */
4780void
4781detach (int signal)
4782{
4783  errno = 0;
4784  call_ttrace (TT_PROC_DETACH,
4785	       PIDGET (inferior_ptid),
4786	       TT_NIL,
4787	       (TTRACE_ARG_TYPE) signal,
4788	       TT_NIL);
4789  attach_flag = 0;
4790
4791  clear_thread_info ();
4792
4793  /* Process-state? */
4794}
4795
4796
4797/* Default the type of the ttrace transfer to int.  */
4798#ifndef TTRACE_XFER_TYPE
4799#define TTRACE_XFER_TYPE int
4800#endif
4801
4802void
4803_initialize_kernel_u_addr (void)
4804{
4805}
4806
4807#if !defined (CHILD_XFER_MEMORY)
4808/* NOTE! I tried using TTRACE_READDATA, etc., to read and write memory
4809   in the NEW_SUN_TTRACE case.
4810   It ought to be straightforward.  But it appears that writing did
4811   not write the data that I specified.  I cannot understand where
4812   it got the data that it actually did write.  */
4813
4814/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
4815   to debugger memory starting at MYADDR.   Copy to inferior if
4816   WRITE is nonzero.  TARGET is ignored.
4817
4818   Returns the length copied, which is either the LEN argument or
4819   zero.  This xfer function does not do partial moves, since
4820   deprecated_child_ops doesn't allow memory operations to cross below
4821   us in the target stack anyway.  */
4822
4823int
4824child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
4825		   struct mem_attrib *attrib,
4826		   struct target_ops *target)
4827{
4828  int i;
4829  /* Round starting address down to longword boundary.  */
4830  CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (TTRACE_XFER_TYPE);
4831  /* Round ending address up; get number of longwords that makes.  */
4832  int count
4833  = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1)
4834  / sizeof (TTRACE_XFER_TYPE);
4835  /* Allocate buffer of that many longwords.  */
4836  /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
4837     because it uses alloca to allocate a buffer of arbitrary size.
4838     For very large xfers, this could crash GDB's stack.  */
4839  TTRACE_XFER_TYPE *buffer
4840    = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
4841
4842  if (write)
4843    {
4844      /* Fill start and end extra bytes of buffer with existing memory data.  */
4845
4846      if (addr != memaddr || len < (int) sizeof (TTRACE_XFER_TYPE))
4847	{
4848	  /* Need part of initial word -- fetch it.  */
4849	  buffer[0] = call_ttrace (TT_LWP_RDTEXT,
4850				   PIDGET (inferior_ptid),
4851				   (TTRACE_ARG_TYPE) addr,
4852				   TT_NIL,
4853				   TT_NIL);
4854	}
4855
4856      if (count > 1)		/* FIXME, avoid if even boundary */
4857	{
4858	  buffer[count - 1] = call_ttrace (TT_LWP_RDTEXT,
4859					   PIDGET (inferior_ptid),
4860					   ((TTRACE_ARG_TYPE)
4861			  (addr + (count - 1) * sizeof (TTRACE_XFER_TYPE))),
4862					   TT_NIL,
4863					   TT_NIL);
4864	}
4865
4866      /* Copy data to be written over corresponding part of buffer */
4867
4868      memcpy ((char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
4869	      myaddr,
4870	      len);
4871
4872      /* Write the entire buffer.  */
4873
4874      for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4875	{
4876	  errno = 0;
4877	  call_ttrace (TT_LWP_WRDATA,
4878		       PIDGET (inferior_ptid),
4879		       (TTRACE_ARG_TYPE) addr,
4880		       (TTRACE_ARG_TYPE) buffer[i],
4881		       TT_NIL);
4882	  if (errno)
4883	    {
4884	      /* Using the appropriate one (I or D) is necessary for
4885	         Gould NP1, at least.  */
4886	      errno = 0;
4887	      call_ttrace (TT_LWP_WRTEXT,
4888			   PIDGET (inferior_ptid),
4889			   (TTRACE_ARG_TYPE) addr,
4890			   (TTRACE_ARG_TYPE) buffer[i],
4891			   TT_NIL);
4892	    }
4893	  if (errno)
4894	    return 0;
4895	}
4896    }
4897  else
4898    {
4899      /* Read all the longwords */
4900      for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4901	{
4902	  errno = 0;
4903	  buffer[i] = call_ttrace (TT_LWP_RDTEXT,
4904				   PIDGET (inferior_ptid),
4905				   (TTRACE_ARG_TYPE) addr,
4906				   TT_NIL,
4907				   TT_NIL);
4908	  if (errno)
4909	    return 0;
4910	  QUIT;
4911	}
4912
4913      /* Copy appropriate bytes out of the buffer.  */
4914      memcpy (myaddr,
4915	      (char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
4916	      len);
4917    }
4918  return len;
4919}
4920
4921
4922static void
4923udot_info (void)
4924{
4925  int udot_off;			/* Offset into user struct */
4926  int udot_val;			/* Value from user struct at udot_off */
4927  char mess[128];		/* For messages */
4928
4929  if (!target_has_execution)
4930    {
4931      error ("The program is not being run.");
4932    }
4933
4934#if !defined (KERNEL_U_SIZE)
4935
4936  /* Adding support for this command is easy.  Typically you just add a
4937     routine, called "kernel_u_size" that returns the size of the user
4938     struct, to the appropriate *-nat.c file and then add to the native
4939     config file "#define KERNEL_U_SIZE kernel_u_size()" */
4940  error ("Don't know how large ``struct user'' is in this version of gdb.");
4941
4942#else
4943
4944  for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val))
4945    {
4946      if ((udot_off % 24) == 0)
4947	{
4948	  if (udot_off > 0)
4949	    {
4950	      printf_filtered ("\n");
4951	    }
4952	  printf_filtered ("%04x:", udot_off);
4953	}
4954      udot_val = call_ttrace (TT_LWP_RUREGS,
4955			      PIDGET (inferior_ptid),
4956			      (TTRACE_ARG_TYPE) udot_off,
4957			      TT_NIL,
4958			      TT_NIL);
4959      if (errno != 0)
4960	{
4961	  sprintf (mess, "\nreading user struct at offset 0x%x", udot_off);
4962	  perror_with_name (mess);
4963	}
4964      /* Avoid using nonportable (?) "*" in print specs */
4965      printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val);
4966    }
4967  printf_filtered ("\n");
4968
4969#endif
4970}
4971#endif /* !defined (CHILD_XFER_MEMORY).  */
4972
4973
4974/* TTrace version of "target_pid_to_exec_file"
4975 */
4976char *
4977child_pid_to_exec_file (int tid)
4978{
4979  int tt_status;
4980  static char exec_file_buffer[1024];
4981  pid_t pid;
4982  static struct pst_status buf;
4983
4984  /* On various versions of hpux11, this may fail due to a supposed
4985     kernel bug.  We have alternate methods to get this information
4986     (ie pstat).  */
4987  tt_status = call_ttrace (TT_PROC_GET_PATHNAME,
4988			   tid,
4989			   (uint64_t) exec_file_buffer,
4990			   sizeof (exec_file_buffer) - 1,
4991			   0);
4992  if (tt_status >= 0)
4993    return exec_file_buffer;
4994
4995  /* Try to get process information via pstat and extract the filename
4996     from the pst_cmd field within the pst_status structure.  */
4997  if (pstat_getproc (&buf, sizeof (struct pst_status), 0, tid) != -1)
4998    {
4999      char *p = buf.pst_cmd;
5000
5001      while (*p && *p != ' ')
5002	p++;
5003      *p = 0;
5004
5005      return (buf.pst_cmd);
5006    }
5007
5008  return (NULL);
5009}
5010
5011void
5012pre_fork_inferior (void)
5013{
5014  int status;
5015
5016  status = pipe (startup_semaphore.parent_channel);
5017  if (status < 0)
5018    {
5019      warning ("error getting parent pipe for startup semaphore");
5020      return;
5021    }
5022
5023  status = pipe (startup_semaphore.child_channel);
5024  if (status < 0)
5025    {
5026      warning ("error getting child pipe for startup semaphore");
5027      return;
5028    }
5029}
5030
5031/* Called from child_follow_fork in hppah-nat.c.
5032 *
5033 * This seems to be intended to attach after a fork or
5034 * vfork, while "attach" is used to attach to a pid
5035 * given by the user.  The check for an existing attach
5036 * seems odd--it always fails in our test system.
5037 */
5038int
5039hppa_require_attach (int pid)
5040{
5041  int tt_status;
5042  CORE_ADDR pc;
5043  CORE_ADDR pc_addr;
5044  unsigned int regs_offset;
5045  process_state_t old_process_state = process_state;
5046
5047  /* Are we already attached?  There appears to be no explicit
5048   * way to answer this via ttrace, so we try something which
5049   * should be innocuous if we are attached.  If that fails,
5050   * then we assume we're not attached, and so attempt to make
5051   * it so.
5052   */
5053  errno = 0;
5054  tt_status = call_real_ttrace (TT_PROC_STOP,
5055				pid,
5056				(lwpid_t) TT_NIL,
5057				(TTRACE_ARG_TYPE) TT_NIL,
5058				(TTRACE_ARG_TYPE) TT_NIL,
5059				TT_NIL);
5060
5061  if (errno)
5062    {
5063      /* No change to process-state!
5064       */
5065      errno = 0;
5066      pid = attach (pid);
5067    }
5068  else
5069    {
5070      /* If successful, the process is now stopped.  But if
5071       * we're VFORKING, the parent is still running, so don't
5072       * change the process state.
5073       */
5074      if (process_state != VFORKING)
5075	process_state = STOPPED;
5076
5077      /* If we were already attached, you'd think that we
5078       * would need to start going again--but you'd be wrong,
5079       * as the fork-following code is actually in the middle
5080       * of the "resume" routine in in "infrun.c" and so
5081       * will (almost) immediately do a resume.
5082       *
5083       * On the other hand, if we are VFORKING, which means
5084       * that the child and the parent share a process for a
5085       * while, we know that "resume" won't be resuming
5086       * until the child EXEC event is seen.  But we still
5087       * don't want to continue, as the event is already
5088       * there waiting.
5089       */
5090      update_thread_state_after_attach (pid, DONT_ATTACH_CONTINUE);
5091    }				/* STOP succeeded */
5092
5093  return pid;
5094}
5095
5096int
5097hppa_require_detach (int pid, int signal)
5098{
5099  int tt_status;
5100
5101  /* If signal is non-zero, we must pass the signal on to the active
5102     thread prior to detaching.  We do this by continuing the threads
5103     with the signal.
5104   */
5105  if (signal != 0)
5106    {
5107      errno = 0;
5108      threads_continue_all_with_signals (pid, signal);
5109    }
5110
5111  errno = 0;
5112  tt_status = call_ttrace (TT_PROC_DETACH,
5113			   pid,
5114			   TT_NIL,
5115			   TT_NIL,
5116			   TT_NIL);
5117
5118  errno = 0;			/* Ignore any errors. */
5119
5120  /* process_state? */
5121
5122  return pid;
5123}
5124
5125/* Given the starting address of a memory page, hash it to a bucket in
5126   the memory page dictionary.
5127 */
5128static int
5129get_dictionary_bucket_of_page (CORE_ADDR page_start)
5130{
5131  int hash;
5132
5133  hash = (page_start / memory_page_dictionary.page_size);
5134  hash = hash % MEMORY_PAGE_DICTIONARY_BUCKET_COUNT;
5135
5136  return hash;
5137}
5138
5139
5140/* Given a memory page's starting address, get (i.e., find an existing
5141   or create a new) dictionary entry for the page.  The page will be
5142   write-protected when this function returns, but may have a reference
5143   count of 0 (if the page was newly-added to the dictionary).
5144 */
5145static memory_page_t *
5146get_dictionary_entry_of_page (int pid, CORE_ADDR page_start)
5147{
5148  int bucket;
5149  memory_page_t *page = NULL;
5150  memory_page_t *previous_page = NULL;
5151
5152  /* We're going to be using the dictionary now, than-kew. */
5153  require_memory_page_dictionary ();
5154
5155  /* Try to find an existing dictionary entry for this page.  Hash
5156     on the page's starting address.
5157   */
5158  bucket = get_dictionary_bucket_of_page (page_start);
5159  page = &memory_page_dictionary.buckets[bucket];
5160  while (page != NULL)
5161    {
5162      if (page->page_start == page_start)
5163	break;
5164      previous_page = page;
5165      page = page->next;
5166    }
5167
5168  /* Did we find a dictionary entry for this page?  If not, then
5169     add it to the dictionary now.
5170   */
5171  if (page == NULL)
5172    {
5173      /* Create a new entry. */
5174      page = (memory_page_t *) xmalloc (sizeof (memory_page_t));
5175      page->page_start = page_start;
5176      page->reference_count = 0;
5177      page->next = NULL;
5178      page->previous = NULL;
5179
5180      /* We'll write-protect the page now, if that's allowed. */
5181      page->original_permissions = write_protect_page (pid, page_start);
5182
5183      /* Add the new entry to the dictionary. */
5184      page->previous = previous_page;
5185      previous_page->next = page;
5186
5187      memory_page_dictionary.page_count++;
5188    }
5189
5190  return page;
5191}
5192
5193
5194static void
5195remove_dictionary_entry_of_page (int pid, memory_page_t *page)
5196{
5197  /* Restore the page's original permissions. */
5198  unwrite_protect_page (pid, page->page_start, page->original_permissions);
5199
5200  /* Kick the page out of the dictionary. */
5201  if (page->previous != NULL)
5202    page->previous->next = page->next;
5203  if (page->next != NULL)
5204    page->next->previous = page->previous;
5205
5206  /* Just in case someone retains a handle to this after it's freed. */
5207  page->page_start = (CORE_ADDR) 0;
5208
5209  memory_page_dictionary.page_count--;
5210
5211  xfree (page);
5212}
5213
5214
5215static void
5216hppa_enable_syscall_events (int pid)
5217{
5218  int tt_status;
5219  ttevent_t ttrace_events;
5220
5221  /* Get the set of events that are currently enabled. */
5222  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5223			   pid,
5224			   (TTRACE_ARG_TYPE) & ttrace_events,
5225			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5226			   TT_NIL);
5227  if (errno)
5228    perror_with_name ("ttrace");
5229
5230  /* Add syscall events to that set. */
5231  ttrace_events.tte_events |= TTEVT_SYSCALL_ENTRY;
5232  ttrace_events.tte_events |= TTEVT_SYSCALL_RETURN;
5233
5234  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5235			   pid,
5236			   (TTRACE_ARG_TYPE) & ttrace_events,
5237			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5238			   TT_NIL);
5239  if (errno)
5240    perror_with_name ("ttrace");
5241}
5242
5243
5244static void
5245hppa_disable_syscall_events (int pid)
5246{
5247  int tt_status;
5248  ttevent_t ttrace_events;
5249
5250  /* Get the set of events that are currently enabled. */
5251  tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5252			   pid,
5253			   (TTRACE_ARG_TYPE) & ttrace_events,
5254			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5255			   TT_NIL);
5256  if (errno)
5257    perror_with_name ("ttrace");
5258
5259  /* Remove syscall events from that set. */
5260  ttrace_events.tte_events &= ~TTEVT_SYSCALL_ENTRY;
5261  ttrace_events.tte_events &= ~TTEVT_SYSCALL_RETURN;
5262
5263  tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5264			   pid,
5265			   (TTRACE_ARG_TYPE) & ttrace_events,
5266			   (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5267			   TT_NIL);
5268  if (errno)
5269    perror_with_name ("ttrace");
5270}
5271
5272
5273/* The address range beginning with START and ending with START+LEN-1
5274   (inclusive) is to be watched via page-protection by a new watchpoint.
5275   Set protection for all pages that overlap that range.
5276
5277   Note that our caller sets TYPE to:
5278   0 for a bp_hardware_watchpoint,
5279   1 for a bp_read_watchpoint,
5280   2 for a bp_access_watchpoint
5281
5282   (Yes, this is intentionally (though lord only knows why) different
5283   from the TYPE that is passed to hppa_remove_hw_watchpoint.)
5284 */
5285int
5286hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
5287{
5288  CORE_ADDR page_start;
5289  int dictionary_was_empty;
5290  int page_size;
5291  int page_id;
5292  LONGEST range_size_in_pages;
5293
5294  if (type != 0)
5295    error ("read or access hardware watchpoints not supported on HP-UX");
5296
5297  /* Examine all pages in the address range. */
5298  require_memory_page_dictionary ();
5299
5300  dictionary_was_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5301
5302  page_size = memory_page_dictionary.page_size;
5303  page_start = (start / page_size) * page_size;
5304  range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5305
5306  for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5307    {
5308      memory_page_t *page;
5309
5310      /* This gets the page entered into the dictionary if it was
5311         not already entered.
5312       */
5313      page = get_dictionary_entry_of_page (pid, page_start);
5314      page->reference_count++;
5315    }
5316
5317  /* Our implementation depends on seeing calls to kernel code, for the
5318     following reason.  Here we ask to be notified of syscalls.
5319
5320     When a protected page is accessed by user code, HP-UX raises a SIGBUS.
5321     Fine.
5322
5323     But when kernel code accesses the page, it doesn't give a SIGBUS.
5324     Rather, the system call that touched the page fails, with errno=EFAULT.
5325     Not good for us.
5326
5327     We could accomodate this "feature" by asking to be notified of syscall
5328     entries & exits; upon getting an entry event, disabling page-protections;
5329     upon getting an exit event, reenabling page-protections and then checking
5330     if any watchpoints triggered.
5331
5332     However, this turns out to be a real performance loser.  syscalls are
5333     usually a frequent occurrence.  Having to unprotect-reprotect all watched
5334     pages, and also to then read all watched memory locations and compare for
5335     triggers, can be quite expensive.
5336
5337     Instead, we'll only ask to be notified of syscall exits.  When we get
5338     one, we'll check whether errno is set.  If not, or if it's not EFAULT,
5339     we can just continue the inferior.
5340
5341     If errno is set upon syscall exit to EFAULT, we must perform some fairly
5342     hackish stuff to determine whether the failure really was due to a
5343     page-protect trap on a watched location.
5344   */
5345  if (dictionary_was_empty)
5346    hppa_enable_syscall_events (pid);
5347
5348  return 1;
5349}
5350
5351
5352/* The address range beginning with START and ending with START+LEN-1
5353   (inclusive) was being watched via page-protection by a watchpoint
5354   which has been removed.  Remove protection for all pages that
5355   overlap that range, which are not also being watched by other
5356   watchpoints.
5357 */
5358int
5359hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
5360{
5361  CORE_ADDR page_start;
5362  int dictionary_is_empty;
5363  int page_size;
5364  int page_id;
5365  LONGEST range_size_in_pages;
5366
5367  if (type != 0)
5368    error ("read or access hardware watchpoints not supported on HP-UX");
5369
5370  /* Examine all pages in the address range. */
5371  require_memory_page_dictionary ();
5372
5373  page_size = memory_page_dictionary.page_size;
5374  page_start = (start / page_size) * page_size;
5375  range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5376
5377  for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5378    {
5379      memory_page_t *page;
5380
5381      page = get_dictionary_entry_of_page (pid, page_start);
5382      page->reference_count--;
5383
5384      /* Was this the last reference of this page?  If so, then we
5385         must scrub the entry from the dictionary, and also restore
5386         the page's original permissions.
5387       */
5388      if (page->reference_count == 0)
5389	remove_dictionary_entry_of_page (pid, page);
5390    }
5391
5392  dictionary_is_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5393
5394  /* If write protections are currently disallowed, then that implies that
5395     wait_for_inferior believes that the inferior is within a system call.
5396     Since we want to see both syscall entry and return, it's clearly not
5397     good to disable syscall events in this state!
5398
5399     ??rehrauer: Yeah, it'd be better if we had a specific flag that said,
5400     "inferior is between syscall events now".  Oh well.
5401   */
5402  if (dictionary_is_empty && memory_page_dictionary.page_protections_allowed)
5403    hppa_disable_syscall_events (pid);
5404
5405  return 1;
5406}
5407
5408
5409/* Could we implement a watchpoint of this type via our available
5410   hardware support?
5411
5412   This query does not consider whether a particular address range
5413   could be so watched, but just whether support is generally available
5414   for such things.  See hppa_range_profitable_for_hw_watchpoint for a
5415   query that answers whether a particular range should be watched via
5416   hardware support.
5417 */
5418int
5419hppa_can_use_hw_watchpoint (int type, int cnt, int ot)
5420{
5421  return (type == bp_hardware_watchpoint);
5422}
5423
5424
5425/* Assuming we could set a hardware watchpoint on this address, do
5426   we think it would be profitable ("a good idea") to do so?  If not,
5427   we can always set a regular (aka single-step & test) watchpoint
5428   on the address...
5429 */
5430int
5431hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len)
5432{
5433  int range_is_stack_based;
5434  int range_is_accessible;
5435  CORE_ADDR page_start;
5436  int page_size;
5437  int page;
5438  LONGEST range_size_in_pages;
5439
5440  /* ??rehrauer: For now, say that all addresses are potentially
5441     profitable.  Possibly later we'll want to test the address
5442     for "stackness"?
5443   */
5444  range_is_stack_based = 0;
5445
5446  /* If any page in the range is inaccessible, then we cannot
5447     really use hardware watchpointing, even though our client
5448     thinks we can.  In that case, it's actually an error to
5449     attempt to use hw watchpoints, so we'll tell our client
5450     that the range is "unprofitable", and hope that they listen...
5451   */
5452  range_is_accessible = 1;	/* Until proven otherwise. */
5453
5454  /* Examine all pages in the address range. */
5455  errno = 0;
5456  page_size = sysconf (_SC_PAGE_SIZE);
5457
5458  /* If we can't determine page size, we're hosed.  Tell our
5459     client it's unprofitable to use hw watchpoints for this
5460     range.
5461   */
5462  if (errno || (page_size <= 0))
5463    {
5464      errno = 0;
5465      return 0;
5466    }
5467
5468  page_start = (start / page_size) * page_size;
5469  range_size_in_pages = len / (LONGEST) page_size;
5470
5471  for (page = 0; page < range_size_in_pages; page++, page_start += page_size)
5472    {
5473      int tt_status;
5474      int page_permissions;
5475
5476      /* Is this page accessible? */
5477      errno = 0;
5478      tt_status = call_ttrace (TT_PROC_GET_MPROTECT,
5479			       pid,
5480			       (TTRACE_ARG_TYPE) page_start,
5481			       TT_NIL,
5482			       (TTRACE_ARG_TYPE) & page_permissions);
5483      if (errno || (tt_status < 0))
5484	{
5485	  errno = 0;
5486	  range_is_accessible = 0;
5487	  break;
5488	}
5489
5490      /* Yes, go for another... */
5491    }
5492
5493  return (!range_is_stack_based && range_is_accessible);
5494}
5495
5496
5497char *
5498hppa_pid_or_tid_to_str (ptid_t ptid)
5499{
5500  static char buf[100];		/* Static because address returned. */
5501  pid_t id = PIDGET (ptid);
5502
5503  /* Does this appear to be a process?  If so, print it that way. */
5504  if (is_process_id (id))
5505    return child_pid_to_str (ptid);
5506
5507  /* Else, print both the GDB thread number and the system thread id. */
5508  sprintf (buf, "thread %d (", pid_to_thread_id (ptid));
5509  strcat (buf, hppa_tid_to_str (ptid));
5510  strcat (buf, ")\0");
5511
5512  return buf;
5513}
5514
5515
5516void
5517hppa_ensure_vforking_parent_remains_stopped (int pid)
5518{
5519  /* Nothing to do when using ttrace.  Only the ptrace-based implementation
5520     must do real work.
5521   */
5522}
5523
5524
5525int
5526hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
5527{
5528  return 0;			/* No, the parent vfork is available now. */
5529}
5530
5531
5532/* Write a register as a 64bit value.  This may be necessary if the
5533   native OS is too braindamaged to allow some (or all) registers to
5534   be written in 32bit hunks such as hpux11 and the PC queue registers.
5535
5536   This is horribly gross and disgusting.  */
5537
5538int
5539ttrace_write_reg_64 (int gdb_tid, CORE_ADDR dest_addr, CORE_ADDR src_addr)
5540{
5541  pid_t 	pid;
5542  lwpid_t 	tid;
5543  int  		tt_status;
5544
5545  tid = map_from_gdb_tid (gdb_tid);
5546  pid = get_pid_for (tid);
5547
5548  errno = 0;
5549  tt_status = ttrace (TT_LWP_WUREGS,
5550		      pid,
5551		      tid,
5552		      (TTRACE_ARG_TYPE) dest_addr,
5553		      8,
5554		      (TTRACE_ARG_TYPE) src_addr );
5555
5556#ifdef THREAD_DEBUG
5557  if (errno)
5558    {
5559      /* Don't bother for a known benign error: if you ask for the
5560         first thread state, but there is only one thread and it's
5561         not stopped, ttrace complains.
5562
5563         We have this inside the #ifdef because our caller will do
5564         this check for real.  */
5565      if( request != TT_PROC_GET_FIRST_LWP_STATE
5566          ||  errno   != EPROTO )
5567        {
5568          if( debug_on )
5569            printf( "TT fail for %s, with pid %d, tid %d, status %d \n",
5570                    get_printable_name_of_ttrace_request (TT_LWP_WUREGS),
5571                    pid, tid, tt_status );
5572        }
5573    }
5574#endif
5575
5576  return tt_status;
5577}
5578
5579void
5580_initialize_infttrace (void)
5581{
5582  /* Initialize the ttrace-based hardware watchpoint implementation. */
5583  memory_page_dictionary.page_count = (LONGEST) - 1;
5584  memory_page_dictionary.page_protections_allowed = 1;
5585
5586  errno = 0;
5587  memory_page_dictionary.page_size = sysconf (_SC_PAGE_SIZE);
5588
5589  /* We do a lot of casts from pointers to TTRACE_ARG_TYPE; make sure
5590     this is okay.  */
5591  if (sizeof (TTRACE_ARG_TYPE) < sizeof (void *))
5592    internal_error (__FILE__, __LINE__, "failed internal consistency check");
5593
5594  if (errno || (memory_page_dictionary.page_size <= 0))
5595    perror_with_name ("sysconf");
5596}
5597