1 /* Low level Unix child interface to ttrace, for GDB when running under HP-UX.
2 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
4 Free Software Foundation, Inc.
6 This file is part of GDB.
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.
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.
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. */
27 #include "gdb_string.h"
30 #include "gdbthread.h"
32 /* We need pstat functionality so that we can get the exec file
33 for a process we attach to.
35 According to HP, we should use the 64bit interfaces, so we
36 define _PSTAT64 to achieve this. */
38 #include <sys/pstat.h>
40 /* Some hackery to work around a use of the #define name NO_FLAGS
41 * in both gdb and HPUX (bfd.h and /usr/include/machine/vmparam.h).
44 #define INFTTRACE_TEMP_HACK NO_FLAGS
49 #include <sys/types.h>
52 #include <sys/param.h>
55 #include <sys/ioctl.h>
57 #include <sys/ttrace.h>
61 #ifdef PTRACE_IN_WRONG_PLACE
64 #include <sys/ptrace.h>
66 #endif /* NO_PTRACE_H */
68 /* Second half of the hackery above. Non-ANSI C, so
69 * we can't use "#error", alas.
72 #if (NO_FLAGS != INFTTRACE_TEMP_HACK )
73 /* #error "Hackery to remove warning didn't work right" */
75 /* Ok, new def'n of NO_FLAGS is same as old one; no action needed. */
78 /* #error "Didn't get expected re-definition of NO_FLAGS" */
79 #define NO_FLAGS INFTTRACE_TEMP_HACK
82 #if !defined (PT_SETTRC)
83 #define PT_SETTRC 0 /* Make process traceable by parent */
85 #if !defined (PT_READ_I)
86 #define PT_READ_I 1 /* Read word from text space */
88 #if !defined (PT_READ_D)
89 #define PT_READ_D 2 /* Read word from data space */
91 #if !defined (PT_READ_U)
92 #define PT_READ_U 3 /* Read word from kernel user struct */
94 #if !defined (PT_WRITE_I)
95 #define PT_WRITE_I 4 /* Write word to text space */
97 #if !defined (PT_WRITE_D)
98 #define PT_WRITE_D 5 /* Write word to data space */
100 #if !defined (PT_WRITE_U)
101 #define PT_WRITE_U 6 /* Write word to kernel user struct */
103 #if !defined (PT_CONTINUE)
104 #define PT_CONTINUE 7 /* Continue after signal */
106 #if !defined (PT_STEP)
107 #define PT_STEP 9 /* Set flag for single stepping */
109 #if !defined (PT_KILL)
110 #define PT_KILL 8 /* Send child a SIGKILL signal */
114 #define PT_ATTACH PTRACE_ATTACH
117 #define PT_DETACH PTRACE_DETACH
122 #include <sys/file.h>
125 /* This semaphore is used to coordinate the child and parent processes
126 after a fork(), and before an exec() by the child. See parent_attach_all
131 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */
132 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */
137 #define SEM_LISTEN (0)
139 static startup_semaphore_t startup_semaphore;
141 /* See can_touch_threads_of_process for details. */
142 static int vforking_child_pid = 0;
143 static int vfork_in_flight = 0;
145 /* To support PREPARE_TO_PROCEED (hppa_prepare_to_proceed).
147 static pid_t old_gdb_pid = 0;
148 static pid_t reported_pid = 0;
149 static int reported_bpt = 0;
151 /* 1 if ok as results of a ttrace or ttrace_wait call, 0 otherwise.
153 #define TT_OK( _status, _errno ) \
154 (((_status) == 1) && ((_errno) == 0))
156 #define TTRACE_ARG_TYPE uint64_t
158 /* When supplied as the "addr" operand, ttrace interprets this
159 to mean, "from the current address".
161 #define TT_USE_CURRENT_PC ((TTRACE_ARG_TYPE) TT_NOPC)
163 /* When supplied as the "addr", "data" or "addr2" operand for most
164 requests, ttrace interprets this to mean, "pay no heed to this
167 #define TT_NIL ((TTRACE_ARG_TYPE) TT_NULLARG)
169 /* This is capable of holding the value of a 32-bit register. The
170 value is always left-aligned in the buffer; i.e., [0] contains
171 the most-significant byte of the register's value, and [sizeof(reg)]
172 contains the least-significant value.
174 ??rehrauer: Yes, this assumes that an int is 32-bits on HP-UX, and
175 that registers are 32-bits on HP-UX. The latter assumption changes
178 typedef int register_value_t;
180 /********************************************************************
186 The rest of GDB sees threads as being things with different
187 "pid" (process id) values. See "thread.c" for details. The
188 separate threads will be seen and reacted to if infttrace passes
189 back different pid values (for _events_). See wait_for_inferior
192 So infttrace is going to use thread ids externally, pretending
193 they are process ids, and keep track internally so that it can
194 use the real process id (and thread id) when calling ttrace.
196 The data structure that supports this is a linked list of the
197 current threads. Since at some date infttrace will have to
198 deal with multiple processes, each list element records its
199 corresponding pid, rather than having a single global.
201 Note that the list is only approximately current; that's ok, as
202 it's up to date when we need it (we hope!). Also, it can contain
203 dead threads, as there's no harm if it does.
205 The approach taken here is to bury the translation from external
206 to internal inside "call_ttrace" and a few other places.
208 There are some wrinkles:
210 o When GDB forks itself to create the debug target process,
211 there's only a pid of 0 around in the child, so the
212 TT_PROC_SETTRC operation uses a more direct call to ttrace;
213 Similiarly, the initial setting of the event mask happens
214 early as well, and so is also special-cased, and an attach
217 o We define an unthreaded application as having a "pseudo"
220 o To keep from confusing the rest of GDB, we don't switch
221 the PID for the pseudo thread to a TID. A table will help:
223 Rest of GDB sees these PIDs: pid tid1 tid2 tid3 ...
225 Our thread list stores: pid pid pid pid ...
228 Ttrace sees these TIDS: tid0 tid1 tid2 tid3 ...
230 Both pid and tid0 will map to tid0, as there are infttrace.c-internal
231 calls to ttrace using tid0.
235 Since we're implementing the "stop the world" model, sub-model
236 "other threads run during step", we have some stuff to do:
238 o User steps require continuing all threads other than the
239 one the user is stepping;
241 o Internal debugger steps (such as over a breakpoint or watchpoint,
242 but not out of a library load thunk) require stepping only
243 the selected thread; this means that we have to report the
244 step finish on that thread, which can lead to complications;
246 o When a thread is created, it is created running, rather
247 than stopped--so we have to stop it.
249 The OS doesn't guarantee the stopped thread list will be stable,
250 no does it guarantee where on the stopped thread list a thread
251 that is single-stepped will wind up: it's possible that it will
252 be off the list for a while, it's possible the step will complete
253 and it will be re-posted to the end...
255 This means we have to scan the stopped thread list, build up
256 a work-list, and then run down the work list; we can't do the
257 step/continue during the scan.
261 Then there's the issue of waiting for an event. We do this by
262 noticing how many events are reported at the end of each wait.
263 From then on, we "fake" all resumes and steps, returning instantly,
264 and don't do another wait. Once all pending events are reported,
265 we can really resume again.
267 To keep this hidden, all the routines which know about tids and
268 pids or real events and simulated ones are static (file-local).
270 This code can make lots of calls to ttrace, in particular it
271 can spin down the list of thread states more than once. If this
272 becomes a performance hit, the spin could be done once and the
273 various "tsp" blocks saved, keeping all later spins in this
276 The O/S doesn't promise to keep the list straight, and so we must
277 re-scan a lot. By observation, it looks like a single-step/wait
278 puts the stepped thread at the end of the list but doesn't change
281 ****************************************************************
284 /* Uncomment these to turn on various debugging output */
285 /* #define THREAD_DEBUG */
286 /* #define WAIT_BUFFER_DEBUG */
287 /* #define PARANOIA */
290 #define INFTTRACE_ALL_THREADS (-1)
291 #define INFTTRACE_STEP (1)
292 #define INFTTRACE_CONTINUE (0)
294 /* FIX: this is used in inftarg.c/child_wait, in a hack.
296 extern int not_same_real_pid;
298 /* This is used to count buffered events.
300 static unsigned int more_events_left = 0;
304 typedef enum process_state_enum
308 FAKE_CONTINUE, /* For later use */
315 static process_state_t process_state = STOPPED;
317 /* User-specified stepping modality.
319 typedef enum stepping_mode_enum
321 DO_DEFAULT, /* ...which is a continue! */
327 /* Action to take on an attach, depends on
328 * what kind (user command, fork, vfork).
330 * At the moment, this is either:
332 * o continue with a SIGTRAP signal, or
336 typedef enum attach_continue_enum
343 /* This flag is true if we are doing a step-over-bpt
344 * with buffered events. We will have to be sure to
345 * report the right thread, as otherwise the spaghetti
346 * code in "infrun.c/wait_for_inferior" will get
349 static int doing_fake_step = 0;
350 static lwpid_t fake_step_tid = 0;
353 /****************************************************
354 * Thread information structure routines and types. *
355 ****************************************************
358 struct thread_info_struct
360 int am_pseudo; /* This is a pseudo-thread for the process. */
361 int pid; /* Process ID */
362 lwpid_t tid; /* Thread ID */
363 int handled; /* 1 if a buffered event was handled. */
364 int seen; /* 1 if this thread was seen on a traverse. */
365 int terminated; /* 1 if thread has terminated. */
366 int have_signal; /* 1 if signal to be sent */
367 enum target_signal signal_value; /* Signal to send */
368 int have_start; /* 1 if alternate starting address */
369 stepping_mode_t stepping_mode; /* Whether to step or continue */
370 CORE_ADDR start; /* Where to start */
371 int have_state; /* 1 if the event state has been set */
372 ttstate_t last_stop_state; /* The most recently-waited event for this thread. */
373 struct thread_info_struct
374 *next; /* All threads are linked via this field. */
375 struct thread_info_struct
376 *next_pseudo; /* All pseudo-threads are linked via this field. */
381 struct thread_info_header_struct
385 thread_info *head_pseudo;
390 static thread_info_header thread_head =
392 static thread_info_header deleted_threads =
395 static ptid_t saved_real_ptid;
398 /*************************************************
399 * Debugging support functions *
400 *************************************************
403 get_raw_pc (lwpid_t ttid)
405 unsigned long pc_val;
409 offset = register_addr (PC_REGNUM, U_REGS_OFFSET);
410 res = read_from_register_save_state (
412 (TTRACE_ARG_TYPE) offset,
417 return (CORE_ADDR) pc_val;
421 return (CORE_ADDR) 0;
426 get_printable_name_of_stepping_mode (stepping_mode_t mode)
435 return "DO_CONTINUE";
437 return "?unknown mode?";
441 /* This function returns a pointer to a string describing the
442 * ttrace event being reported.
445 get_printable_name_of_ttrace_event (ttevents_t event)
447 /* This enumeration is "gappy", so don't use a table. */
454 return "TTEVT_SIGNAL";
462 return "TTEVT_VFORK";
463 case TTEVT_SYSCALL_RETURN:
464 return "TTEVT_SYSCALL_RETURN";
465 case TTEVT_LWP_CREATE:
466 return "TTEVT_LWP_CREATE";
467 case TTEVT_LWP_TERMINATE:
468 return "TTEVT_LWP_TERMINATE";
470 return "TTEVT_LWP_EXIT";
471 case TTEVT_LWP_ABORT_SYSCALL:
472 return "TTEVT_LWP_ABORT_SYSCALL";
473 case TTEVT_SYSCALL_ENTRY:
474 return "TTEVT_SYSCALL_ENTRY";
475 case TTEVT_SYSCALL_RESTART:
476 return "TTEVT_SYSCALL_RESTART";
478 return "?new event?";
483 /* This function translates the ttrace request enumeration into
484 * a character string that is its printable (aka "human readable")
488 get_printable_name_of_ttrace_request (ttreq_t request)
490 if (!IS_TTRACE_REQ (request))
493 /* This enumeration is "gappy", so don't use a table. */
497 return "TT_PROC_SETTRC";
499 return "TT_PROC_ATTACH";
501 return "TT_PROC_DETACH";
503 return "TT_PROC_RDTEXT";
505 return "TT_PROC_WRTEXT";
507 return "TT_PROC_RDDATA";
509 return "TT_PROC_WRDATA";
511 return "TT_PROC_STOP";
512 case TT_PROC_CONTINUE:
513 return "TT_PROC_CONTINUE";
514 case TT_PROC_GET_PATHNAME:
515 return "TT_PROC_GET_PATHNAME";
516 case TT_PROC_GET_EVENT_MASK:
517 return "TT_PROC_GET_EVENT_MASK";
518 case TT_PROC_SET_EVENT_MASK:
519 return "TT_PROC_SET_EVENT_MASK";
520 case TT_PROC_GET_FIRST_LWP_STATE:
521 return "TT_PROC_GET_FIRST_LWP_STATE";
522 case TT_PROC_GET_NEXT_LWP_STATE:
523 return "TT_PROC_GET_NEXT_LWP_STATE";
525 return "TT_PROC_EXIT";
526 case TT_PROC_GET_MPROTECT:
527 return "TT_PROC_GET_MPROTECT";
528 case TT_PROC_SET_MPROTECT:
529 return "TT_PROC_SET_MPROTECT";
530 case TT_PROC_SET_SCBM:
531 return "TT_PROC_SET_SCBM";
533 return "TT_LWP_STOP";
534 case TT_LWP_CONTINUE:
535 return "TT_LWP_CONTINUE";
537 return "TT_LWP_SINGLE";
539 return "TT_LWP_RUREGS";
541 return "TT_LWP_WUREGS";
542 case TT_LWP_GET_EVENT_MASK:
543 return "TT_LWP_GET_EVENT_MASK";
544 case TT_LWP_SET_EVENT_MASK:
545 return "TT_LWP_SET_EVENT_MASK";
546 case TT_LWP_GET_STATE:
547 return "TT_LWP_GET_STATE";
554 /* This function translates the process state enumeration into
555 * a character string that is its printable (aka "human readable")
559 get_printable_name_of_process_state (process_state_t process_state)
561 switch (process_state)
566 return "FAKE_STEPPING";
574 return "?some unknown state?";
578 /* Set a ttrace thread state to a safe, initial state.
581 clear_ttstate_t (ttstate_t *tts)
585 tts->tts_user_tid = 0;
586 tts->tts_event = TTEVT_NONE;
589 /* Copy ttrace thread state TTS_FROM into TTS_TO.
592 copy_ttstate_t (ttstate_t *tts_to, ttstate_t *tts_from)
594 memcpy ((char *) tts_to, (char *) tts_from, sizeof (*tts_to));
597 /* Are there any live threads we know about?
600 any_thread_records (void)
602 return (thread_head.count > 0);
605 /* Create, fill in and link in a thread descriptor.
608 create_thread_info (int pid, lwpid_t tid)
612 int thread_count_of_pid;
614 new_p = xmalloc (sizeof (thread_info));
617 new_p->have_signal = 0;
618 new_p->have_start = 0;
619 new_p->have_state = 0;
620 clear_ttstate_t (&new_p->last_stop_state);
621 new_p->am_pseudo = 0;
624 new_p->terminated = 0;
626 new_p->next_pseudo = NULL;
627 new_p->stepping_mode = DO_DEFAULT;
629 if (0 == thread_head.count)
633 printf ("First thread, pid %d tid %d!\n", pid, tid);
635 saved_real_ptid = inferior_ptid;
641 printf ("Subsequent thread, pid %d tid %d\n", pid, tid);
645 /* Another day, another thread...
649 /* The new thread always goes at the head of the list.
651 new_p->next = thread_head.head;
652 thread_head.head = new_p;
654 /* Is this the "pseudo" thread of a process? It is if there's
655 * no other thread for this process on the list. (Note that this
656 * accomodates multiple processes, such as we see even for simple
657 * cases like forking "non-threaded" programs.)
659 p = thread_head.head;
660 thread_count_of_pid = 0;
663 if (p->pid == new_p->pid)
664 thread_count_of_pid++;
668 /* Did we see any other threads for this pid? (Recall that we just
669 * added this thread to the list...)
671 if (thread_count_of_pid == 1)
673 new_p->am_pseudo = 1;
674 new_p->next_pseudo = thread_head.head_pseudo;
675 thread_head.head_pseudo = new_p;
681 /* Get rid of our thread info.
684 clear_thread_info (void)
691 printf ("Clearing all thread info\n");
694 p = thread_head.head;
702 thread_head.head = NULL;
703 thread_head.head_pseudo = NULL;
704 thread_head.count = 0;
706 p = deleted_threads.head;
714 deleted_threads.head = NULL;
715 deleted_threads.head_pseudo = NULL;
716 deleted_threads.count = 0;
718 /* No threads, so can't have pending events.
720 more_events_left = 0;
723 /* Given a tid, find the thread block for it.
726 find_thread_info (lwpid_t tid)
730 for (p = thread_head.head; p; p = p->next)
738 for (p = deleted_threads.head; p; p = p->next)
749 /* For any but the pseudo thread, this maps to the
750 * thread ID. For the pseudo thread, if you pass either
751 * the thread id or the PID, you get the pseudo thread ID.
753 * We have to be prepared for core gdb to ask about
754 * deleted threads. We do the map, but we don't like it.
757 map_from_gdb_tid (lwpid_t gdb_tid)
761 /* First assume gdb_tid really is a tid, and try to find a
762 * matching entry on the threads list.
764 for (p = thread_head.head; p; p = p->next)
766 if (p->tid == gdb_tid)
770 /* It doesn't appear to be a tid; perhaps it's really a pid?
771 * Try to find a "pseudo" thread entry on the threads list.
773 for (p = thread_head.head_pseudo; p != NULL; p = p->next_pseudo)
775 if (p->pid == gdb_tid)
779 /* Perhaps it's the tid of a deleted thread we may still
780 * have some knowledge of?
782 for (p = deleted_threads.head; p; p = p->next)
784 if (p->tid == gdb_tid)
788 /* Or perhaps it's the pid of a deleted process we may still
791 for (p = deleted_threads.head_pseudo; p != NULL; p = p->next_pseudo)
793 if (p->pid == gdb_tid)
797 return 0; /* Error? */
800 /* Map the other way: from a real tid to the
801 * "pid" known by core gdb. This tid may be
802 * for a thread that just got deleted, so we
803 * also need to consider deleted threads.
806 map_to_gdb_tid (lwpid_t real_tid)
810 for (p = thread_head.head; p; p = p->next)
812 if (p->tid == real_tid)
821 for (p = deleted_threads.head; p; p = p->next)
823 if (p->tid == real_tid)
825 return p->pid; /* Error? */
830 return 0; /* Error? Never heard of this thread! */
833 /* Do any threads have saved signals?
836 saved_signals_exist (void)
840 for (p = thread_head.head; p; p = p->next)
851 /* Is this the tid for the zero-th thread?
854 is_pseudo_thread (lwpid_t tid)
856 thread_info *p = find_thread_info (tid);
857 if (NULL == p || p->terminated)
863 /* Is this thread terminated?
866 is_terminated (lwpid_t tid)
868 thread_info *p = find_thread_info (tid);
871 return p->terminated;
876 /* Is this pid a real PID or a TID?
879 is_process_id (int pid)
886 /* What does PID really represent?
888 tid = map_from_gdb_tid (pid);
890 return 0; /* Actually, is probably an error... */
892 tinfo = find_thread_info (tid);
894 /* Does it appear to be a true thread?
896 if (!tinfo->am_pseudo)
899 /* Else, it looks like it may be a process. See if there's any other
900 * threads with the same process ID, though. If there are, then TID
901 * just happens to be the first thread of several for this process.
903 this_pid = tinfo->pid;
905 for (tinfo = thread_head.head; tinfo; tinfo = tinfo->next)
907 if (tinfo->pid == this_pid)
911 return (this_pid_count == 1);
915 /* Add a thread to our info. Prevent duplicate entries.
918 add_tthread (int pid, lwpid_t tid)
922 p = find_thread_info (tid);
924 p = create_thread_info (pid, tid);
929 /* Notice that a thread was deleted.
932 del_tthread (lwpid_t tid)
937 if (thread_head.count <= 0)
939 error ("Internal error in thread database.");
944 for (p = thread_head.head; p; p = p->next)
951 printf ("Delete here: %d \n", tid);
957 * Deleting a main thread is ok if we're doing
958 * a parent-follow on a child; this is odd but
959 * not wrong. It apparently _doesn't_ happen
960 * on the child-follow, as we don't just delete
961 * the pseudo while keeping the rest of the
962 * threads around--instead, we clear out the whole
963 * thread list at once.
966 thread_info *q_chase;
969 for (q = thread_head.head_pseudo; q; q = q->next)
973 /* Remove from pseudo list.
976 thread_head.head_pseudo = p->next_pseudo;
978 q_chase->next = p->next_pseudo;
985 /* Remove from live list.
990 thread_head.head = p->next;
992 chase->next = p->next;
994 /* Add to deleted thread list.
996 p->next = deleted_threads.head;
997 deleted_threads.head = p;
998 deleted_threads.count++;
1001 p->next_pseudo = deleted_threads.head_pseudo;
1002 deleted_threads.head_pseudo = p;
1014 /* Get the pid for this tid. (Has to be a real TID!).
1017 get_pid_for (lwpid_t tid)
1021 for (p = thread_head.head; p; p = p->next)
1029 for (p = deleted_threads.head; p; p = p->next)
1040 /* Note that this thread's current event has been handled.
1043 set_handled (int pid, lwpid_t tid)
1047 p = find_thread_info (tid);
1049 p = add_tthread (pid, tid);
1054 /* Was this thread's current event handled?
1057 was_handled (lwpid_t tid)
1061 p = find_thread_info (tid);
1065 return 0; /* New threads have not been handled */
1068 /* Set this thread to unhandled.
1071 clear_handled (lwpid_t tid)
1075 #ifdef WAIT_BUFFER_DEBUG
1077 printf ("clear_handled %d\n", (int) tid);
1080 p = find_thread_info (tid);
1082 error ("Internal error: No thread state to clear?");
1087 /* Set all threads to unhandled.
1090 clear_all_handled (void)
1094 #ifdef WAIT_BUFFER_DEBUG
1096 printf ("clear_all_handled\n");
1099 for (p = thread_head.head; p; p = p->next)
1104 for (p = deleted_threads.head; p; p = p->next)
1110 /* Set this thread to default stepping mode.
1113 clear_stepping_mode (lwpid_t tid)
1117 #ifdef WAIT_BUFFER_DEBUG
1119 printf ("clear_stepping_mode %d\n", (int) tid);
1122 p = find_thread_info (tid);
1124 error ("Internal error: No thread state to clear?");
1126 p->stepping_mode = DO_DEFAULT;
1129 /* Set all threads to do default continue on resume.
1132 clear_all_stepping_mode (void)
1136 #ifdef WAIT_BUFFER_DEBUG
1138 printf ("clear_all_stepping_mode\n");
1141 for (p = thread_head.head; p; p = p->next)
1143 p->stepping_mode = DO_DEFAULT;
1146 for (p = deleted_threads.head; p; p = p->next)
1148 p->stepping_mode = DO_DEFAULT;
1152 /* Set all threads to unseen on this pass.
1155 set_all_unseen (void)
1159 for (p = thread_head.head; p; p = p->next)
1165 #if (defined( THREAD_DEBUG ) || defined( PARANOIA ))
1166 /* debugging routine.
1169 print_tthread (thread_info *p)
1171 printf (" Thread pid %d, tid %d", p->pid, p->tid);
1173 printf (", event is %s",
1174 get_printable_name_of_ttrace_event (p->last_stop_state.tts_event));
1177 printf (", pseudo thread");
1180 printf (", have signal 0x%x", p->signal_value);
1183 printf (", have start at 0x%x", p->start);
1185 printf (", step is %s", get_printable_name_of_stepping_mode (p->stepping_mode));
1188 printf (", handled");
1190 printf (", not handled");
1195 printf (", not seen");
1201 print_tthreads (void)
1205 if (thread_head.count == 0)
1206 printf ("Thread list is empty\n");
1209 printf ("Thread list has ");
1210 if (thread_head.count == 1)
1211 printf ("1 entry:\n");
1213 printf ("%d entries:\n", thread_head.count);
1214 for (p = thread_head.head; p; p = p->next)
1220 if (deleted_threads.count == 0)
1221 printf ("Deleted thread list is empty\n");
1224 printf ("Deleted thread list has ");
1225 if (deleted_threads.count == 1)
1226 printf ("1 entry:\n");
1228 printf ("%d entries:\n", deleted_threads.count);
1230 for (p = deleted_threads.head; p; p = p->next)
1238 /* Update the thread list based on the "seen" bits.
1241 update_thread_list (void)
1247 for (p = thread_head.head; p; p = p->next)
1249 /* Is this an "unseen" thread which really happens to be a process?
1250 If so, is it inferior_ptid and is a vfork in flight? If yes to
1251 all, then DON'T REMOVE IT! We're in the midst of moving a vfork
1252 operation, which is a multiple step thing, to the point where we
1253 can touch the parent again. We've most likely stopped to examine
1254 the child at a late stage in the vfork, and if we're not following
1255 the child, we'd best not treat the parent as a dead "thread"...
1257 if ((!p->seen) && p->am_pseudo && vfork_in_flight
1258 && (p->pid != vforking_child_pid))
1268 printf ("Delete unseen thread: %d \n", p->tid);
1270 del_tthread (p->tid);
1277 /************************************************
1278 * O/S call wrappers *
1279 ************************************************
1282 /* This function simply calls ttrace with the given arguments.
1283 * It exists so that all calls to ttrace are isolated. All
1284 * parameters should be as specified by "man 2 ttrace".
1286 * No other "raw" calls to ttrace should exist in this module.
1289 call_real_ttrace (ttreq_t request, pid_t pid, lwpid_t tid, TTRACE_ARG_TYPE addr,
1290 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2)
1295 tt_status = ttrace (request, pid, tid, addr, data, addr2);
1300 /* Don't bother for a known benign error: if you ask for the
1301 * first thread state, but there is only one thread and it's
1302 * not stopped, ttrace complains.
1304 * We have this inside the #ifdef because our caller will do
1305 * this check for real.
1307 if (request != TT_PROC_GET_FIRST_LWP_STATE
1311 printf ("TT fail for %s, with pid %d, tid %d, status %d \n",
1312 get_printable_name_of_ttrace_request (request),
1313 pid, tid, tt_status);
1319 /* ??rehrauer: It would probably be most robust to catch and report
1320 * failed requests here. However, some clients of this interface
1321 * seem to expect to catch & deal with them, so we'd best not.
1325 strcpy (reason_for_failure, "ttrace (");
1326 strcat (reason_for_failure, get_printable_name_of_ttrace_request (request));
1327 strcat (reason_for_failure, ")");
1328 printf ("ttrace error, errno = %d\n", errno);
1329 perror_with_name (reason_for_failure);
1337 /* This function simply calls ttrace_wait with the given arguments.
1338 * It exists so that all calls to ttrace_wait are isolated.
1340 * No "raw" calls to ttrace_wait should exist elsewhere.
1343 call_real_ttrace_wait (int pid, lwpid_t tid, ttwopt_t option, ttstate_t *tsp,
1347 thread_info *tinfo = NULL;
1350 ttw_status = ttrace_wait (pid, tid, option, tsp, tsp_size);
1356 printf ("TW fail with pid %d, tid %d \n", pid, tid);
1359 perror_with_name ("ttrace wait");
1366 /* A process may have one or more kernel threads, of which all or
1367 none may be stopped. This function returns the ID of the first
1368 kernel thread in a stopped state, or 0 if none are stopped.
1370 This function can be used with get_process_next_stopped_thread_id
1371 to iterate over the IDs of all stopped threads of this process.
1374 get_process_first_stopped_thread_id (int pid, ttstate_t *thread_state)
1378 tt_status = call_real_ttrace (TT_PROC_GET_FIRST_LWP_STATE,
1381 (TTRACE_ARG_TYPE) thread_state,
1382 (TTRACE_ARG_TYPE) sizeof (*thread_state),
1387 if (errno == EPROTO)
1389 /* This is an error we can handle: there isn't any stopped
1390 * thread. This happens when we're re-starting the application
1391 * and it has only one thread. GET_NEXT handles the case of
1392 * no more stopped threads well; GET_FIRST doesn't. (A ttrace
1400 perror_with_name ("ttrace");
1408 return thread_state->tts_lwpid;
1412 /* This function returns the ID of the "next" kernel thread in a
1413 stopped state, or 0 if there are none. "Next" refers to the
1414 thread following that of the last successful call to this
1415 function or to get_process_first_stopped_thread_id, using
1416 the value of thread_state returned by that call.
1418 This function can be used with get_process_first_stopped_thread_id
1419 to iterate over the IDs of all stopped threads of this process.
1422 get_process_next_stopped_thread_id (int pid, ttstate_t *thread_state)
1426 tt_status = call_real_ttrace (
1427 TT_PROC_GET_NEXT_LWP_STATE,
1430 (TTRACE_ARG_TYPE) thread_state,
1431 (TTRACE_ARG_TYPE) sizeof (*thread_state),
1434 perror_with_name ("ttrace");
1441 else if (tt_status == 0)
1443 /* End of list, no next state. Don't return the
1444 * tts_lwpid, as it's a meaningless "240".
1446 * This is an HPUX "feature".
1451 return thread_state->tts_lwpid;
1454 /* ??rehrauer: Eventually this function perhaps should be calling
1455 pid_to_thread_id. However, that function currently does nothing
1456 for HP-UX. Even then, I'm not clear whether that function
1457 will return a "kernel" thread ID, or a "user" thread ID. If
1458 the former, we can just call it here. If the latter, we must
1459 map from the "user" tid to a "kernel" tid.
1461 NOTE: currently not called.
1464 get_active_tid_of_pid (int pid)
1466 ttstate_t thread_state;
1468 return get_process_first_stopped_thread_id (pid, &thread_state);
1471 /* This function returns 1 if tt_request is a ttrace request that
1472 * operates upon all threads of a (i.e., the entire) process.
1475 is_process_ttrace_request (ttreq_t tt_request)
1477 return IS_TTRACE_PROCREQ (tt_request);
1481 /* This function translates a thread ttrace request into
1482 * the equivalent process request for a one-thread process.
1485 make_process_version (ttreq_t request)
1487 if (!IS_TTRACE_REQ (request))
1489 error ("Internal error, bad ttrace request made\n");
1496 return TT_PROC_STOP;
1498 case TT_LWP_CONTINUE:
1499 return TT_PROC_CONTINUE;
1501 case TT_LWP_GET_EVENT_MASK:
1502 return TT_PROC_GET_EVENT_MASK;
1504 case TT_LWP_SET_EVENT_MASK:
1505 return TT_PROC_SET_EVENT_MASK;
1510 case TT_LWP_GET_STATE:
1511 return -1; /* No equivalent */
1519 /* This function translates the "pid" used by the rest of
1520 * gdb to a real pid and a tid. It then calls "call_real_ttrace"
1521 * with the given arguments.
1523 * In general, other parts of this module should call this
1524 * function when they are dealing with external users, who only
1525 * have tids to pass (but they call it "pid" for historical
1529 call_ttrace (ttreq_t request, int gdb_tid, TTRACE_ARG_TYPE addr,
1530 TTRACE_ARG_TYPE data, TTRACE_ARG_TYPE addr2)
1534 ttreq_t new_request;
1536 char reason_for_failure[100]; /* Arbitrary size, should be big enough. */
1539 int is_interesting = 0;
1541 if (TT_LWP_RUREGS == request)
1543 is_interesting = 1; /* Adjust code here as desired */
1546 if (is_interesting && 0 && debug_on)
1548 if (!is_process_ttrace_request (request))
1550 printf ("TT: Thread request, tid is %d", gdb_tid);
1551 printf ("== SINGLE at %x", addr);
1555 printf ("TT: Process request, tid is %d\n", gdb_tid);
1556 printf ("==! SINGLE at %x", addr);
1561 /* The initial SETTRC and SET_EVENT_MASK calls (and all others
1562 * which happen before any threads get set up) should go
1563 * directly to "call_real_ttrace", so they don't happen here.
1565 * But hardware watchpoints do a SET_EVENT_MASK, so we can't
1569 if (request == TT_PROC_SETTRC && debug_on)
1570 printf ("Unexpected call for TT_PROC_SETTRC\n");
1573 /* Sometimes we get called with a bogus tid (e.g., if a
1574 * thread has terminated, we return 0; inftarg later asks
1575 * whether the thread has exited/forked/vforked).
1579 errno = ESRCH; /* ttrace's response would probably be "No such process". */
1583 /* All other cases should be able to expect that there are
1586 if (!any_thread_records ())
1590 warning ("No thread records for ttrace call");
1592 errno = ESRCH; /* ttrace's response would be "No such process". */
1596 /* OK, now the task is to translate the incoming tid into
1599 real_tid = map_from_gdb_tid (gdb_tid);
1600 real_pid = get_pid_for (real_tid);
1602 /* Now check the result. "Real_pid" is NULL if our list
1603 * didn't find it. We have some tricks we can play to fix
1608 ttstate_t thread_state;
1612 printf ("No saved pid for tid %d\n", gdb_tid);
1615 if (is_process_ttrace_request (request))
1618 /* Ok, we couldn't get a tid. Try to translate to
1619 * the equivalent process operation. We expect this
1620 * NOT to happen, so this is a desparation-type
1621 * move. It can happen if there is an internal
1622 * error and so no "wait()" call is ever done.
1624 new_request = make_process_version (request);
1625 if (new_request == -1)
1630 printf ("...and couldn't make process version of thread operation\n");
1633 /* Use hacky saved pid, which won't always be correct
1634 * in the multi-process future. Use tid as thread,
1635 * probably dooming this to failure. FIX!
1637 if (! ptid_equal (saved_real_ptid, null_ptid))
1641 printf ("...using saved pid %d\n",
1642 PIDGET (saved_real_ptid));
1645 real_pid = PIDGET (saved_real_ptid);
1650 error ("Unable to perform thread operation");
1655 /* Sucessfully translated this to a process request,
1656 * which needs no thread value.
1660 request = new_request;
1665 printf ("Translated thread request to process request\n");
1666 if (ptid_equal (saved_real_ptid, null_ptid))
1667 printf ("...but there's no saved pid\n");
1671 if (gdb_tid != PIDGET (saved_real_ptid))
1672 printf ("...but have the wrong pid (%d rather than %d)\n",
1673 gdb_tid, PIDGET (saved_real_ptid));
1677 } /* Translated to a process request */
1678 } /* Is a process request */
1682 /* We have to have a thread. Ooops.
1684 error ("Thread request with no threads (%s)",
1685 get_printable_name_of_ttrace_request (request));
1689 /* Ttrace doesn't like to see tid values on process requests,
1690 * even if we have the right one.
1692 if (is_process_ttrace_request (request))
1698 if (is_interesting && 0 && debug_on)
1700 printf (" now tid %d, pid %d\n", real_tid, real_pid);
1701 printf (" request is %s\n", get_printable_name_of_ttrace_request (request));
1705 /* Finally, the (almost) real call.
1707 tt_status = call_real_ttrace (request, real_pid, real_tid, addr, data, addr2);
1710 if (is_interesting && debug_on)
1712 if (!TT_OK (tt_status, errno)
1713 && !(tt_status == 0 & errno == 0))
1714 printf (" got error (errno==%d, status==%d)\n", errno, tt_status);
1722 /* Stop all the threads of a process.
1724 * NOTE: use of TT_PROC_STOP can cause a thread with a real event
1725 * to get a TTEVT_NONE event, discarding the old event. Be
1726 * very careful, and only call TT_PROC_STOP when you mean it!
1729 stop_all_threads_of_process (pid_t real_pid)
1733 ttw_status = call_real_ttrace (TT_PROC_STOP,
1736 (TTRACE_ARG_TYPE) TT_NIL,
1737 (TTRACE_ARG_TYPE) TT_NIL,
1740 perror_with_name ("ttrace stop of other threads");
1744 /* Under some circumstances, it's unsafe to attempt to stop, or even
1745 query the state of, a process' threads.
1747 In ttrace-based HP-UX, an example is a vforking child process. The
1748 vforking parent and child are somewhat fragile, w/r/t what we can do
1749 what we can do to them with ttrace, until after the child exits or
1750 execs, or until the parent's vfork event is delivered. Until that
1751 time, we must not try to stop the process' threads, or inquire how
1752 many there are, or even alter its data segments, or it typically dies
1753 with a SIGILL. Sigh.
1755 This function returns 1 if this stopped process, and the event that
1756 we're told was responsible for its current stopped state, cannot safely
1757 have its threads examined.
1759 #define CHILD_VFORKED(evt,pid) \
1760 (((evt) == TTEVT_VFORK) && ((pid) != PIDGET (inferior_ptid)))
1761 #define CHILD_URPED(evt,pid) \
1762 ((((evt) == TTEVT_EXEC) || ((evt) == TTEVT_EXIT)) && ((pid) != vforking_child_pid))
1763 #define PARENT_VFORKED(evt,pid) \
1764 (((evt) == TTEVT_VFORK) && ((pid) == PIDGET (inferior_ptid)))
1767 can_touch_threads_of_process (int pid, ttevents_t stopping_event)
1769 if (CHILD_VFORKED (stopping_event, pid))
1771 vforking_child_pid = pid;
1772 vfork_in_flight = 1;
1775 else if (vfork_in_flight &&
1776 (PARENT_VFORKED (stopping_event, pid) ||
1777 CHILD_URPED (stopping_event, pid)))
1779 vfork_in_flight = 0;
1780 vforking_child_pid = 0;
1783 return !vfork_in_flight;
1787 /* If we can find an as-yet-unhandled thread state of a
1788 * stopped thread of this process return 1 and set "tsp".
1789 * Return 0 if we can't.
1791 * If this function is used when the threads of PIS haven't
1792 * been stopped, undefined behaviour is guaranteed!
1795 select_stopped_thread_of_process (int pid, ttstate_t *tsp)
1797 lwpid_t candidate_tid, tid;
1798 ttstate_t candidate_tstate, tstate;
1800 /* If we're not allowed to touch the process now, then just
1801 * return the current value of *TSP.
1803 * This supports "vfork". It's ok, really, to double the
1804 * current event (the child EXEC, we hope!).
1806 if (!can_touch_threads_of_process (pid, tsp->tts_event))
1809 /* Decide which of (possibly more than one) events to
1810 * return as the first one. We scan them all so that
1811 * we always return the result of a fake-step first.
1814 for (tid = get_process_first_stopped_thread_id (pid, &tstate);
1816 tid = get_process_next_stopped_thread_id (pid, &tstate))
1818 /* TTEVT_NONE events are uninteresting to our clients. They're
1819 * an artifact of our "stop the world" model--the thread is
1820 * stopped because we stopped it.
1822 if (tstate.tts_event == TTEVT_NONE)
1824 set_handled (pid, tstate.tts_lwpid);
1827 /* Did we just single-step a single thread, without letting any
1828 * of the others run? Is this an event for that thread?
1830 * If so, we believe our client would prefer to see this event
1831 * over any others. (Typically the client wants to just push
1832 * one thread a little farther forward, and then go around
1833 * checking for what all threads are doing.)
1835 else if (doing_fake_step && (tstate.tts_lwpid == fake_step_tid))
1837 #ifdef WAIT_BUFFER_DEBUG
1838 /* It's possible here to see either a SIGTRAP (due to
1839 * successful completion of a step) or a SYSCALL_ENTRY
1840 * (due to a step completion with active hardware
1844 printf ("Ending fake step with tid %d, state %s\n",
1846 get_printable_name_of_ttrace_event (tstate.tts_event));
1849 /* Remember this one, and throw away any previous
1852 candidate_tid = tstate.tts_lwpid;
1853 candidate_tstate = tstate;
1856 #ifdef FORGET_DELETED_BPTS
1858 /* We can't just do this, as if we do, and then wind
1859 * up the loop with no unhandled events, we need to
1860 * handle that case--the appropriate reaction is to
1861 * just continue, but there's no easy way to do that.
1863 * Better to put this in the ttrace_wait call--if, when
1864 * we fake a wait, we update our events based on the
1865 * breakpoint_here_pc call and find there are no more events,
1866 * then we better continue and so on.
1868 * Or we could put it in the next/continue fake.
1869 * But it has to go in the buffering code, not in the
1870 * real go/wait code.
1872 else if ((TTEVT_SIGNAL == tstate.tts_event)
1873 && (5 == tstate.tts_u.tts_signal.tts_signo)
1874 && (0 != get_raw_pc (tstate.tts_lwpid))
1875 && !breakpoint_here_p (get_raw_pc (tstate.tts_lwpid)))
1878 * If the user deleted a breakpoint while this
1879 * breakpoint-hit event was buffered, we can forget
1882 #ifdef WAIT_BUFFER_DEBUG
1884 printf ("Forgetting deleted bp hit for thread %d\n",
1888 set_handled (pid, tstate.tts_lwpid);
1892 /* Else, is this the first "unhandled" event? If so,
1893 * we believe our client wants to see it (if we don't
1894 * see a fake-step later on in the scan).
1896 else if (!was_handled (tstate.tts_lwpid) && candidate_tid == 0)
1898 candidate_tid = tstate.tts_lwpid;
1899 candidate_tstate = tstate;
1902 /* This is either an event that has already been "handled",
1903 * and thus we believe is uninteresting to our client, or we
1904 * already have a candidate event. Ignore it...
1908 /* What do we report?
1910 if (doing_fake_step)
1912 if (candidate_tid == fake_step_tid)
1916 tstate = candidate_tstate;
1920 warning ("Internal error: fake-step failed to complete.");
1924 else if (candidate_tid != 0)
1926 /* Found a candidate unhandled event.
1928 tstate = candidate_tstate;
1932 warning ("Internal error in call of ttrace_wait.");
1937 warning ("Internal error: no unhandled thread event to select");
1941 copy_ttstate_t (tsp, &tstate);
1943 } /* End of select_stopped_thread_of_process */
1946 /* Check our internal thread data against the real thing.
1949 check_thread_consistency (pid_t real_pid)
1951 int tid; /* really lwpid_t */
1955 /* Spin down the O/S list of threads, checking that they
1956 * match what we've got.
1958 for (tid = get_process_first_stopped_thread_id (real_pid, &tstate);
1960 tid = get_process_next_stopped_thread_id (real_pid, &tstate))
1963 p = find_thread_info (tid);
1967 warning ("No internal thread data for thread %d.", tid);
1973 warning ("Inconsistent internal thread data for thread %d.", tid);
1978 warning ("Thread %d is not terminated, internal error.", tid);
1983 #define TT_COMPARE( fld ) \
1984 tstate.fld != p->last_stop_state.fld
1988 if (TT_COMPARE (tts_pid)
1989 || TT_COMPARE (tts_lwpid)
1990 || TT_COMPARE (tts_user_tid)
1991 || TT_COMPARE (tts_event)
1992 || TT_COMPARE (tts_flags)
1993 || TT_COMPARE (tts_scno)
1994 || TT_COMPARE (tts_scnargs))
1996 warning ("Internal thread data for thread %d is wrong.", tid);
2002 #endif /* PARANOIA */
2005 /* This function wraps calls to "call_real_ttrace_wait" so
2006 * that a actual wait is only done when all pending events
2007 * have been reported.
2009 * Note that typically it is called with a pid of "0", i.e.
2010 * the "don't care" value.
2012 * Return value is the status of the pseudo wait.
2015 call_ttrace_wait (int pid, ttwopt_t option, ttstate_t *tsp, size_t tsp_size)
2017 /* This holds the actual, for-real, true process ID.
2019 static int real_pid;
2021 /* As an argument to ttrace_wait, zero pid
2022 * means "Any process", and zero tid means
2023 * "Any thread of the specified process".
2026 lwpid_t wait_tid = 0;
2029 int ttw_status = 0; /* To be returned */
2031 thread_info *tinfo = NULL;
2039 printf ("TW: Pid to wait on is %d\n", pid);
2042 if (!any_thread_records ())
2043 error ("No thread records for ttrace call w. specific pid");
2045 /* OK, now the task is to translate the incoming tid into
2048 real_tid = map_from_gdb_tid (pid);
2049 real_pid = get_pid_for (real_tid);
2052 printf ("==TW: real pid %d, real tid %d\n", real_pid, real_tid);
2057 /* Sanity checks and set-up.
2060 * Stopped Running Fake-step (v)Fork
2061 * \________________________________________
2063 * No buffered events | error wait wait wait
2065 * Buffered events | debuffer error wait debuffer (?)
2068 if (more_events_left == 0)
2071 if (process_state == RUNNING)
2073 /* OK--normal call of ttrace_wait with no buffered events.
2077 else if (process_state == FAKE_STEPPING)
2079 /* Ok--call of ttrace_wait to support
2080 * fake stepping with no buffered events.
2082 * But we better be fake-stepping!
2084 if (!doing_fake_step)
2086 warning ("Inconsistent thread state.");
2089 else if ((process_state == FORKING)
2090 || (process_state == VFORKING))
2092 /* Ok--there are two processes, so waiting
2093 * for the second while the first is stopped
2094 * is ok. Handled bits stay as they were.
2098 else if (process_state == STOPPED)
2100 warning ("Process not running at wait call.");
2105 warning ("Inconsistent process state.");
2112 if (process_state == STOPPED)
2114 /* OK--buffered events being unbuffered.
2118 else if (process_state == RUNNING)
2120 /* An error--shouldn't have buffered events
2123 warning ("Trying to continue with buffered events:");
2125 else if (process_state == FAKE_STEPPING)
2128 * Better be fake-stepping!
2130 if (!doing_fake_step)
2132 warning ("Losing buffered thread events!\n");
2135 else if ((process_state == FORKING)
2136 || (process_state == VFORKING))
2138 /* Ok--there are two processes, so waiting
2139 * for the second while the first is stopped
2140 * is ok. Handled bits stay as they were.
2145 warning ("Process in unknown state with buffered events.");
2148 /* Sometimes we have to wait for a particular thread
2149 * (if we're stepping over a bpt). In that case, we
2150 * _know_ it's going to complete the single-step we
2151 * asked for (because we're only doing the step under
2152 * certain very well-understood circumstances), so it
2155 if (doing_fake_step)
2157 wait_tid = fake_step_tid;
2158 wait_pid = get_pid_for (fake_step_tid);
2160 #ifdef WAIT_BUFFER_DEBUG
2162 printf ("Doing a wait after a fake-step for %d, pid %d\n",
2163 wait_tid, wait_pid);
2167 if (more_events_left == 0 /* No buffered events, need real ones. */
2168 || process_state != STOPPED)
2170 /* If there are no buffered events, and so we need
2171 * real ones, or if we are FORKING, VFORKING,
2172 * FAKE_STEPPING or RUNNING, and thus have to do
2173 * a real wait, then do a real wait.
2176 #ifdef WAIT_BUFFER_DEBUG
2177 /* Normal case... */
2179 printf ("TW: do it for real; pid %d, tid %d\n", wait_pid, wait_tid);
2182 /* The actual wait call.
2184 ttw_status = call_real_ttrace_wait (wait_pid, wait_tid, option, tsp, tsp_size);
2186 /* Note that the routines we'll call will be using "call_real_ttrace",
2187 * not "call_ttrace", and thus need the real pid rather than the pseudo-tid
2188 * the rest of the world uses (which is actually the tid).
2190 real_pid = tsp->tts_pid;
2192 /* For most events: Stop the world!
2194 * It's sometimes not safe to stop all threads of a process.
2195 * Sometimes it's not even safe to ask for the thread state
2198 if (can_touch_threads_of_process (real_pid, tsp->tts_event))
2200 /* If we're really only stepping a single thread, then don't
2201 * try to stop all the others -- we only do this single-stepping
2202 * business when all others were already stopped...and the stop
2203 * would mess up other threads' events.
2205 * Similiarly, if there are other threads with events,
2206 * don't do the stop.
2208 if (!doing_fake_step)
2210 if (more_events_left > 0)
2211 warning ("Internal error in stopping process");
2213 stop_all_threads_of_process (real_pid);
2215 /* At this point, we could scan and update_thread_list(),
2216 * and only use the local list for the rest of the
2217 * module! We'd get rid of the scans in the various
2218 * continue routines (adding one in attach). It'd
2219 * be great--UPGRADE ME!
2227 if (more_events_left > 0)
2228 printf ("== Can't stop process; more events!\n");
2230 printf ("== Can't stop process!\n");
2234 process_state = STOPPED;
2236 #ifdef WAIT_BUFFER_DEBUG
2238 printf ("Process set to STOPPED\n");
2244 /* Fake a call to ttrace_wait. The process must be
2245 * STOPPED, as we aren't going to do any wait.
2247 #ifdef WAIT_BUFFER_DEBUG
2249 printf ("TW: fake it\n");
2252 if (process_state != STOPPED)
2254 warning ("Process not stopped at wait call, in state '%s'.\n",
2255 get_printable_name_of_process_state (process_state));
2258 if (doing_fake_step)
2259 error ("Internal error in stepping over breakpoint");
2261 ttw_status = 0; /* Faking it is always successful! */
2262 } /* End of fake or not? if */
2264 /* Pick an event to pass to our caller. Be paranoid.
2266 if (!select_stopped_thread_of_process (real_pid, tsp))
2267 warning ("Can't find event, using previous event.");
2269 else if (tsp->tts_event == TTEVT_NONE)
2270 warning ("Internal error: no thread has a real event.");
2272 else if (doing_fake_step)
2274 if (fake_step_tid != tsp->tts_lwpid)
2275 warning ("Internal error in stepping over breakpoint.");
2277 /* This wait clears the (current) fake-step if there was one.
2279 doing_fake_step = 0;
2283 /* We now have a correct tsp and ttw_status for the thread
2284 * which we want to report. So it's "handled"! This call
2285 * will add it to our list if it's not there already.
2287 set_handled (real_pid, tsp->tts_lwpid);
2289 /* Save a copy of the ttrace state of this thread, in our local
2292 This caches the state. The implementation of queries like
2293 hpux_has_execd can then use this cached state, rather than
2294 be forced to make an explicit ttrace call to get it.
2296 (Guard against the condition that this is the first time we've
2297 waited on, i.e., seen this thread, and so haven't yet entered
2298 it into our list of threads.)
2300 tinfo = find_thread_info (tsp->tts_lwpid);
2303 copy_ttstate_t (&tinfo->last_stop_state, tsp);
2304 tinfo->have_state = 1;
2308 } /* call_ttrace_wait */
2310 #if defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
2312 child_reported_exec_events_per_exec_call (void)
2314 return 1; /* ttrace reports the event once per call. */
2320 /* Our implementation of hardware watchpoints involves making memory
2321 pages write-protected. We must remember a page's original permissions,
2322 and we must also know when it is appropriate to restore a page's
2323 permissions to its original state.
2325 We use a "dictionary" of hardware-watched pages to do this. Each
2326 hardware-watched page is recorded in the dictionary. Each page's
2327 dictionary entry contains the original permissions and a reference
2328 count. Pages are hashed into the dictionary by their start address.
2330 When hardware watchpoint is set on page X for the first time, page X
2331 is added to the dictionary with a reference count of 1. If other
2332 hardware watchpoints are subsequently set on page X, its reference
2333 count is incremented. When hardware watchpoints are removed from
2334 page X, its reference count is decremented. If a page's reference
2335 count drops to 0, it's permissions are restored and the page's entry
2336 is thrown out of the dictionary.
2338 typedef struct memory_page
2340 CORE_ADDR page_start;
2341 int reference_count;
2342 int original_permissions;
2343 struct memory_page *next;
2344 struct memory_page *previous;
2348 #define MEMORY_PAGE_DICTIONARY_BUCKET_COUNT 128
2354 int page_protections_allowed;
2355 /* These are just the heads of chains of actual page descriptors. */
2356 memory_page_t buckets[MEMORY_PAGE_DICTIONARY_BUCKET_COUNT];
2358 memory_page_dictionary;
2362 require_memory_page_dictionary (void)
2366 /* Is the memory page dictionary ready for use? If so, we're done. */
2367 if (memory_page_dictionary.page_count >= (LONGEST) 0)
2370 /* Else, initialize it. */
2371 memory_page_dictionary.page_count = (LONGEST) 0;
2373 for (i = 0; i < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; i++)
2375 memory_page_dictionary.buckets[i].page_start = (CORE_ADDR) 0;
2376 memory_page_dictionary.buckets[i].reference_count = 0;
2377 memory_page_dictionary.buckets[i].next = NULL;
2378 memory_page_dictionary.buckets[i].previous = NULL;
2384 retire_memory_page_dictionary (void)
2386 memory_page_dictionary.page_count = (LONGEST) - 1;
2390 /* Write-protect the memory page that starts at this address.
2392 Returns the original permissions of the page.
2395 write_protect_page (int pid, CORE_ADDR page_start)
2398 int original_permissions;
2399 int new_permissions;
2401 tt_status = call_ttrace (TT_PROC_GET_MPROTECT,
2403 (TTRACE_ARG_TYPE) page_start,
2405 (TTRACE_ARG_TYPE) & original_permissions);
2406 if (errno || (tt_status < 0))
2408 return 0; /* What else can we do? */
2411 /* We'll also write-protect the page now, if that's allowed. */
2412 if (memory_page_dictionary.page_protections_allowed)
2414 new_permissions = original_permissions & ~PROT_WRITE;
2415 tt_status = call_ttrace (TT_PROC_SET_MPROTECT,
2417 (TTRACE_ARG_TYPE) page_start,
2418 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size,
2419 (TTRACE_ARG_TYPE) new_permissions);
2420 if (errno || (tt_status < 0))
2422 return 0; /* What else can we do? */
2426 return original_permissions;
2430 /* Unwrite-protect the memory page that starts at this address, restoring
2431 (what we must assume are) its original permissions.
2434 unwrite_protect_page (int pid, CORE_ADDR page_start, int original_permissions)
2438 tt_status = call_ttrace (TT_PROC_SET_MPROTECT,
2440 (TTRACE_ARG_TYPE) page_start,
2441 (TTRACE_ARG_TYPE) memory_page_dictionary.page_size,
2442 (TTRACE_ARG_TYPE) original_permissions);
2443 if (errno || (tt_status < 0))
2445 return; /* What else can we do? */
2450 /* Memory page-protections are used to implement "hardware" watchpoints
2453 For every memory page that is currently being watched (i.e., that
2454 presently should be write-protected), write-protect it.
2457 hppa_enable_page_protection_events (int pid)
2461 memory_page_dictionary.page_protections_allowed = 1;
2463 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++)
2465 memory_page_t *page;
2467 page = memory_page_dictionary.buckets[bucket].next;
2468 while (page != NULL)
2470 page->original_permissions = write_protect_page (pid, page->page_start);
2477 /* Memory page-protections are used to implement "hardware" watchpoints
2480 For every memory page that is currently being watched (i.e., that
2481 presently is or should be write-protected), un-write-protect it.
2484 hppa_disable_page_protection_events (int pid)
2488 for (bucket = 0; bucket < MEMORY_PAGE_DICTIONARY_BUCKET_COUNT; bucket++)
2490 memory_page_t *page;
2492 page = memory_page_dictionary.buckets[bucket].next;
2493 while (page != NULL)
2495 unwrite_protect_page (pid, page->page_start, page->original_permissions);
2500 memory_page_dictionary.page_protections_allowed = 0;
2503 /* Count the number of outstanding events. At this
2504 * point, we have selected one thread and its event
2505 * as the one to be "reported" upwards to core gdb.
2506 * That thread is already marked as "handled".
2508 * Note: we could just scan our own thread list. FIXME!
2511 count_unhandled_events (int real_pid, lwpid_t real_tid)
2517 /* Ok, find out how many threads have real events to report.
2520 ttid = get_process_first_stopped_thread_id (real_pid, &tstate);
2526 printf ("Process %d has no threads\n", real_pid);
2528 printf ("Process %d has these threads:\n", real_pid);
2534 if (tstate.tts_event != TTEVT_NONE
2535 && !was_handled (ttid))
2537 /* TTEVT_NONE implies we just stopped it ourselves
2538 * because we're the stop-the-world guys, so it's
2539 * not an event from our point of view.
2541 * If "was_handled" is true, this is an event we
2542 * already handled, so don't count it.
2544 * Note that we don't count the thread with the
2545 * currently-reported event, as it's already marked
2551 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG )
2554 if (ttid == real_tid)
2555 printf ("*"); /* Thread we're reporting */
2559 if (tstate.tts_event != TTEVT_NONE)
2560 printf ("+"); /* Thread with a real event */
2564 if (was_handled (ttid))
2565 printf ("h"); /* Thread has been handled */
2569 printf (" %d, with event %s", ttid,
2570 get_printable_name_of_ttrace_event (tstate.tts_event));
2572 if (tstate.tts_event == TTEVT_SIGNAL
2573 && 5 == tstate.tts_u.tts_signal.tts_signo)
2577 pc_val = get_raw_pc (ttid);
2580 printf (" breakpoint at 0x%x\n", pc_val);
2582 printf (" bpt, can't fetch pc.\n");
2589 ttid = get_process_next_stopped_thread_id (real_pid, &tstate);
2592 #if defined( THREAD_DEBUG ) || defined( WAIT_BUFFER_DEBUG )
2594 if (events_left > 0)
2595 printf ("There are thus %d pending events\n", events_left);
2601 /* This function is provided as a sop to clients that are calling
2602 * ptrace_wait to wait for a process to stop. (see the
2603 * implementation of child_wait.) Return value is the pid for
2604 * the event that ended the wait.
2606 * Note: used by core gdb and so uses the pseudo-pid (really tid).
2609 ptrace_wait (ptid_t ptid, int *status)
2618 /* The ptrace implementation of this also ignores pid.
2622 ttwait_return = call_ttrace_wait (0, TTRACE_WAITOK, &tsp, sizeof (tsp));
2623 if (ttwait_return < 0)
2625 /* ??rehrauer: It appears that if our inferior exits and we
2626 haven't asked for exit events, that we're not getting any
2627 indication save a negative return from ttrace_wait and an
2632 *status = 0; /* WIFEXITED */
2633 return PIDGET (inferior_ptid);
2636 warning ("Call of ttrace_wait returned with errno %d.",
2638 *status = ttwait_return;
2639 return PIDGET (inferior_ptid);
2642 real_pid = tsp.tts_pid;
2643 real_tid = tsp.tts_lwpid;
2645 /* One complication is that the "tts_event" structure has
2646 * a set of flags, and more than one can be set. So we
2647 * either have to force an order (as we do here), or handle
2648 * more than one flag at a time.
2650 if (tsp.tts_event & TTEVT_LWP_CREATE)
2653 /* Unlike what you might expect, this event is reported in
2654 * the _creating_ thread, and the _created_ thread (whose tid
2655 * we have) is still running. So we have to stop it. This
2656 * has already been done in "call_ttrace_wait", but should we
2657 * ever abandon the "stop-the-world" model, here's the command
2660 * call_ttrace( TT_LWP_STOP, real_tid, TT_NIL, TT_NIL, TT_NIL );
2662 * Note that this would depend on being called _after_ "add_tthread"
2663 * below for the tid-to-pid translation to be done in "call_ttrace".
2668 printf ("New thread: pid %d, tid %d, creator tid %d\n",
2669 real_pid, tsp.tts_u.tts_thread.tts_target_lwpid,
2673 /* Now we have to return the tid of the created thread, not
2674 * the creating thread, or "wait_for_inferior" won't know we
2675 * have a new "process" (thread). Plus we should record it
2678 real_tid = tsp.tts_u.tts_thread.tts_target_lwpid;
2680 add_tthread (real_pid, real_tid);
2683 else if ((tsp.tts_event & TTEVT_LWP_TERMINATE)
2684 || (tsp.tts_event & TTEVT_LWP_EXIT))
2689 printf ("Thread dies: %d\n", real_tid);
2692 del_tthread (real_tid);
2695 else if (tsp.tts_event & TTEVT_EXEC)
2700 printf ("Pid %d has zero'th thread %d; inferior pid is %d\n",
2701 real_pid, real_tid, PIDGET (inferior_ptid));
2704 add_tthread (real_pid, real_tid);
2710 printf ("Process-level event %s, using tid %d\n",
2711 get_printable_name_of_ttrace_event (tsp.tts_event),
2714 /* OK to do this, as "add_tthread" won't add
2715 * duplicate entries. Also OK not to do it,
2716 * as this event isn't one which can change the
2719 add_tthread (real_pid, real_tid);
2724 /* How many events are left to report later?
2725 * In a non-stop-the-world model, this isn't needed.
2727 * Note that it's not always safe to query the thread state of a process,
2728 * which is what count_unhandled_events does. (If unsafe, we're left with
2729 * no other resort than to assume that no more events remain...)
2731 if (can_touch_threads_of_process (real_pid, tsp.tts_event))
2732 more_events_left = count_unhandled_events (real_pid, real_tid);
2736 if (more_events_left > 0)
2737 warning ("Vfork or fork causing loss of %d buffered events.",
2740 more_events_left = 0;
2743 /* Attempt to translate the ttrace_wait-returned status into the
2746 ??rehrauer: This is somewhat fragile. We really ought to rewrite
2747 clients that expect to pick apart a ptrace wait status, to use
2748 something a little more abstract.
2750 if ((tsp.tts_event & TTEVT_EXEC)
2751 || (tsp.tts_event & TTEVT_FORK)
2752 || (tsp.tts_event & TTEVT_VFORK))
2754 /* Forks come in pairs (parent and child), so core gdb
2755 * will do two waits. Be ready to notice this.
2757 if (tsp.tts_event & TTEVT_FORK)
2759 process_state = FORKING;
2761 #ifdef WAIT_BUFFER_DEBUG
2763 printf ("Process set to FORKING\n");
2766 else if (tsp.tts_event & TTEVT_VFORK)
2768 process_state = VFORKING;
2770 #ifdef WAIT_BUFFER_DEBUG
2772 printf ("Process set to VFORKING\n");
2776 /* Make an exec or fork look like a breakpoint. Definitely a hack,
2777 but I don't think non HP-UX-specific clients really carefully
2778 inspect the first events they get after inferior startup, so
2779 it probably almost doesn't matter what we claim this is.
2784 printf ("..a process 'event'\n");
2787 /* Also make fork and exec events look like bpts, so they can be caught.
2789 *status = 0177 | (_SIGTRAP << 8);
2792 /* Special-cases: We ask for syscall entry and exit events to implement
2793 "fast" (aka "hardware") watchpoints.
2795 When we get a syscall entry, we want to disable page-protections,
2796 and resume the inferior; this isn't an event we wish for
2797 wait_for_inferior to see. Note that we must resume ONLY the
2798 thread that reported the syscall entry; we don't want to allow
2799 other threads to run with the page protections off, as they might
2800 then be able to write to watch memory without it being caught.
2802 When we get a syscall exit, we want to reenable page-protections,
2803 but we don't want to resume the inferior; this is an event we wish
2804 wait_for_inferior to see. Make it look like the signal we normally
2805 get for a single-step completion. This should cause wait_for_inferior
2806 to evaluate whether any watchpoint triggered.
2808 Or rather, that's what we'd LIKE to do for syscall exit; we can't,
2809 due to some HP-UX "features". Some syscalls have problems with
2810 write-protections on some pages, and some syscalls seem to have
2811 pending writes to those pages at the time we're getting the return
2812 event. So, we'll single-step the inferior to get out of the syscall,
2813 and then reenable protections.
2815 Note that we're intentionally allowing the syscall exit case to
2816 fall through into the succeeding cases, as sometimes we single-
2817 step out of one syscall only to immediately enter another...
2819 else if ((tsp.tts_event & TTEVT_SYSCALL_ENTRY)
2820 || (tsp.tts_event & TTEVT_SYSCALL_RETURN))
2822 /* Make a syscall event look like a breakpoint. Same comments
2823 as for exec & fork events.
2827 printf ("..a syscall 'event'\n");
2830 /* Also make syscall events look like bpts, so they can be caught.
2832 *status = 0177 | (_SIGTRAP << 8);
2835 else if ((tsp.tts_event & TTEVT_LWP_CREATE)
2836 || (tsp.tts_event & TTEVT_LWP_TERMINATE)
2837 || (tsp.tts_event & TTEVT_LWP_EXIT))
2839 /* Make a thread event look like a breakpoint. Same comments
2840 * as for exec & fork events.
2844 printf ("..a thread 'event'\n");
2847 /* Also make thread events look like bpts, so they can be caught.
2849 *status = 0177 | (_SIGTRAP << 8);
2852 else if ((tsp.tts_event & TTEVT_EXIT))
2857 printf ("..an exit\n");
2860 /* Prevent rest of gdb from thinking this is
2861 * a new thread if for some reason it's never
2862 * seen the main thread before.
2864 inferior_ptid = pid_to_ptid (map_to_gdb_tid (real_tid)); /* HACK, FIX */
2866 *status = 0 | (tsp.tts_u.tts_exit.tts_exitcode);
2869 else if (tsp.tts_event & TTEVT_SIGNAL)
2873 printf ("..a signal, %d\n", tsp.tts_u.tts_signal.tts_signo);
2876 *status = 0177 | (tsp.tts_u.tts_signal.tts_signo << 8);
2882 /* This means the process or thread terminated. But we should've
2883 caught an explicit exit/termination above. So warn (this is
2884 really an internal error) and claim the process or thread
2885 terminated with a SIGTRAP.
2888 warning ("process_wait: unknown process state");
2892 printf ("Process-level event %s, using tid %d\n",
2893 get_printable_name_of_ttrace_event (tsp.tts_event),
2900 target_post_wait (pid_to_ptid (tsp.tts_pid), *status);
2905 printf ("Done waiting, pid is %d, tid %d\n", real_pid, real_tid);
2908 /* All code external to this module uses the tid, but calls
2909 * it "pid". There's some tweaking so that the outside sees
2910 * the first thread as having the same number as the starting
2913 return_pid = map_to_gdb_tid (real_tid);
2915 /* Remember this for later use in "hppa_prepare_to_proceed".
2917 old_gdb_pid = PIDGET (inferior_ptid);
2918 reported_pid = return_pid;
2919 reported_bpt = ((tsp.tts_event & TTEVT_SIGNAL) && (5 == tsp.tts_u.tts_signal.tts_signo));
2921 if (real_tid == 0 || return_pid == 0)
2923 warning ("Internal error: process-wait failed.");
2930 /* This function causes the caller's process to be traced by its
2931 parent. This is intended to be called after GDB forks itself,
2932 and before the child execs the target. Despite the name, it
2933 is called by the child.
2935 Note that HP-UX ttrace is rather funky in how this is done.
2936 If the parent wants to get the initial exec event of a child,
2937 it must set the ttrace event mask of the child to include execs.
2938 (The child cannot do this itself.) This must be done after the
2939 child is forked, but before it execs.
2941 To coordinate the parent and child, we implement a semaphore using
2942 pipes. After SETTRC'ing itself, the child tells the parent that
2943 it is now traceable by the parent, and waits for the parent's
2944 acknowledgement. The parent can then set the child's event mask,
2945 and notify the child that it can now exec.
2947 (The acknowledgement by parent happens as a result of a call to
2948 child_acknowledge_created_inferior.)
2951 parent_attach_all (int p1, PTRACE_ARG3_TYPE p2, int p3)
2955 /* We need a memory home for a constant, to pass it to ttrace.
2956 The value of the constant is arbitrary, so long as both
2957 parent and child use the same value. Might as well use the
2958 "magic" constant provided by ttrace...
2960 uint64_t tc_magic_child = TT_VERSION;
2961 uint64_t tc_magic_parent = 0;
2963 tt_status = call_real_ttrace (
2968 (TTRACE_ARG_TYPE) TT_VERSION,
2974 /* Notify the parent that we're potentially ready to exec(). */
2975 write (startup_semaphore.child_channel[SEM_TALK],
2977 sizeof (tc_magic_child));
2979 /* Wait for acknowledgement from the parent. */
2980 read (startup_semaphore.parent_channel[SEM_LISTEN],
2982 sizeof (tc_magic_parent));
2984 if (tc_magic_child != tc_magic_parent)
2985 warning ("mismatched semaphore magic");
2987 /* Discard our copy of the semaphore. */
2988 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
2989 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
2990 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
2991 (void) close (startup_semaphore.child_channel[SEM_TALK]);
2996 /* Despite being file-local, this routine is dealing with
2997 * actual process IDs, not thread ids. That's because it's
2998 * called before the first "wait" call, and there's no map
2999 * yet from tids to pids.
3001 * When it is called, a forked child is running, but waiting on
3002 * the semaphore. If you stop the child and re-start it,
3003 * things get confused, so don't do that! An attached child is
3006 * Since this is called after either attach or run, we
3007 * have to be the common part of both.
3010 require_notification_of_events (int real_pid)
3013 ttevent_t notifiable_events;
3016 ttstate_t thread_state;
3020 printf ("Require notif, pid is %d\n", real_pid);
3023 /* Temporary HACK: tell inftarg.c/child_wait to not
3024 * loop until pids are the same.
3026 not_same_real_pid = 0;
3028 sigemptyset (¬ifiable_events.tte_signals);
3029 notifiable_events.tte_opts = TTEO_NONE;
3031 /* This ensures that forked children inherit their parent's
3032 * event mask, which we're setting here.
3034 * NOTE: if you debug gdb with itself, then the ultimate
3035 * debuggee gets flags set by the outermost gdb, as
3036 * a child of a child will still inherit.
3038 notifiable_events.tte_opts |= TTEO_PROC_INHERIT;
3040 notifiable_events.tte_events = TTEVT_DEFAULT;
3041 notifiable_events.tte_events |= TTEVT_SIGNAL;
3042 notifiable_events.tte_events |= TTEVT_EXEC;
3043 notifiable_events.tte_events |= TTEVT_EXIT;
3044 notifiable_events.tte_events |= TTEVT_FORK;
3045 notifiable_events.tte_events |= TTEVT_VFORK;
3046 notifiable_events.tte_events |= TTEVT_LWP_CREATE;
3047 notifiable_events.tte_events |= TTEVT_LWP_EXIT;
3048 notifiable_events.tte_events |= TTEVT_LWP_TERMINATE;
3050 tt_status = call_real_ttrace (
3051 TT_PROC_SET_EVENT_MASK,
3054 (TTRACE_ARG_TYPE) & notifiable_events,
3055 (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3060 require_notification_of_exec_events (int real_pid)
3063 ttevent_t notifiable_events;
3066 ttstate_t thread_state;
3070 printf ("Require notif, pid is %d\n", real_pid);
3073 /* Temporary HACK: tell inftarg.c/child_wait to not
3074 * loop until pids are the same.
3076 not_same_real_pid = 0;
3078 sigemptyset (¬ifiable_events.tte_signals);
3079 notifiable_events.tte_opts = TTEO_NOSTRCCHLD;
3081 /* This ensures that forked children don't inherit their parent's
3082 * event mask, which we're setting here.
3084 notifiable_events.tte_opts &= ~TTEO_PROC_INHERIT;
3086 notifiable_events.tte_events = TTEVT_DEFAULT;
3087 notifiable_events.tte_events |= TTEVT_EXEC;
3088 notifiable_events.tte_events |= TTEVT_EXIT;
3090 tt_status = call_real_ttrace (
3091 TT_PROC_SET_EVENT_MASK,
3094 (TTRACE_ARG_TYPE) & notifiable_events,
3095 (TTRACE_ARG_TYPE) sizeof (notifiable_events),
3100 /* This function is called by the parent process, with pid being the
3101 * ID of the child process, after the debugger has forked.
3104 child_acknowledge_created_inferior (int pid)
3106 /* We need a memory home for a constant, to pass it to ttrace.
3107 The value of the constant is arbitrary, so long as both
3108 parent and child use the same value. Might as well use the
3109 "magic" constant provided by ttrace...
3111 uint64_t tc_magic_parent = TT_VERSION;
3112 uint64_t tc_magic_child = 0;
3114 /* Wait for the child to tell us that it has forked. */
3115 read (startup_semaphore.child_channel[SEM_LISTEN],
3117 sizeof (tc_magic_child));
3119 /* Clear thread info now. We'd like to do this in
3120 * "require...", but that messes up attach.
3122 clear_thread_info ();
3124 /* Tell the "rest of gdb" that the initial thread exists.
3125 * This isn't really a hack. Other thread-based versions
3126 * of gdb (e.g. gnu-nat.c) seem to do the same thing.
3128 * Q: Why don't we also add this thread to the local
3129 * list via "add_tthread"?
3131 * A: Because we don't know the tid, and can't stop the
3132 * the process safely to ask what it is. Anyway, we'll
3133 * add it when it gets the EXEC event.
3135 add_thread (pid_to_ptid (pid)); /* in thread.c */
3137 /* We can now set the child's ttrace event mask.
3139 require_notification_of_exec_events (pid);
3141 /* Tell ourselves that the process is running.
3143 process_state = RUNNING;
3145 /* Notify the child that it can exec. */
3146 write (startup_semaphore.parent_channel[SEM_TALK],
3148 sizeof (tc_magic_parent));
3150 /* Discard our copy of the semaphore. */
3151 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
3152 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
3153 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
3154 (void) close (startup_semaphore.child_channel[SEM_TALK]);
3159 * arrange for notification of all events by
3160 * calling require_notification_of_events.
3163 child_post_startup_inferior (ptid_t ptid)
3165 require_notification_of_events (PIDGET (ptid));
3168 /* From here on, we should expect tids rather than pids.
3171 hppa_enable_catch_fork (int tid)
3174 ttevent_t ttrace_events;
3176 /* Get the set of events that are currently enabled.
3178 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3180 (TTRACE_ARG_TYPE) & ttrace_events,
3181 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3184 perror_with_name ("ttrace");
3186 /* Add forks to that set. */
3187 ttrace_events.tte_events |= TTEVT_FORK;
3191 printf ("enable fork, tid is %d\n", tid);
3194 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3196 (TTRACE_ARG_TYPE) & ttrace_events,
3197 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3200 perror_with_name ("ttrace");
3205 hppa_disable_catch_fork (int tid)
3208 ttevent_t ttrace_events;
3210 /* Get the set of events that are currently enabled.
3212 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3214 (TTRACE_ARG_TYPE) & ttrace_events,
3215 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3219 perror_with_name ("ttrace");
3221 /* Remove forks from that set. */
3222 ttrace_events.tte_events &= ~TTEVT_FORK;
3226 printf ("disable fork, tid is %d\n", tid);
3229 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3231 (TTRACE_ARG_TYPE) & ttrace_events,
3232 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3236 perror_with_name ("ttrace");
3240 #if defined(CHILD_INSERT_FORK_CATCHPOINT)
3242 child_insert_fork_catchpoint (int tid)
3244 /* Enable reporting of fork events from the kernel. */
3245 /* ??rehrauer: For the moment, we're always enabling these events,
3246 and just ignoring them if there's no catchpoint to catch them.
3253 #if defined(CHILD_REMOVE_FORK_CATCHPOINT)
3255 child_remove_fork_catchpoint (int tid)
3257 /* Disable reporting of fork events from the kernel. */
3258 /* ??rehrauer: For the moment, we're always enabling these events,
3259 and just ignoring them if there's no catchpoint to catch them.
3267 hppa_enable_catch_vfork (int tid)
3270 ttevent_t ttrace_events;
3272 /* Get the set of events that are currently enabled.
3274 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3276 (TTRACE_ARG_TYPE) & ttrace_events,
3277 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3281 perror_with_name ("ttrace");
3283 /* Add vforks to that set. */
3284 ttrace_events.tte_events |= TTEVT_VFORK;
3288 printf ("enable vfork, tid is %d\n", tid);
3291 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3293 (TTRACE_ARG_TYPE) & ttrace_events,
3294 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3298 perror_with_name ("ttrace");
3303 hppa_disable_catch_vfork (int tid)
3306 ttevent_t ttrace_events;
3308 /* Get the set of events that are currently enabled. */
3309 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
3311 (TTRACE_ARG_TYPE) & ttrace_events,
3312 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3316 perror_with_name ("ttrace");
3318 /* Remove vforks from that set. */
3319 ttrace_events.tte_events &= ~TTEVT_VFORK;
3323 printf ("disable vfork, tid is %d\n", tid);
3325 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
3327 (TTRACE_ARG_TYPE) & ttrace_events,
3328 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
3332 perror_with_name ("ttrace");
3336 #if defined(CHILD_INSERT_VFORK_CATCHPOINT)
3338 child_insert_vfork_catchpoint (int tid)
3340 /* Enable reporting of vfork events from the kernel. */
3341 /* ??rehrauer: For the moment, we're always enabling these events,
3342 and just ignoring them if there's no catchpoint to catch them.
3349 #if defined(CHILD_REMOVE_VFORK_CATCHPOINT)
3351 child_remove_vfork_catchpoint (int tid)
3353 /* Disable reporting of vfork events from the kernel. */
3354 /* ??rehrauer: For the moment, we're always enabling these events,
3355 and just ignoring them if there's no catchpoint to catch them.
3361 /* Q: Do we need to map the returned process ID to a thread ID?
3363 * A: I don't think so--here we want a _real_ pid. Any later
3364 * operations will call "require_notification_of_events" and
3365 * start the mapping.
3368 hpux_has_forked (int tid, int *childpid)
3371 ttstate_t ttrace_state;
3374 /* Do we have cached thread state that we can consult? If so, use it. */
3375 tinfo = find_thread_info (map_from_gdb_tid (tid));
3378 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3381 /* Nope, must read the thread's current state */
3384 tt_status = call_ttrace (TT_LWP_GET_STATE,
3386 (TTRACE_ARG_TYPE) & ttrace_state,
3387 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3391 perror_with_name ("ttrace");
3397 if (ttrace_state.tts_event & TTEVT_FORK)
3399 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3406 /* See hpux_has_forked for pid discussion.
3409 hpux_has_vforked (int tid, int *childpid)
3412 ttstate_t ttrace_state;
3415 /* Do we have cached thread state that we can consult? If so, use it. */
3416 tinfo = find_thread_info (map_from_gdb_tid (tid));
3418 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3420 /* Nope, must read the thread's current state */
3423 tt_status = call_ttrace (TT_LWP_GET_STATE,
3425 (TTRACE_ARG_TYPE) & ttrace_state,
3426 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3430 perror_with_name ("ttrace");
3436 if (ttrace_state.tts_event & TTEVT_VFORK)
3438 *childpid = ttrace_state.tts_u.tts_fork.tts_fpid;
3446 #if defined(CHILD_INSERT_EXEC_CATCHPOINT)
3448 child_insert_exec_catchpoint (int tid)
3450 /* Enable reporting of exec events from the kernel. */
3451 /* ??rehrauer: For the moment, we're always enabling these events,
3452 and just ignoring them if there's no catchpoint to catch them.
3459 #if defined(CHILD_REMOVE_EXEC_CATCHPOINT)
3461 child_remove_exec_catchpoint (int tid)
3463 /* Disable reporting of execevents from the kernel. */
3464 /* ??rehrauer: For the moment, we're always enabling these events,
3465 and just ignoring them if there's no catchpoint to catch them.
3473 hpux_has_execd (int tid, char **execd_pathname)
3476 ttstate_t ttrace_state;
3479 /* Do we have cached thread state that we can consult? If so, use it. */
3480 tinfo = find_thread_info (map_from_gdb_tid (tid));
3482 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3484 /* Nope, must read the thread's current state */
3487 tt_status = call_ttrace (TT_LWP_GET_STATE,
3489 (TTRACE_ARG_TYPE) & ttrace_state,
3490 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3494 perror_with_name ("ttrace");
3500 if (ttrace_state.tts_event & TTEVT_EXEC)
3502 /* See child_pid_to_exec_file in this file: this is a macro.
3504 char *exec_file = target_pid_to_exec_file (tid);
3506 *execd_pathname = savestring (exec_file, strlen (exec_file));
3515 hpux_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id)
3518 ttstate_t ttrace_state;
3521 /* Do we have cached thread state that we can consult? If so, use it. */
3522 tinfo = find_thread_info (map_from_gdb_tid (pid));
3524 copy_ttstate_t (&ttrace_state, &tinfo->last_stop_state);
3526 /* Nope, must read the thread's current state */
3529 tt_status = call_ttrace (TT_LWP_GET_STATE,
3531 (TTRACE_ARG_TYPE) & ttrace_state,
3532 (TTRACE_ARG_TYPE) sizeof (ttrace_state),
3536 perror_with_name ("ttrace");
3542 *kind = TARGET_WAITKIND_SPURIOUS; /* Until proven otherwise... */
3545 if (ttrace_state.tts_event & TTEVT_SYSCALL_ENTRY)
3546 *kind = TARGET_WAITKIND_SYSCALL_ENTRY;
3547 else if (ttrace_state.tts_event & TTEVT_SYSCALL_RETURN)
3548 *kind = TARGET_WAITKIND_SYSCALL_RETURN;
3552 *syscall_id = ttrace_state.tts_scno;
3558 #if defined(CHILD_THREAD_ALIVE)
3560 /* Check to see if the given thread is alive.
3562 * We'll trust the thread list, as the more correct
3563 * approach of stopping the process and spinning down
3564 * the OS's thread list is _very_ expensive.
3566 * May need a FIXME for that reason.
3569 child_thread_alive (ptid_t ptid)
3571 lwpid_t gdb_tid = PIDGET (ptid);
3574 /* This spins down the lists twice.
3575 * Possible peformance improvement here!
3577 tid = map_from_gdb_tid (gdb_tid);
3578 return !is_terminated (tid);
3585 /* This function attempts to read the specified number of bytes from the
3586 save_state_t that is our view into the hardware registers, starting at
3587 ss_offset, and ending at ss_offset + sizeof_buf - 1
3589 If this function succeeds, it deposits the fetched bytes into buf,
3592 If it fails, it returns a negative result. The contents of buf are
3593 undefined it this function fails.
3596 read_from_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3600 register_value_t register_value = 0;
3602 tt_status = call_ttrace (TT_LWP_RUREGS,
3605 (TTRACE_ARG_TYPE) sizeof_buf,
3606 (TTRACE_ARG_TYPE) buf);
3609 /* Map ttrace's version of success to our version.
3610 * Sometime ttrace returns 0, but that's ok here.
3618 /* This function attempts to write the specified number of bytes to the
3619 save_state_t that is our view into the hardware registers, starting at
3620 ss_offset, and ending at ss_offset + sizeof_buf - 1
3622 If this function succeeds, it deposits the bytes in buf, and returns 0.
3624 If it fails, it returns a negative result. The contents of the save_state_t
3625 are undefined it this function fails.
3628 write_to_register_save_state (int tid, TTRACE_ARG_TYPE ss_offset, char *buf,
3632 register_value_t register_value = 0;
3634 tt_status = call_ttrace (TT_LWP_WUREGS,
3637 (TTRACE_ARG_TYPE) sizeof_buf,
3638 (TTRACE_ARG_TYPE) buf);
3643 /* This function is a sop to the largeish number of direct calls
3644 to call_ptrace that exist in other files. Rather than create
3645 functions whose name abstracts away from ptrace, and change all
3646 the present callers of call_ptrace, we'll do the expedient (and
3647 perhaps only practical) thing.
3649 Note HP-UX explicitly disallows a mix of ptrace & ttrace on a traced
3650 process. Thus, we must translate all ptrace requests into their
3651 process-specific, ttrace equivalents.
3654 call_ptrace (int pt_request, int gdb_tid, PTRACE_ARG3_TYPE addr, int data)
3657 TTRACE_ARG_TYPE tt_addr = (TTRACE_ARG_TYPE) addr;
3658 TTRACE_ARG_TYPE tt_data = (TTRACE_ARG_TYPE) data;
3659 TTRACE_ARG_TYPE tt_addr2 = TT_NIL;
3661 register_value_t register_value;
3664 /* Perform the necessary argument translation. Note that some
3665 cases are funky enough in the ttrace realm that we handle them
3670 /* The following cases cannot conveniently be handled conveniently
3671 by merely adjusting the ptrace arguments and feeding into the
3672 generic call to ttrace at the bottom of this function.
3674 Note that because all branches of this switch end in "return",
3675 there's no need for any "break" statements.
3678 return parent_attach_all (0, 0, 0);
3681 tt_status = read_from_register_save_state (gdb_tid,
3684 sizeof (register_value));
3687 return register_value;
3690 register_value = (int) tt_data;
3691 tt_status = write_to_register_save_state (gdb_tid,
3694 sizeof (register_value));
3699 tt_status = call_ttrace (TT_PROC_RDTEXT, /* Implicit 4-byte xfer becomes block-xfer. */
3702 (TTRACE_ARG_TYPE) 4,
3703 (TTRACE_ARG_TYPE) & read_buf);
3709 tt_status = call_ttrace (TT_PROC_RDDATA, /* Implicit 4-byte xfer becomes block-xfer. */
3712 (TTRACE_ARG_TYPE) 4,
3713 (TTRACE_ARG_TYPE) & read_buf);
3719 tt_status = call_real_ttrace (TT_PROC_ATTACH,
3720 map_from_gdb_tid (gdb_tid),
3723 (TTRACE_ARG_TYPE) TT_VERSION,
3729 /* The following cases are handled by merely adjusting the ptrace
3730 arguments and feeding into the generic call to ttrace.
3733 tt_request = TT_PROC_DETACH;
3737 tt_request = TT_PROC_WRTEXT; /* Translates 4-byte xfer to block-xfer. */
3738 tt_data = 4; /* This many bytes. */
3739 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */
3743 tt_request = TT_PROC_WRDATA; /* Translates 4-byte xfer to block-xfer. */
3744 tt_data = 4; /* This many bytes. */
3745 tt_addr2 = (TTRACE_ARG_TYPE) & data; /* Address of xfer source. */
3749 tt_request = TT_PROC_RDTEXT;
3753 tt_request = TT_PROC_RDDATA;
3757 tt_request = TT_PROC_WRTEXT;
3761 tt_request = TT_PROC_WRDATA;
3765 tt_request = TT_PROC_CONTINUE;
3769 tt_request = TT_LWP_SINGLE; /* Should not be making this request? */
3773 tt_request = TT_PROC_EXIT;
3776 case PT_GET_PROCESS_PATHNAME:
3777 tt_request = TT_PROC_GET_PATHNAME;
3781 tt_request = pt_request; /* Let ttrace be the one to complain. */
3785 return call_ttrace (tt_request,
3792 /* Kill that pesky process!
3795 kill_inferior (void)
3800 thread_info **paranoia;
3803 if (PIDGET (inferior_ptid) == 0)
3806 /* Walk the list of "threads", some of which are "pseudo threads",
3807 aka "processes". For each that is NOT inferior_ptid, stop it,
3810 You see, we may not have just a single process to kill. If we're
3811 restarting or quitting or detaching just after the inferior has
3812 forked, then we've actually two processes to clean up.
3814 But we can't just call target_mourn_inferior() for each, since that
3815 zaps the target vector.
3818 paranoia = (thread_info **) xmalloc (thread_head.count *
3819 sizeof (thread_info *));
3822 t = thread_head.head;
3826 paranoia[para_count] = t;
3827 for (i = 0; i < para_count; i++)
3829 if (t->next == paranoia[i])
3831 warning ("Bad data in gdb's thread data; repairing.");
3837 if (t->am_pseudo && (t->pid != PIDGET (inferior_ptid)))
3839 call_ttrace (TT_PROC_EXIT,
3850 call_ttrace (TT_PROC_EXIT,
3851 PIDGET (inferior_ptid),
3855 target_mourn_inferior ();
3856 clear_thread_info ();
3860 #ifndef CHILD_RESUME
3862 /* Sanity check a thread about to be continued.
3865 thread_dropping_event_check (thread_info *p)
3870 * This seems to happen when we "next" over a
3871 * "fork()" while following the parent. If it's
3872 * the FORK event, that's ok. If it's a SIGNAL
3873 * in the unfollowed child, that's ok to--but
3874 * how can we know that's what's going on?
3880 if (p->last_stop_state.tts_event == TTEVT_FORK)
3885 else if (p->last_stop_state.tts_event == TTEVT_SIGNAL)
3887 /* Ok, close eyes and let it happen.
3893 /* This shouldn't happen--we're dropping a
3896 warning ("About to continue process %d, thread %d with unhandled event %s.",
3898 get_printable_name_of_ttrace_event (
3899 p->last_stop_state.tts_event));
3909 /* No saved state, have to assume it failed.
3911 warning ("About to continue process %d, thread %d with unhandled event.",
3920 } /* thread_dropping_event_check */
3922 /* Use a loop over the threads to continue all the threads but
3923 * the one specified, which is to be stepped.
3926 threads_continue_all_but_one (lwpid_t gdb_tid, int signal)
3937 printf ("Using loop over threads to step/resume with signals\n");
3940 /* First update the thread list.
3943 real_tid = map_from_gdb_tid (gdb_tid);
3944 real_pid = get_pid_for (real_tid);
3946 scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
3947 while (0 != scan_tid)
3951 /* FIX: later should check state is stopped;
3952 * state.tts_flags & TTS_STATEMASK == TTS_WASSUSPENDED
3955 if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
3956 printf ("About to continue non-stopped thread %d\n", scan_tid);
3959 p = find_thread_info (scan_tid);
3962 add_tthread (real_pid, scan_tid);
3963 p = find_thread_info (scan_tid);
3965 /* This is either a newly-created thread or the
3966 * result of a fork; in either case there's no
3967 * actual event to worry about.
3971 if (state.tts_event != TTEVT_NONE)
3973 /* Oops, do need to worry!
3975 warning ("Unexpected thread with \"%s\" event.",
3976 get_printable_name_of_ttrace_event (state.tts_event));
3979 else if (scan_tid != p->tid)
3980 error ("Bad data in thread database.");
3985 printf ("Why are we continuing a dead thread?\n");
3990 scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
3993 /* Remove unseen threads.
3995 update_thread_list ();
3997 /* Now run down the thread list and continue or step.
3999 for (p = thread_head.head; p; p = p->next)
4004 thread_dropping_event_check (p);
4006 /* Pass the correct signals along.
4010 thread_signal = p->signal_value;
4016 if (p->tid != real_tid)
4019 * Not the thread of interest, so continue it
4020 * as the user expects.
4022 if (p->stepping_mode == DO_STEP)
4024 /* Just step this thread.
4030 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4035 /* Regular continue (default case).
4041 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4047 /* Step the thread of interest.
4053 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4056 } /* Loop over threads */
4057 } /* End threads_continue_all_but_one */
4059 /* Use a loop over the threads to continue all the threads.
4060 * This is done when a signal must be sent to any of the threads.
4063 threads_continue_all_with_signals (lwpid_t gdb_tid, int signal)
4074 printf ("Using loop over threads to resume with signals\n");
4077 /* Scan and update thread list.
4080 real_tid = map_from_gdb_tid (gdb_tid);
4081 real_pid = get_pid_for (real_tid);
4083 scan_tid = get_process_first_stopped_thread_id (real_pid, &state);
4084 while (0 != scan_tid)
4089 if ((state.tts_flags & TTS_STATEMASK) != TTS_WASSUSPENDED)
4090 warning ("About to continue non-stopped thread %d\n", scan_tid);
4093 p = find_thread_info (scan_tid);
4096 add_tthread (real_pid, scan_tid);
4097 p = find_thread_info (scan_tid);
4099 /* This is either a newly-created thread or the
4100 * result of a fork; in either case there's no
4101 * actual event to worry about.
4105 if (state.tts_event != TTEVT_NONE)
4107 /* Oops, do need to worry!
4109 warning ("Unexpected thread with \"%s\" event.",
4110 get_printable_name_of_ttrace_event (state.tts_event));
4117 printf ("Why are we continuing a dead thread? (1)\n");
4122 scan_tid = get_process_next_stopped_thread_id (real_pid, &state);
4125 /* Remove unseen threads from our list.
4127 update_thread_list ();
4129 /* Continue the threads.
4131 for (p = thread_head.head; p; p = p->next)
4136 thread_dropping_event_check (p);
4138 /* Pass the correct signals along.
4140 if (p->tid == real_tid)
4142 thread_signal = signal;
4145 else if (p->have_signal)
4147 thread_signal = p->signal_value;
4153 if (p->stepping_mode == DO_STEP)
4159 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4164 /* Continue this thread (default case).
4170 (TTRACE_ARG_TYPE) target_signal_to_host (thread_signal),
4174 } /* End threads_continue_all_with_signals */
4176 /* Step one thread only.
4179 thread_fake_step (lwpid_t tid, enum target_signal signal)
4186 printf ("Doing a fake-step over a bpt, etc. for %d\n", tid);
4188 if (is_terminated (tid))
4189 printf ("Why are we continuing a dead thread? (4)\n");
4193 if (doing_fake_step)
4194 warning ("Step while step already in progress.");
4196 /* See if there's a saved signal value for this
4197 * thread to be passed on, but no current signal.
4199 p = find_thread_info (tid);
4202 if (p->have_signal && signal == TARGET_SIGNAL_0)
4204 /* Pass on a saved signal.
4206 signal = p->signal_value;
4213 warning ("Internal error: continuing unhandled thread.");
4215 call_ttrace (TT_LWP_SINGLE,
4218 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4221 /* Do bookkeeping so "call_ttrace_wait" knows it has to wait
4222 * for this thread only, and clear any saved signal info.
4224 doing_fake_step = 1;
4225 fake_step_tid = tid;
4227 } /* End thread_fake_step */
4229 /* Continue one thread when a signal must be sent to it.
4232 threads_continue_one_with_signal (lwpid_t gdb_tid, int signal)
4240 printf ("Continuing one thread with a signal\n");
4243 real_tid = map_from_gdb_tid (gdb_tid);
4244 real_pid = get_pid_for (real_tid);
4246 p = find_thread_info (real_tid);
4249 add_tthread (real_pid, real_tid);
4255 printf ("Why are we continuing a dead thread? (2)\n");
4259 warning ("Internal error: continuing unhandled thread.");
4263 call_ttrace (TT_LWP_CONTINUE,
4266 (TTRACE_ARG_TYPE) target_signal_to_host (signal),
4271 #ifndef CHILD_RESUME
4273 /* Resume execution of the inferior process.
4275 * This routine is in charge of setting the "handled" bits.
4277 * If STEP is zero, continue it.
4278 * If STEP is nonzero, single-step it.
4280 * If SIGNAL is nonzero, give it that signal.
4282 * If TID is -1, apply to all threads.
4283 * If TID is not -1, apply to specified thread.
4287 * TID \________________________________________________
4289 * -1 | Step current Continue all threads
4290 * | thread and (but which gets any
4291 * | continue others signal?--We look at
4292 * | "inferior_ptid")
4294 * N | Step _this_ thread Continue _this_ thread
4295 * | and leave others and leave others
4296 * | stopped; internally stopped; used only for
4297 * | used by gdb, never hardware watchpoints
4298 * | a user command. and attach, never a
4302 child_resume (ptid_t ptid, int step, enum target_signal signal)
4304 int resume_all_threads;
4306 process_state_t new_process_state;
4307 lwpid_t gdb_tid = PIDGET (ptid);
4309 resume_all_threads =
4310 (gdb_tid == INFTTRACE_ALL_THREADS) ||
4313 if (resume_all_threads)
4315 /* Resume all threads, but first pick a tid value
4316 * so we can get the pid when in call_ttrace doing
4319 if (vfork_in_flight)
4320 tid = vforking_child_pid;
4322 tid = map_from_gdb_tid (PIDGET (inferior_ptid));
4325 tid = map_from_gdb_tid (gdb_tid);
4330 if (more_events_left)
4331 printf ("More events; ");
4334 printf ("Sending signal %d; ", signal);
4336 if (resume_all_threads)
4339 printf ("Continue process %d\n", tid);
4341 printf ("Step/continue thread %d\n", tid);
4346 printf ("Continue thread %d\n", tid);
4348 printf ("Step just thread %d\n", tid);
4351 if (vfork_in_flight)
4352 printf ("Vfork in flight\n");
4356 if (process_state == RUNNING)
4357 warning ("Internal error in resume logic; doing resume or step anyway.");
4359 if (!step /* Asked to continue... */
4360 && resume_all_threads /* whole process.. */
4361 && signal != 0 /* with a signal... */
4362 && more_events_left > 0)
4363 { /* but we can't yet--save it! */
4365 /* Continue with signal means we have to set the pending
4366 * signal value for this thread.
4372 printf ("Saving signal %d for thread %d\n", signal, tid);
4375 k = find_thread_info (tid);
4379 k->signal_value = signal;
4384 printf ("Why are we continuing a dead thread? (3)\n");
4392 printf ("No thread info for tid %d\n", tid);
4397 /* Are we faking this "continue" or "step"?
4399 * We used to do steps by continuing all the threads for
4400 * which the events had been handled already. While
4401 * conceptually nicer (hides it all in a lower level), this
4402 * can lead to starvation and a hang (e.g. all but one thread
4403 * are unhandled at a breakpoint just before a "join" operation,
4404 * and one thread is in the join, and the user wants to step that
4407 if (resume_all_threads /* Whole process, therefore user command */
4408 && more_events_left > 0)
4409 { /* But we can't do this yet--fake it! */
4414 /* No need to do any notes on a per-thread
4415 * basis--we're done!
4417 #ifdef WAIT_BUFFER_DEBUG
4419 printf ("Faking a process resume.\n");
4427 #ifdef WAIT_BUFFER_DEBUG
4429 printf ("Faking a process step.\n");
4434 p = find_thread_info (tid);
4437 warning ("No thread information for tid %d, 'next' command ignored.\n", tid);
4446 printf ("Why are we continuing a dead thread? (3.5)\n");
4449 if (p->stepping_mode != DO_DEFAULT)
4451 warning ("Step or continue command applied to thread which is already stepping or continuing; command ignored.");
4457 p->stepping_mode = DO_STEP;
4459 p->stepping_mode = DO_CONTINUE;
4462 } /* Have thread info */
4463 } /* Must fake step or go */
4465 /* Execept for fake-steps, from here on we know we are
4466 * going to wind up with a running process which will
4469 new_process_state = RUNNING;
4471 /* An address of TT_USE_CURRENT_PC tells ttrace to continue from where
4472 * it was. (If GDB wanted it to start some other way, we have already
4473 * written a new PC value to the child.)
4475 * If this system does not support PT_STEP, a higher level function will
4476 * have called single_step() to transmute the step request into a
4477 * continue request (by setting breakpoints on all possible successor
4478 * instructions), so we don't have to worry about that here.
4482 if (resume_all_threads)
4485 * Regular user step: other threads get a "continue".
4487 threads_continue_all_but_one (tid, signal);
4488 clear_all_handled ();
4489 clear_all_stepping_mode ();
4494 /* "Fake step": gdb is stepping one thread over a
4495 * breakpoint, watchpoint, or out of a library load
4496 * event, etc. The rest just stay where they are.
4498 * Also used when there are pending events: we really
4499 * step the current thread, but leave the rest stopped.
4500 * Users can't request this, but "wait_for_inferior"
4503 thread_fake_step (tid, signal);
4505 /* Clear the "handled" state of this thread, because
4506 * we'll soon get a new event for it. Other events
4507 * stay as they were.
4509 clear_handled (tid);
4510 clear_stepping_mode (tid);
4511 new_process_state = FAKE_STEPPING;
4517 /* TT_LWP_CONTINUE can pass signals to threads, TT_PROC_CONTINUE can't.
4518 Therefore, we really can't use TT_PROC_CONTINUE here.
4520 Consider a process which stopped due to signal which gdb decides
4521 to handle and not pass on to the inferior. In that case we must
4522 clear the pending signal by restarting the inferior using
4523 TT_LWP_CONTINUE and pass zero as the signal number. Else the
4524 pending signal will be passed to the inferior. interrupt.exp
4525 in the testsuite does this precise thing and fails due to the
4526 unwanted signal delivery to the inferior. */
4527 /* drow/2002-12-05: However, note that we must use TT_PROC_CONTINUE
4528 if we are tracing a vfork. */
4529 if (vfork_in_flight)
4531 call_ttrace (TT_PROC_CONTINUE, tid, TT_NIL, TT_NIL, TT_NIL);
4532 clear_all_handled ();
4533 clear_all_stepping_mode ();
4535 else if (resume_all_threads)
4539 printf ("Doing a continue by loop of all threads\n");
4542 threads_continue_all_with_signals (tid, signal);
4544 clear_all_handled ();
4545 clear_all_stepping_mode ();
4550 printf ("Doing a continue w/signal of just thread %d\n", tid);
4553 threads_continue_one_with_signal (tid, signal);
4555 /* Clear the "handled" state of this thread, because we
4556 will soon get a new event for it. Other events can
4557 stay as they were. */
4558 clear_handled (tid);
4559 clear_stepping_mode (tid);
4563 process_state = new_process_state;
4565 #ifdef WAIT_BUFFER_DEBUG
4567 printf ("Process set to %s\n",
4568 get_printable_name_of_process_state (process_state));
4572 #endif /* CHILD_RESUME */
4575 #ifdef ATTACH_DETACH
4579 * One worry is that we may not be attaching to "inferior_ptid"
4580 * and thus may not want to clear out our data. FIXME?
4584 update_thread_state_after_attach (int pid, attach_continue_t kind_of_go)
4587 ttstate_t thread_state;
4591 /* The process better be stopped.
4593 if (process_state != STOPPED
4594 && process_state != VFORKING)
4595 warning ("Internal error attaching.");
4597 /* Clear out old tthread info and start over. This has the
4598 * side effect of ensuring that the TRAP is reported as being
4599 * in the right thread (re-mapped from tid to pid).
4601 * It's because we need to add the tthread _now_ that we
4602 * need to call "clear_thread_info" _now_, and that's why
4603 * "require_notification_of_events" doesn't clear the thread
4604 * info (it's called later than this routine).
4606 clear_thread_info ();
4609 for (tid = get_process_first_stopped_thread_id (pid, &thread_state);
4611 tid = get_process_next_stopped_thread_id (pid, &thread_state))
4620 printf ("Attaching to process %d, thread %d\n",
4625 /* Tell ourselves and the "rest of gdb" that this thread
4628 * This isn't really a hack. Other thread-based versions
4629 * of gdb (e.g. gnu-nat.c) seem to do the same thing.
4631 * We don't need to do mapping here, as we know this
4632 * is the first thread and thus gets the real pid
4633 * (and is "inferior_ptid").
4635 * NOTE: it probably isn't the originating thread,
4636 * but that doesn't matter (we hope!).
4638 add_tthread (pid, tid);
4639 p = find_thread_info (tid);
4640 if (NULL == p) /* ?We just added it! */
4641 error ("Internal error adding a thread on attach.");
4643 copy_ttstate_t (&p->last_stop_state, &thread_state);
4646 if (DO_ATTACH_CONTINUE == kind_of_go)
4649 * If we are going to CONTINUE afterwards,
4650 * raising a SIGTRAP, don't bother trying to
4651 * handle this event. But check first!
4653 switch (p->last_stop_state.tts_event)
4657 /* Ok to set this handled.
4662 warning ("Internal error; skipping event %s on process %d, thread %d.",
4663 get_printable_name_of_ttrace_event (
4664 p->last_stop_state.tts_event),
4668 set_handled (pid, tid);
4673 /* There will be no "continue" opertion, so the
4674 * process remains stopped. Don't set any events
4675 * handled except the "gimmies".
4677 switch (p->last_stop_state.tts_event)
4681 /* Ok to ignore this.
4683 set_handled (pid, tid);
4688 /* Expected "other" FORK or EXEC event from a
4694 printf ("Internal error: failed to handle event %s on process %d, thread %d.",
4695 get_printable_name_of_ttrace_event (
4696 p->last_stop_state.tts_event),
4701 add_thread (pid_to_ptid (pid)); /* in thread.c */
4709 /* One mustn't call ttrace_wait() after attaching via ttrace,
4710 'cause the process is stopped already.
4712 However, the upper layers of gdb's execution control will
4713 want to wait after attaching (but not after forks, in
4714 which case they will be doing a "target_resume", anticipating
4715 a later TTEVT_EXEC or TTEVT_FORK event).
4717 To make this attach() implementation more compatible with
4718 others, we'll make the attached-to process raise a SIGTRAP.
4720 Issue: this continues only one thread. That could be
4721 dangerous if the thread is blocked--the process won't run
4722 and no trap will be raised. FIX! (check state.tts_flags?
4723 need one that's either TTS_WASRUNNING--but we've stopped
4724 it and made it TTS_WASSUSPENDED. Hum...FIXME!)
4726 if (DO_ATTACH_CONTINUE == kind_of_go)
4728 tt_status = call_real_ttrace (
4733 (TTRACE_ARG_TYPE) target_signal_to_host (TARGET_SIGNAL_TRAP),
4736 perror_with_name ("ttrace");
4738 clear_handled (a_thread); /* So TRAP will be reported. */
4742 process_state = RUNNING;
4747 #endif /* ATTACH_DETACH */
4750 #ifdef ATTACH_DETACH
4751 /* Start debugging the process whose number is PID.
4759 tt_status = call_real_ttrace (
4764 (TTRACE_ARG_TYPE) TT_VERSION,
4767 perror_with_name ("ttrace attach");
4769 /* If successful, the process is now stopped.
4771 process_state = STOPPED;
4773 /* Our caller ("attach_command" in "infcmd.c")
4774 * expects to do a "wait_for_inferior" after
4775 * the attach, so make sure the inferior is
4776 * running when we're done.
4778 update_thread_state_after_attach (pid, DO_ATTACH_CONTINUE);
4784 #if defined(CHILD_POST_ATTACH)
4786 child_post_attach (int pid)
4790 printf ("child-post-attach call\n");
4793 require_notification_of_events (pid);
4798 /* Stop debugging the process whose number is PID
4799 and continue it with signal number SIGNAL.
4800 SIGNAL = 0 means just continue it.
4806 call_ttrace (TT_PROC_DETACH,
4807 PIDGET (inferior_ptid),
4809 (TTRACE_ARG_TYPE) signal,
4813 clear_thread_info ();
4815 /* Process-state? */
4817 #endif /* ATTACH_DETACH */
4820 /* Default the type of the ttrace transfer to int. */
4821 #ifndef TTRACE_XFER_TYPE
4822 #define TTRACE_XFER_TYPE int
4826 _initialize_kernel_u_addr (void)
4830 #if !defined (CHILD_XFER_MEMORY)
4831 /* NOTE! I tried using TTRACE_READDATA, etc., to read and write memory
4832 in the NEW_SUN_TTRACE case.
4833 It ought to be straightforward. But it appears that writing did
4834 not write the data that I specified. I cannot understand where
4835 it got the data that it actually did write. */
4837 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
4838 to debugger memory starting at MYADDR. Copy to inferior if
4839 WRITE is nonzero. TARGET is ignored.
4841 Returns the length copied, which is either the LEN argument or zero.
4842 This xfer function does not do partial moves, since child_ops
4843 doesn't allow memory operations to cross below us in the target stack
4847 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
4848 struct mem_attrib *attrib,
4849 struct target_ops *target)
4852 /* Round starting address down to longword boundary. */
4853 register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (TTRACE_XFER_TYPE);
4854 /* Round ending address up; get number of longwords that makes. */
4856 = (((memaddr + len) - addr) + sizeof (TTRACE_XFER_TYPE) - 1)
4857 / sizeof (TTRACE_XFER_TYPE);
4858 /* Allocate buffer of that many longwords. */
4859 /* FIXME (alloca): This code, cloned from infptrace.c, is unsafe
4860 because it uses alloca to allocate a buffer of arbitrary size.
4861 For very large xfers, this could crash GDB's stack. */
4862 register TTRACE_XFER_TYPE *buffer
4863 = (TTRACE_XFER_TYPE *) alloca (count * sizeof (TTRACE_XFER_TYPE));
4867 /* Fill start and end extra bytes of buffer with existing memory data. */
4869 if (addr != memaddr || len < (int) sizeof (TTRACE_XFER_TYPE))
4871 /* Need part of initial word -- fetch it. */
4872 buffer[0] = call_ttrace (TT_LWP_RDTEXT,
4873 PIDGET (inferior_ptid),
4874 (TTRACE_ARG_TYPE) addr,
4879 if (count > 1) /* FIXME, avoid if even boundary */
4881 buffer[count - 1] = call_ttrace (TT_LWP_RDTEXT,
4882 PIDGET (inferior_ptid),
4884 (addr + (count - 1) * sizeof (TTRACE_XFER_TYPE))),
4889 /* Copy data to be written over corresponding part of buffer */
4891 memcpy ((char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
4895 /* Write the entire buffer. */
4897 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4900 call_ttrace (TT_LWP_WRDATA,
4901 PIDGET (inferior_ptid),
4902 (TTRACE_ARG_TYPE) addr,
4903 (TTRACE_ARG_TYPE) buffer[i],
4907 /* Using the appropriate one (I or D) is necessary for
4908 Gould NP1, at least. */
4910 call_ttrace (TT_LWP_WRTEXT,
4911 PIDGET (inferior_ptid),
4912 (TTRACE_ARG_TYPE) addr,
4913 (TTRACE_ARG_TYPE) buffer[i],
4922 /* Read all the longwords */
4923 for (i = 0; i < count; i++, addr += sizeof (TTRACE_XFER_TYPE))
4926 buffer[i] = call_ttrace (TT_LWP_RDTEXT,
4927 PIDGET (inferior_ptid),
4928 (TTRACE_ARG_TYPE) addr,
4936 /* Copy appropriate bytes out of the buffer. */
4938 (char *) buffer + (memaddr & (sizeof (TTRACE_XFER_TYPE) - 1)),
4948 int udot_off; /* Offset into user struct */
4949 int udot_val; /* Value from user struct at udot_off */
4950 char mess[128]; /* For messages */
4952 if (!target_has_execution)
4954 error ("The program is not being run.");
4957 #if !defined (KERNEL_U_SIZE)
4959 /* Adding support for this command is easy. Typically you just add a
4960 routine, called "kernel_u_size" that returns the size of the user
4961 struct, to the appropriate *-nat.c file and then add to the native
4962 config file "#define KERNEL_U_SIZE kernel_u_size()" */
4963 error ("Don't know how large ``struct user'' is in this version of gdb.");
4967 for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val))
4969 if ((udot_off % 24) == 0)
4973 printf_filtered ("\n");
4975 printf_filtered ("%04x:", udot_off);
4977 udot_val = call_ttrace (TT_LWP_RUREGS,
4978 PIDGET (inferior_ptid),
4979 (TTRACE_ARG_TYPE) udot_off,
4984 sprintf (mess, "\nreading user struct at offset 0x%x", udot_off);
4985 perror_with_name (mess);
4987 /* Avoid using nonportable (?) "*" in print specs */
4988 printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val);
4990 printf_filtered ("\n");
4994 #endif /* !defined (CHILD_XFER_MEMORY). */
4997 /* TTrace version of "target_pid_to_exec_file"
5000 child_pid_to_exec_file (int tid)
5003 static char exec_file_buffer[1024];
5005 static struct pst_status buf;
5007 /* On various versions of hpux11, this may fail due to a supposed
5008 kernel bug. We have alternate methods to get this information
5010 tt_status = call_ttrace (TT_PROC_GET_PATHNAME,
5012 (uint64_t) exec_file_buffer,
5013 sizeof (exec_file_buffer) - 1,
5016 return exec_file_buffer;
5018 /* Try to get process information via pstat and extract the filename
5019 from the pst_cmd field within the pst_status structure. */
5020 if (pstat_getproc (&buf, sizeof (struct pst_status), 0, tid) != -1)
5022 char *p = buf.pst_cmd;
5024 while (*p && *p != ' ')
5028 return (buf.pst_cmd);
5035 pre_fork_inferior (void)
5039 status = pipe (startup_semaphore.parent_channel);
5042 warning ("error getting parent pipe for startup semaphore");
5046 status = pipe (startup_semaphore.child_channel);
5049 warning ("error getting child pipe for startup semaphore");
5054 /* Called from child_follow_fork in hppah-nat.c.
5056 * This seems to be intended to attach after a fork or
5057 * vfork, while "attach" is used to attach to a pid
5058 * given by the user. The check for an existing attach
5059 * seems odd--it always fails in our test system.
5062 hppa_require_attach (int pid)
5067 unsigned int regs_offset;
5068 process_state_t old_process_state = process_state;
5070 /* Are we already attached? There appears to be no explicit
5071 * way to answer this via ttrace, so we try something which
5072 * should be innocuous if we are attached. If that fails,
5073 * then we assume we're not attached, and so attempt to make
5077 tt_status = call_real_ttrace (TT_PROC_STOP,
5080 (TTRACE_ARG_TYPE) TT_NIL,
5081 (TTRACE_ARG_TYPE) TT_NIL,
5086 /* No change to process-state!
5093 /* If successful, the process is now stopped. But if
5094 * we're VFORKING, the parent is still running, so don't
5095 * change the process state.
5097 if (process_state != VFORKING)
5098 process_state = STOPPED;
5100 /* If we were already attached, you'd think that we
5101 * would need to start going again--but you'd be wrong,
5102 * as the fork-following code is actually in the middle
5103 * of the "resume" routine in in "infrun.c" and so
5104 * will (almost) immediately do a resume.
5106 * On the other hand, if we are VFORKING, which means
5107 * that the child and the parent share a process for a
5108 * while, we know that "resume" won't be resuming
5109 * until the child EXEC event is seen. But we still
5110 * don't want to continue, as the event is already
5113 update_thread_state_after_attach (pid, DONT_ATTACH_CONTINUE);
5114 } /* STOP succeeded */
5120 hppa_require_detach (int pid, int signal)
5124 /* If signal is non-zero, we must pass the signal on to the active
5125 thread prior to detaching. We do this by continuing the threads
5131 threads_continue_all_with_signals (pid, signal);
5135 tt_status = call_ttrace (TT_PROC_DETACH,
5141 errno = 0; /* Ignore any errors. */
5143 /* process_state? */
5148 /* Given the starting address of a memory page, hash it to a bucket in
5149 the memory page dictionary.
5152 get_dictionary_bucket_of_page (CORE_ADDR page_start)
5156 hash = (page_start / memory_page_dictionary.page_size);
5157 hash = hash % MEMORY_PAGE_DICTIONARY_BUCKET_COUNT;
5163 /* Given a memory page's starting address, get (i.e., find an existing
5164 or create a new) dictionary entry for the page. The page will be
5165 write-protected when this function returns, but may have a reference
5166 count of 0 (if the page was newly-added to the dictionary).
5168 static memory_page_t *
5169 get_dictionary_entry_of_page (int pid, CORE_ADDR page_start)
5172 memory_page_t *page = NULL;
5173 memory_page_t *previous_page = NULL;
5175 /* We're going to be using the dictionary now, than-kew. */
5176 require_memory_page_dictionary ();
5178 /* Try to find an existing dictionary entry for this page. Hash
5179 on the page's starting address.
5181 bucket = get_dictionary_bucket_of_page (page_start);
5182 page = &memory_page_dictionary.buckets[bucket];
5183 while (page != NULL)
5185 if (page->page_start == page_start)
5187 previous_page = page;
5191 /* Did we find a dictionary entry for this page? If not, then
5192 add it to the dictionary now.
5196 /* Create a new entry. */
5197 page = (memory_page_t *) xmalloc (sizeof (memory_page_t));
5198 page->page_start = page_start;
5199 page->reference_count = 0;
5201 page->previous = NULL;
5203 /* We'll write-protect the page now, if that's allowed. */
5204 page->original_permissions = write_protect_page (pid, page_start);
5206 /* Add the new entry to the dictionary. */
5207 page->previous = previous_page;
5208 previous_page->next = page;
5210 memory_page_dictionary.page_count++;
5218 remove_dictionary_entry_of_page (int pid, memory_page_t *page)
5220 /* Restore the page's original permissions. */
5221 unwrite_protect_page (pid, page->page_start, page->original_permissions);
5223 /* Kick the page out of the dictionary. */
5224 if (page->previous != NULL)
5225 page->previous->next = page->next;
5226 if (page->next != NULL)
5227 page->next->previous = page->previous;
5229 /* Just in case someone retains a handle to this after it's freed. */
5230 page->page_start = (CORE_ADDR) 0;
5232 memory_page_dictionary.page_count--;
5239 hppa_enable_syscall_events (int pid)
5242 ttevent_t ttrace_events;
5244 /* Get the set of events that are currently enabled. */
5245 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5247 (TTRACE_ARG_TYPE) & ttrace_events,
5248 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5251 perror_with_name ("ttrace");
5253 /* Add syscall events to that set. */
5254 ttrace_events.tte_events |= TTEVT_SYSCALL_ENTRY;
5255 ttrace_events.tte_events |= TTEVT_SYSCALL_RETURN;
5257 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5259 (TTRACE_ARG_TYPE) & ttrace_events,
5260 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5263 perror_with_name ("ttrace");
5268 hppa_disable_syscall_events (int pid)
5271 ttevent_t ttrace_events;
5273 /* Get the set of events that are currently enabled. */
5274 tt_status = call_ttrace (TT_PROC_GET_EVENT_MASK,
5276 (TTRACE_ARG_TYPE) & ttrace_events,
5277 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5280 perror_with_name ("ttrace");
5282 /* Remove syscall events from that set. */
5283 ttrace_events.tte_events &= ~TTEVT_SYSCALL_ENTRY;
5284 ttrace_events.tte_events &= ~TTEVT_SYSCALL_RETURN;
5286 tt_status = call_ttrace (TT_PROC_SET_EVENT_MASK,
5288 (TTRACE_ARG_TYPE) & ttrace_events,
5289 (TTRACE_ARG_TYPE) sizeof (ttrace_events),
5292 perror_with_name ("ttrace");
5296 /* The address range beginning with START and ending with START+LEN-1
5297 (inclusive) is to be watched via page-protection by a new watchpoint.
5298 Set protection for all pages that overlap that range.
5300 Note that our caller sets TYPE to:
5301 0 for a bp_hardware_watchpoint,
5302 1 for a bp_read_watchpoint,
5303 2 for a bp_access_watchpoint
5305 (Yes, this is intentionally (though lord only knows why) different
5306 from the TYPE that is passed to hppa_remove_hw_watchpoint.)
5309 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
5311 CORE_ADDR page_start;
5312 int dictionary_was_empty;
5315 LONGEST range_size_in_pages;
5318 error ("read or access hardware watchpoints not supported on HP-UX");
5320 /* Examine all pages in the address range. */
5321 require_memory_page_dictionary ();
5323 dictionary_was_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5325 page_size = memory_page_dictionary.page_size;
5326 page_start = (start / page_size) * page_size;
5327 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5329 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5331 memory_page_t *page;
5333 /* This gets the page entered into the dictionary if it was
5334 not already entered.
5336 page = get_dictionary_entry_of_page (pid, page_start);
5337 page->reference_count++;
5340 /* Our implementation depends on seeing calls to kernel code, for the
5341 following reason. Here we ask to be notified of syscalls.
5343 When a protected page is accessed by user code, HP-UX raises a SIGBUS.
5346 But when kernel code accesses the page, it doesn't give a SIGBUS.
5347 Rather, the system call that touched the page fails, with errno=EFAULT.
5350 We could accomodate this "feature" by asking to be notified of syscall
5351 entries & exits; upon getting an entry event, disabling page-protections;
5352 upon getting an exit event, reenabling page-protections and then checking
5353 if any watchpoints triggered.
5355 However, this turns out to be a real performance loser. syscalls are
5356 usually a frequent occurrence. Having to unprotect-reprotect all watched
5357 pages, and also to then read all watched memory locations and compare for
5358 triggers, can be quite expensive.
5360 Instead, we'll only ask to be notified of syscall exits. When we get
5361 one, we'll check whether errno is set. If not, or if it's not EFAULT,
5362 we can just continue the inferior.
5364 If errno is set upon syscall exit to EFAULT, we must perform some fairly
5365 hackish stuff to determine whether the failure really was due to a
5366 page-protect trap on a watched location.
5368 if (dictionary_was_empty)
5369 hppa_enable_syscall_events (pid);
5375 /* The address range beginning with START and ending with START+LEN-1
5376 (inclusive) was being watched via page-protection by a watchpoint
5377 which has been removed. Remove protection for all pages that
5378 overlap that range, which are not also being watched by other
5382 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
5384 CORE_ADDR page_start;
5385 int dictionary_is_empty;
5388 LONGEST range_size_in_pages;
5391 error ("read or access hardware watchpoints not supported on HP-UX");
5393 /* Examine all pages in the address range. */
5394 require_memory_page_dictionary ();
5396 page_size = memory_page_dictionary.page_size;
5397 page_start = (start / page_size) * page_size;
5398 range_size_in_pages = ((LONGEST) len + (LONGEST) page_size - 1) / (LONGEST) page_size;
5400 for (page_id = 0; page_id < range_size_in_pages; page_id++, page_start += page_size)
5402 memory_page_t *page;
5404 page = get_dictionary_entry_of_page (pid, page_start);
5405 page->reference_count--;
5407 /* Was this the last reference of this page? If so, then we
5408 must scrub the entry from the dictionary, and also restore
5409 the page's original permissions.
5411 if (page->reference_count == 0)
5412 remove_dictionary_entry_of_page (pid, page);
5415 dictionary_is_empty = (memory_page_dictionary.page_count == (LONGEST) 0);
5417 /* If write protections are currently disallowed, then that implies that
5418 wait_for_inferior believes that the inferior is within a system call.
5419 Since we want to see both syscall entry and return, it's clearly not
5420 good to disable syscall events in this state!
5422 ??rehrauer: Yeah, it'd be better if we had a specific flag that said,
5423 "inferior is between syscall events now". Oh well.
5425 if (dictionary_is_empty && memory_page_dictionary.page_protections_allowed)
5426 hppa_disable_syscall_events (pid);
5432 /* Could we implement a watchpoint of this type via our available
5435 This query does not consider whether a particular address range
5436 could be so watched, but just whether support is generally available
5437 for such things. See hppa_range_profitable_for_hw_watchpoint for a
5438 query that answers whether a particular range should be watched via
5442 hppa_can_use_hw_watchpoint (int type, int cnt, int ot)
5444 return (type == bp_hardware_watchpoint);
5448 /* Assuming we could set a hardware watchpoint on this address, do
5449 we think it would be profitable ("a good idea") to do so? If not,
5450 we can always set a regular (aka single-step & test) watchpoint
5454 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len)
5456 int range_is_stack_based;
5457 int range_is_accessible;
5458 CORE_ADDR page_start;
5461 LONGEST range_size_in_pages;
5463 /* ??rehrauer: For now, say that all addresses are potentially
5464 profitable. Possibly later we'll want to test the address
5467 range_is_stack_based = 0;
5469 /* If any page in the range is inaccessible, then we cannot
5470 really use hardware watchpointing, even though our client
5471 thinks we can. In that case, it's actually an error to
5472 attempt to use hw watchpoints, so we'll tell our client
5473 that the range is "unprofitable", and hope that they listen...
5475 range_is_accessible = 1; /* Until proven otherwise. */
5477 /* Examine all pages in the address range. */
5479 page_size = sysconf (_SC_PAGE_SIZE);
5481 /* If we can't determine page size, we're hosed. Tell our
5482 client it's unprofitable to use hw watchpoints for this
5485 if (errno || (page_size <= 0))
5491 page_start = (start / page_size) * page_size;
5492 range_size_in_pages = len / (LONGEST) page_size;
5494 for (page = 0; page < range_size_in_pages; page++, page_start += page_size)
5497 int page_permissions;
5499 /* Is this page accessible? */
5501 tt_status = call_ttrace (TT_PROC_GET_MPROTECT,
5503 (TTRACE_ARG_TYPE) page_start,
5505 (TTRACE_ARG_TYPE) & page_permissions);
5506 if (errno || (tt_status < 0))
5509 range_is_accessible = 0;
5513 /* Yes, go for another... */
5516 return (!range_is_stack_based && range_is_accessible);
5521 hppa_pid_or_tid_to_str (ptid_t ptid)
5523 static char buf[100]; /* Static because address returned. */
5524 pid_t id = PIDGET (ptid);
5526 /* Does this appear to be a process? If so, print it that way. */
5527 if (is_process_id (id))
5528 return child_pid_to_str (ptid);
5530 /* Else, print both the GDB thread number and the system thread id. */
5531 sprintf (buf, "thread %d (", pid_to_thread_id (ptid));
5532 strcat (buf, hppa_tid_to_str (ptid));
5533 strcat (buf, ")\0");
5539 /* If the current pid is not the pid this module reported
5540 * from "ptrace_wait" with the most recent event, then the
5541 * user has switched threads.
5543 * If the last reported event was a breakpoint, then return
5544 * the old thread id, else return 0.
5547 hppa_switched_threads (pid_t gdb_pid)
5549 if (gdb_pid == old_gdb_pid)
5552 * Core gdb is working with the same pid that it
5553 * was before we reported the last event. This
5554 * is ok: e.g. we reported hitting a thread-specific
5555 * breakpoint, but we were reporting the wrong
5556 * thread, so the core just ignored the event.
5558 * No thread switch has happened.
5562 else if (gdb_pid == reported_pid)
5565 * Core gdb is working with the pid we reported, so
5566 * any continue or step will be able to figure out
5567 * that it needs to step over any hit breakpoints
5568 * without our (i.e. PREPARE_TO_PROCEED's) help.
5572 else if (!reported_bpt)
5575 * The core switched, but we didn't just report a
5576 * breakpoint, so there's no just-hit breakpoint
5577 * instruction at "reported_pid"'s PC, and thus there
5578 * is no need to step over it.
5584 /* There's been a real switch, and we reported
5585 * a hit breakpoint. Let "hppa_prepare_to_proceed"
5586 * know, so it can see whether the breakpoint is
5589 return reported_pid;
5592 /* Keep compiler happy with an obvious return at the end.
5598 hppa_ensure_vforking_parent_remains_stopped (int pid)
5600 /* Nothing to do when using ttrace. Only the ptrace-based implementation
5607 hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
5609 return 0; /* No, the parent vfork is available now. */
5613 /* Write a register as a 64bit value. This may be necessary if the
5614 native OS is too braindamaged to allow some (or all) registers to
5615 be written in 32bit hunks such as hpux11 and the PC queue registers.
5617 This is horribly gross and disgusting. */
5620 ttrace_write_reg_64 (int gdb_tid, CORE_ADDR dest_addr, CORE_ADDR src_addr)
5626 tid = map_from_gdb_tid (gdb_tid);
5627 pid = get_pid_for (tid);
5630 tt_status = ttrace (TT_LWP_WUREGS,
5633 (TTRACE_ARG_TYPE) dest_addr,
5635 (TTRACE_ARG_TYPE) src_addr );
5640 /* Don't bother for a known benign error: if you ask for the
5641 first thread state, but there is only one thread and it's
5642 not stopped, ttrace complains.
5644 We have this inside the #ifdef because our caller will do
5645 this check for real. */
5646 if( request != TT_PROC_GET_FIRST_LWP_STATE
5647 || errno != EPROTO )
5650 printf( "TT fail for %s, with pid %d, tid %d, status %d \n",
5651 get_printable_name_of_ttrace_request (TT_LWP_WUREGS),
5652 pid, tid, tt_status );
5661 _initialize_infttrace (void)
5663 /* Initialize the ttrace-based hardware watchpoint implementation. */
5664 memory_page_dictionary.page_count = (LONGEST) - 1;
5665 memory_page_dictionary.page_protections_allowed = 1;
5668 memory_page_dictionary.page_size = sysconf (_SC_PAGE_SIZE);
5670 /* We do a lot of casts from pointers to TTRACE_ARG_TYPE; make sure
5672 if (sizeof (TTRACE_ARG_TYPE) < sizeof (void *))
5673 internal_error (__FILE__, __LINE__, "failed internal consistency check");
5675 if (errno || (memory_page_dictionary.page_size <= 0))
5676 perror_with_name ("sysconf");