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