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