1 /* Native support code for HPUX PA-RISC.
2 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1998, 1999
3 Free Software Foundation, Inc.
5 Contributed by the Center for Software Science at the
6 University of Utah (pa-gdb-bugs@cs.utah.edu).
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
29 #include <sys/ptrace.h>
34 extern CORE_ADDR text_end
;
36 static void fetch_register (int);
39 fetch_inferior_registers (int regno
)
42 for (regno
= 0; regno
< NUM_REGS
; regno
++)
43 fetch_register (regno
);
45 fetch_register (regno
);
48 /* Our own version of the offsetof macro, since we can't assume ANSI C. */
49 #define HPPAH_OFFSETOF(type, member) ((int) (&((type *) 0)->member))
51 /* Store our register values back into the inferior.
52 If REGNO is -1, do this for all registers.
53 Otherwise, REGNO specifies which register (so we can save time). */
56 store_inferior_registers (int regno
)
58 register unsigned int regaddr
;
61 unsigned int offset
= U_REGS_OFFSET
;
66 unsigned int addr
, len
, offset
;
68 if (CANNOT_STORE_REGISTER (regno
))
72 len
= REGISTER_RAW_SIZE (regno
);
74 /* Requests for register zero actually want the save_state's
75 ss_flags member. As RM says: "Oh, what a hack!" */
79 addr
= HPPAH_OFFSETOF (save_state_t
, ss_flags
);
80 len
= sizeof (ss
.ss_flags
);
82 /* Note that ss_flags is always an int, no matter what
83 REGISTER_RAW_SIZE(0) says. Assuming all HP-UX PA machines
84 are big-endian, put it at the least significant end of the
85 value, and zap the rest of the buffer. */
86 offset
= REGISTER_RAW_SIZE (0) - len
;
89 /* Floating-point registers come from the ss_fpblock area. */
90 else if (regno
>= FP0_REGNUM
)
91 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_fpblock
)
92 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (FP0_REGNUM
)));
94 /* Wide registers come from the ss_wide area.
95 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
96 between ss_wide and ss_narrow than to use the raw register size.
97 But checking ss_flags would require an extra ptrace call for
98 every register reference. Bleah. */
100 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_wide
)
101 + REGISTER_BYTE (regno
));
103 /* Narrow registers come from the ss_narrow area. Note that
104 ss_narrow starts with gr1, not gr0. */
106 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_narrow
)
107 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (1)));
109 internal_error ("hppah-nat.c (write_register): unexpected register size");
111 #ifdef GDB_TARGET_IS_HPPA_20W
112 /* Unbelieveable. The PC head and tail must be written in 64bit hunks
113 or we will get an error. Worse yet, the oddball ptrace/ttrace
114 layering will not allow us to perform a 64bit register store.
117 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
&& len
== 8)
121 temp
= *(CORE_ADDR
*)®isters
[REGISTER_BYTE (regno
)];
123 /* Set the priv level (stored in the low two bits of the PC. */
126 ttrace_write_reg_64 (inferior_pid
, (CORE_ADDR
)addr
, (CORE_ADDR
)&temp
);
128 /* If we fail to write the PC, give a true error instead of
132 char *err
= safe_strerror (errno
);
133 char *msg
= alloca (strlen (err
) + 128);
134 sprintf (msg
, "writing `%s' register: %s",
135 REGISTER_NAME (regno
), err
);
136 perror_with_name (msg
);
141 /* Another crock. HPUX complains if you write a nonzero value to
142 the high part of IPSW. What will it take for HP to catch a
143 clue about building sensible interfaces? */
144 if (regno
== IPSW_REGNUM
&& len
== 8)
145 *(int *)®isters
[REGISTER_BYTE (regno
)] = 0;
148 for (i
= 0; i
< len
; i
+= sizeof (int))
151 call_ptrace (PT_WUREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
+ i
,
152 *(int *) ®isters
[REGISTER_BYTE (regno
) + i
]);
155 /* Warning, not error, in case we are attached; sometimes
156 the kernel doesn't let us at the registers. */
157 char *err
= safe_strerror (errno
);
158 char *msg
= alloca (strlen (err
) + 128);
159 sprintf (msg
, "writing `%s' register: %s",
160 REGISTER_NAME (regno
), err
);
161 /* If we fail to write the PC, give a true error instead of
163 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
)
164 perror_with_name (msg
);
172 for (regno
= 0; regno
< NUM_REGS
; regno
++)
173 store_inferior_registers (regno
);
177 /* Fetch a register's value from the process's U area. */
179 fetch_register (int regno
)
181 char buf
[MAX_REGISTER_RAW_SIZE
];
182 unsigned int addr
, len
, offset
;
186 len
= REGISTER_RAW_SIZE (regno
);
188 /* Requests for register zero actually want the save_state's
189 ss_flags member. As RM says: "Oh, what a hack!" */
193 addr
= HPPAH_OFFSETOF (save_state_t
, ss_flags
);
194 len
= sizeof (ss
.ss_flags
);
196 /* Note that ss_flags is always an int, no matter what
197 REGISTER_RAW_SIZE(0) says. Assuming all HP-UX PA machines
198 are big-endian, put it at the least significant end of the
199 value, and zap the rest of the buffer. */
200 offset
= REGISTER_RAW_SIZE (0) - len
;
201 memset (buf
, 0, sizeof (buf
));
204 /* Floating-point registers come from the ss_fpblock area. */
205 else if (regno
>= FP0_REGNUM
)
206 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_fpblock
)
207 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (FP0_REGNUM
)));
209 /* Wide registers come from the ss_wide area.
210 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
211 between ss_wide and ss_narrow than to use the raw register size.
212 But checking ss_flags would require an extra ptrace call for
213 every register reference. Bleah. */
215 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_wide
)
216 + REGISTER_BYTE (regno
));
218 /* Narrow registers come from the ss_narrow area. Note that
219 ss_narrow starts with gr1, not gr0. */
221 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_narrow
)
222 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (1)));
225 internal_error ("hppa-nat.c (fetch_register): unexpected register size");
227 for (i
= 0; i
< len
; i
+= sizeof (int))
230 /* Copy an int from the U area to buf. Fill the least
231 significant end if len != raw_size. */
232 * (int *) &buf
[offset
+ i
] =
233 call_ptrace (PT_RUREGS
, inferior_pid
,
234 (PTRACE_ARG3_TYPE
) addr
+ i
, 0);
237 /* Warning, not error, in case we are attached; sometimes
238 the kernel doesn't let us at the registers. */
239 char *err
= safe_strerror (errno
);
240 char *msg
= alloca (strlen (err
) + 128);
241 sprintf (msg
, "reading `%s' register: %s",
242 REGISTER_NAME (regno
), err
);
248 /* If we're reading an address from the instruction address queue,
249 mask out the bottom two bits --- they contain the privilege
251 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
)
252 buf
[len
- 1] &= ~0x3;
254 supply_register (regno
, buf
);
258 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
259 to debugger memory starting at MYADDR. Copy to inferior if
262 Returns the length copied, which is either the LEN argument or zero.
263 This xfer function does not do partial moves, since child_ops
264 doesn't allow memory operations to cross below us in the target stack
265 anyway. TARGET is ignored. */
268 child_xfer_memory (CORE_ADDR memaddr
, char *myaddr
, int len
, int write
,
269 struct target_ops
*target
)
272 /* Round starting address down to longword boundary. */
273 register CORE_ADDR addr
= memaddr
& - (CORE_ADDR
)(sizeof (int));
274 /* Round ending address up; get number of longwords that makes. */
276 = (((memaddr
+ len
) - addr
) + sizeof (int) - 1) / sizeof (int);
278 /* Allocate buffer of that many longwords.
279 Note -- do not use alloca to allocate this buffer since there is no
280 guarantee of when the buffer will actually be deallocated.
282 This routine can be called over and over with the same call chain;
283 this (in effect) would pile up all those alloca requests until a call
284 to alloca was made from a point higher than this routine in the
286 register int *buffer
= (int *) xmalloc (count
* sizeof (int));
290 /* Fill start and end extra bytes of buffer with existing memory data. */
291 if (addr
!= memaddr
|| len
< (int) sizeof (int))
293 /* Need part of initial word -- fetch it. */
294 buffer
[0] = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
295 inferior_pid
, (PTRACE_ARG3_TYPE
) addr
, 0);
298 if (count
> 1) /* FIXME, avoid if even boundary */
301 = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
303 (PTRACE_ARG3_TYPE
) (addr
304 + (count
- 1) * sizeof (int)),
308 /* Copy data to be written over corresponding part of buffer */
309 memcpy ((char *) buffer
+ (memaddr
& (sizeof (int) - 1)), myaddr
, len
);
311 /* Write the entire buffer. */
312 for (i
= 0; i
< count
; i
++, addr
+= sizeof (int))
316 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the
317 text segment. FIXME -- does it work to write into the data
318 segment using WIUSER, or do these idiots really expect us to
319 figure out which segment the address is in, so we can use a
320 separate system call for it??! */
322 pt_request
= (addr
< text_end
) ? PT_WIUSER
: PT_WDUSER
;
323 pt_status
= call_ptrace (pt_request
,
325 (PTRACE_ARG3_TYPE
) addr
,
328 /* Did we fail? Might we've guessed wrong about which
329 segment this address resides in? Try the other request,
330 and see if that works... */
331 if ((pt_status
== -1) && errno
)
334 pt_request
= (pt_request
== PT_WIUSER
) ? PT_WDUSER
: PT_WIUSER
;
335 pt_status
= call_ptrace (pt_request
,
337 (PTRACE_ARG3_TYPE
) addr
,
340 /* No, we still fail. Okay, time to punt. */
341 if ((pt_status
== -1) && errno
)
351 /* Read all the longwords */
352 for (i
= 0; i
< count
; i
++, addr
+= sizeof (int))
355 buffer
[i
] = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
356 inferior_pid
, (PTRACE_ARG3_TYPE
) addr
, 0);
365 /* Copy appropriate bytes out of the buffer. */
366 memcpy (myaddr
, (char *) buffer
+ (memaddr
& (sizeof (int) - 1)), len
);
374 child_post_follow_inferior_by_clone (void)
378 /* This function is used when following both the parent and child
379 of a fork. In this case, the debugger clones itself. The original
380 debugger follows the parent, the clone follows the child. The
381 original detaches from the child, delivering a SIGSTOP to it to
382 keep it from running away until the clone can attach itself.
384 At this point, the clone has attached to the child. Because of
385 the SIGSTOP, we must now deliver a SIGCONT to the child, or it
386 won't behave properly. */
387 status
= kill (inferior_pid
, SIGCONT
);
392 child_post_follow_vfork (int parent_pid
, int followed_parent
, int child_pid
,
395 /* Are we a debugger that followed the parent of a vfork? If so,
396 then recall that the child's vfork event was delivered to us
397 first. And, that the parent was suspended by the OS until the
398 child's exec or exit events were received.
400 Upon receiving that child vfork, then, we were forced to remove
401 all breakpoints in the child and continue it so that it could
402 reach the exec or exit point.
404 But also recall that the parent and child of a vfork share the
405 same address space. Thus, removing bp's in the child also
406 removed them from the parent.
408 Now that the child has safely exec'd or exited, we must restore
409 the parent's breakpoints before we continue it. Else, we may
410 cause it run past expected stopping points. */
413 reattach_breakpoints (parent_pid
);
416 /* Are we a debugger that followed the child of a vfork? If so,
417 then recall that we don't actually acquire control of the child
418 until after it has exec'd or exited. */
421 /* If the child has exited, then there's nothing for us to do.
422 In the case of an exec event, we'll let that be handled by
423 the normal mechanism that notices and handles exec events, in
428 /* Format a process id, given PID. Be sure to terminate
429 this with a null--it's going to be printed via a "%s". */
431 child_pid_to_str (pid_t pid
)
433 /* Static because address returned */
436 /* Extra NULLs for paranoia's sake */
437 sprintf (buf
, "process %d\0\0\0\0", pid
);
442 /* Format a thread id, given TID. Be sure to terminate
443 this with a null--it's going to be printed via a "%s".
445 Note: This is a core-gdb tid, not the actual system tid.
446 See infttrace.c for details. */
448 hppa_tid_to_str (pid_t tid
)
450 /* Static because address returned */
453 /* Extra NULLs for paranoia's sake */
454 sprintf (buf
, "system thread %d\0\0\0\0", tid
);
459 #if !defined (GDB_NATIVE_HPUX_11)
461 /* The following code is a substitute for the infttrace.c versions used
462 with ttrace() in HPUX 11. */
464 /* This value is an arbitrary integer. */
465 #define PT_VERSION 123456
467 /* This semaphore is used to coordinate the child and parent processes
468 after a fork(), and before an exec() by the child. See
469 parent_attach_all for details. */
473 int parent_channel
[2]; /* Parent "talks" to [1], child "listens" to [0] */
474 int child_channel
[2]; /* Child "talks" to [1], parent "listens" to [0] */
479 #define SEM_LISTEN (0)
481 static startup_semaphore_t startup_semaphore
;
483 extern int parent_attach_all (int, PTRACE_ARG3_TYPE
, int);
486 /* This function causes the caller's process to be traced by its
487 parent. This is intended to be called after GDB forks itself,
488 and before the child execs the target.
490 Note that HP-UX ptrace is rather funky in how this is done.
491 If the parent wants to get the initial exec event of a child,
492 it must set the ptrace event mask of the child to include execs.
493 (The child cannot do this itself.) This must be done after the
494 child is forked, but before it execs.
496 To coordinate the parent and child, we implement a semaphore using
497 pipes. After SETTRC'ing itself, the child tells the parent that
498 it is now traceable by the parent, and waits for the parent's
499 acknowledgement. The parent can then set the child's event mask,
500 and notify the child that it can now exec.
502 (The acknowledgement by parent happens as a result of a call to
503 child_acknowledge_created_inferior.) */
506 parent_attach_all (int pid
, PTRACE_ARG3_TYPE addr
, int data
)
510 /* We need a memory home for a constant. */
511 int tc_magic_child
= PT_VERSION
;
512 int tc_magic_parent
= 0;
514 /* The remainder of this function is only useful for HPUX 10.0 and
515 later, as it depends upon the ability to request notification
516 of specific kinds of events by the kernel. */
517 #if defined(PT_SET_EVENT_MASK)
519 /* Notify the parent that we're potentially ready to exec(). */
520 write (startup_semaphore
.child_channel
[SEM_TALK
],
522 sizeof (tc_magic_child
));
524 /* Wait for acknowledgement from the parent. */
525 read (startup_semaphore
.parent_channel
[SEM_LISTEN
],
527 sizeof (tc_magic_parent
));
528 if (tc_magic_child
!= tc_magic_parent
)
529 warning ("mismatched semaphore magic");
531 /* Discard our copy of the semaphore. */
532 (void) close (startup_semaphore
.parent_channel
[SEM_LISTEN
]);
533 (void) close (startup_semaphore
.parent_channel
[SEM_TALK
]);
534 (void) close (startup_semaphore
.child_channel
[SEM_LISTEN
]);
535 (void) close (startup_semaphore
.child_channel
[SEM_TALK
]);
543 hppa_require_attach (int pid
)
548 unsigned int regs_offset
;
550 /* Are we already attached? There appears to be no explicit way to
551 answer this via ptrace, so we try something which should be
552 innocuous if we are attached. If that fails, then we assume
553 we're not attached, and so attempt to make it so. */
556 regs_offset
= U_REGS_OFFSET
;
557 pc_addr
= register_addr (PC_REGNUM
, regs_offset
);
558 pc
= call_ptrace (PT_READ_U
, pid
, (PTRACE_ARG3_TYPE
) pc_addr
, 0);
563 pt_status
= call_ptrace (PT_ATTACH
, pid
, (PTRACE_ARG3_TYPE
) 0, 0);
568 /* Now we really are attached. */
576 hppa_require_detach (int pid
, int signal
)
579 call_ptrace (PT_DETACH
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
580 errno
= 0; /* Ignore any errors. */
584 /* Since ptrace doesn't support memory page-protection events, which
585 are used to implement "hardware" watchpoints on HP-UX, these are
586 dummy versions, which perform no useful work. */
589 hppa_enable_page_protection_events (int pid
)
594 hppa_disable_page_protection_events (int pid
)
599 hppa_insert_hw_watchpoint (int pid
, CORE_ADDR start
, LONGEST len
, int type
)
601 error ("Hardware watchpoints not implemented on this platform.");
605 hppa_remove_hw_watchpoint (int pid
, CORE_ADDR start
, LONGEST len
,
608 error ("Hardware watchpoints not implemented on this platform.");
612 hppa_can_use_hw_watchpoint (enum bptype type
, int cnt
, enum bptype ot
)
618 hppa_range_profitable_for_hw_watchpoint (int pid
, CORE_ADDR start
, LONGEST len
)
620 error ("Hardware watchpoints not implemented on this platform.");
624 hppa_pid_or_tid_to_str (pid_t id
)
626 /* In the ptrace world, there are only processes. */
627 return child_pid_to_str (id
);
630 /* This function has no meaning in a non-threaded world. Thus, we
631 return 0 (FALSE). See the use of "hppa_prepare_to_proceed" in
635 hppa_switched_threads (pid_t pid
)
641 hppa_ensure_vforking_parent_remains_stopped (int pid
)
643 /* This assumes that the vforked parent is presently stopped, and
644 that the vforked child has just delivered its first exec event.
645 Calling kill() this way will cause the SIGTRAP to be delivered as
646 soon as the parent is resumed, which happens as soon as the
647 vforked child is resumed. See wait_for_inferior for the use of
653 hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
655 return 1; /* Yes, the child must be resumed. */
659 require_notification_of_events (int pid
)
661 #if defined(PT_SET_EVENT_MASK)
663 ptrace_event_t ptrace_events
;
667 /* Instruct the kernel as to the set of events we wish to be
668 informed of. (This support does not exist before HPUX 10.0.
669 We'll assume if PT_SET_EVENT_MASK has not been defined by
670 <sys/ptrace.h>, then we're being built on pre-10.0.) */
671 memset (&ptrace_events
, 0, sizeof (ptrace_events
));
673 /* Note: By default, all signals are visible to us. If we wish
674 the kernel to keep certain signals hidden from us, we do it
675 by calling sigdelset (ptrace_events.pe_signals, signal) for
676 each such signal here, before doing PT_SET_EVENT_MASK. */
677 /* RM: The above comment is no longer true. We start with ignoring
678 all signals, and then add the ones we are interested in. We could
679 do it the other way: start by looking at all signals and then
680 deleting the ones that we aren't interested in, except that
681 multiple gdb signals may be mapped to the same host signal
682 (eg. TARGET_SIGNAL_IO and TARGET_SIGNAL_POLL both get mapped to
683 signal 22 on HPUX 10.20) We want to be notified if we are
684 interested in either signal. */
685 sigfillset (&ptrace_events
.pe_signals
);
687 /* RM: Let's not bother with signals we don't care about */
688 nsigs
= (int) TARGET_SIGNAL_LAST
;
689 for (signum
= nsigs
; signum
> 0; signum
--)
691 if ((signal_stop_state (signum
)) ||
692 (signal_print_state (signum
)) ||
693 (!signal_pass_state (signum
)))
695 if (target_signal_to_host_p (signum
))
696 sigdelset (&ptrace_events
.pe_signals
,
697 target_signal_to_host (signum
));
701 ptrace_events
.pe_set_event
= 0;
703 ptrace_events
.pe_set_event
|= PTRACE_SIGNAL
;
704 ptrace_events
.pe_set_event
|= PTRACE_EXEC
;
705 ptrace_events
.pe_set_event
|= PTRACE_FORK
;
706 ptrace_events
.pe_set_event
|= PTRACE_VFORK
;
707 /* ??rehrauer: Add this one when we're prepared to catch it...
708 ptrace_events.pe_set_event |= PTRACE_EXIT;
712 pt_status
= call_ptrace (PT_SET_EVENT_MASK
,
714 (PTRACE_ARG3_TYPE
) & ptrace_events
,
715 sizeof (ptrace_events
));
717 perror_with_name ("ptrace");
724 require_notification_of_exec_events (int pid
)
726 #if defined(PT_SET_EVENT_MASK)
728 ptrace_event_t ptrace_events
;
730 /* Instruct the kernel as to the set of events we wish to be
731 informed of. (This support does not exist before HPUX 10.0.
732 We'll assume if PT_SET_EVENT_MASK has not been defined by
733 <sys/ptrace.h>, then we're being built on pre-10.0.) */
734 memset (&ptrace_events
, 0, sizeof (ptrace_events
));
736 /* Note: By default, all signals are visible to us. If we wish
737 the kernel to keep certain signals hidden from us, we do it
738 by calling sigdelset (ptrace_events.pe_signals, signal) for
739 each such signal here, before doing PT_SET_EVENT_MASK. */
740 sigemptyset (&ptrace_events
.pe_signals
);
742 ptrace_events
.pe_set_event
= 0;
744 ptrace_events
.pe_set_event
|= PTRACE_EXEC
;
745 /* ??rehrauer: Add this one when we're prepared to catch it...
746 ptrace_events.pe_set_event |= PTRACE_EXIT;
750 pt_status
= call_ptrace (PT_SET_EVENT_MASK
,
752 (PTRACE_ARG3_TYPE
) & ptrace_events
,
753 sizeof (ptrace_events
));
755 perror_with_name ("ptrace");
761 /* This function is called by the parent process, with pid being the
762 ID of the child process, after the debugger has forked. */
765 child_acknowledge_created_inferior (int pid
)
767 /* We need a memory home for a constant. */
768 int tc_magic_parent
= PT_VERSION
;
769 int tc_magic_child
= 0;
771 /* The remainder of this function is only useful for HPUX 10.0 and
772 later, as it depends upon the ability to request notification
773 of specific kinds of events by the kernel. */
774 #if defined(PT_SET_EVENT_MASK)
775 /* Wait for the child to tell us that it has forked. */
776 read (startup_semaphore
.child_channel
[SEM_LISTEN
],
778 sizeof (tc_magic_child
));
780 /* Notify the child that it can exec.
782 In the infttrace.c variant of this function, we set the child's
783 event mask after the fork but before the exec. In the ptrace
784 world, it seems we can't set the event mask until after the exec. */
785 write (startup_semaphore
.parent_channel
[SEM_TALK
],
787 sizeof (tc_magic_parent
));
789 /* We'd better pause a bit before trying to set the event mask,
790 though, to ensure that the exec has happened. We don't want to
791 wait() on the child, because that'll screw up the upper layers
792 of gdb's execution control that expect to see the exec event.
794 After an exec, the child is no longer executing gdb code. Hence,
795 we can't have yet another synchronization via the pipes. We'll
796 just sleep for a second, and hope that's enough delay... */
799 /* Instruct the kernel as to the set of events we wish to be
801 require_notification_of_exec_events (pid
);
803 /* Discard our copy of the semaphore. */
804 (void) close (startup_semaphore
.parent_channel
[SEM_LISTEN
]);
805 (void) close (startup_semaphore
.parent_channel
[SEM_TALK
]);
806 (void) close (startup_semaphore
.child_channel
[SEM_LISTEN
]);
807 (void) close (startup_semaphore
.child_channel
[SEM_TALK
]);
812 child_post_startup_inferior (int pid
)
814 require_notification_of_events (pid
);
818 child_post_attach (int pid
)
820 require_notification_of_events (pid
);
824 child_insert_fork_catchpoint (int pid
)
826 /* This request is only available on HPUX 10.0 and later. */
827 #if !defined(PT_SET_EVENT_MASK)
828 error ("Unable to catch forks prior to HPUX 10.0");
830 /* Enable reporting of fork events from the kernel. */
831 /* ??rehrauer: For the moment, we're always enabling these events,
832 and just ignoring them if there's no catchpoint to catch them. */
838 child_remove_fork_catchpoint (int pid
)
840 /* This request is only available on HPUX 10.0 and later. */
841 #if !defined(PT_SET_EVENT_MASK)
842 error ("Unable to catch forks prior to HPUX 10.0");
844 /* Disable reporting of fork events from the kernel. */
845 /* ??rehrauer: For the moment, we're always enabling these events,
846 and just ignoring them if there's no catchpoint to catch them. */
852 child_insert_vfork_catchpoint (int pid
)
854 /* This request is only available on HPUX 10.0 and later. */
855 #if !defined(PT_SET_EVENT_MASK)
856 error ("Unable to catch vforks prior to HPUX 10.0");
858 /* Enable reporting of vfork events from the kernel. */
859 /* ??rehrauer: For the moment, we're always enabling these events,
860 and just ignoring them if there's no catchpoint to catch them. */
866 child_remove_vfork_catchpoint (int pid
)
868 /* This request is only available on HPUX 10.0 and later. */
869 #if !defined(PT_SET_EVENT_MASK)
870 error ("Unable to catch vforks prior to HPUX 10.0");
872 /* Disable reporting of vfork events from the kernel. */
873 /* ??rehrauer: For the moment, we're always enabling these events,
874 and just ignoring them if there's no catchpoint to catch them. */
880 child_has_forked (int pid
, int *childpid
)
882 /* This request is only available on HPUX 10.0 and later. */
883 #if !defined(PT_GET_PROCESS_STATE)
888 ptrace_state_t ptrace_state
;
891 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
893 (PTRACE_ARG3_TYPE
) & ptrace_state
,
894 sizeof (ptrace_state
));
896 perror_with_name ("ptrace");
900 if (ptrace_state
.pe_report_event
& PTRACE_FORK
)
902 *childpid
= ptrace_state
.pe_other_pid
;
911 child_has_vforked (int pid
, int *childpid
)
913 /* This request is only available on HPUX 10.0 and later. */
914 #if !defined(PT_GET_PROCESS_STATE)
920 ptrace_state_t ptrace_state
;
923 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
925 (PTRACE_ARG3_TYPE
) & ptrace_state
,
926 sizeof (ptrace_state
));
928 perror_with_name ("ptrace");
932 if (ptrace_state
.pe_report_event
& PTRACE_VFORK
)
934 *childpid
= ptrace_state
.pe_other_pid
;
943 child_can_follow_vfork_prior_to_exec (void)
945 /* ptrace doesn't allow this. */
950 child_insert_exec_catchpoint (int pid
)
952 /* This request is only available on HPUX 10.0 and later. */
953 #if !defined(PT_SET_EVENT_MASK)
954 error ("Unable to catch execs prior to HPUX 10.0");
957 /* Enable reporting of exec events from the kernel. */
958 /* ??rehrauer: For the moment, we're always enabling these events,
959 and just ignoring them if there's no catchpoint to catch them. */
965 child_remove_exec_catchpoint (int pid
)
967 /* This request is only available on HPUX 10.0 and later. */
968 #if !defined(PT_SET_EVENT_MASK)
969 error ("Unable to catch execs prior to HPUX 10.0");
972 /* Disable reporting of exec events from the kernel. */
973 /* ??rehrauer: For the moment, we're always enabling these events,
974 and just ignoring them if there's no catchpoint to catch them. */
980 child_has_execd (int pid
, char **execd_pathname
)
982 /* This request is only available on HPUX 10.0 and later. */
983 #if !defined(PT_GET_PROCESS_STATE)
984 *execd_pathname
= NULL
;
989 ptrace_state_t ptrace_state
;
992 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
994 (PTRACE_ARG3_TYPE
) & ptrace_state
,
995 sizeof (ptrace_state
));
997 perror_with_name ("ptrace");
1001 if (ptrace_state
.pe_report_event
& PTRACE_EXEC
)
1003 char *exec_file
= target_pid_to_exec_file (pid
);
1004 *execd_pathname
= savestring (exec_file
, strlen (exec_file
));
1013 child_reported_exec_events_per_exec_call (void)
1015 return 2; /* ptrace reports the event twice per call. */
1019 child_has_syscall_event (int pid
, enum target_waitkind
*kind
, int *syscall_id
)
1021 /* This request is only available on HPUX 10.30 and later, via
1022 the ttrace interface. */
1024 *kind
= TARGET_WAITKIND_SPURIOUS
;
1030 child_pid_to_exec_file (int pid
)
1032 static char exec_file_buffer
[1024];
1034 CORE_ADDR top_of_stack
;
1038 int saved_inferior_pid
;
1041 #ifdef PT_GET_PROCESS_PATHNAME
1042 /* As of 10.x HP-UX, there's an explicit request to get the pathname. */
1043 pt_status
= call_ptrace (PT_GET_PROCESS_PATHNAME
,
1045 (PTRACE_ARG3_TYPE
) exec_file_buffer
,
1046 sizeof (exec_file_buffer
) - 1);
1048 return exec_file_buffer
;
1051 /* It appears that this request is broken prior to 10.30.
1052 If it fails, try a really, truly amazingly gross hack
1053 that DDE uses, of pawing through the process' data
1054 segment to find the pathname. */
1056 top_of_stack
= 0x7b03a000;
1060 /* On the chance that pid != inferior_pid, set inferior_pid
1061 to pid, so that (grrrr!) implicit uses of inferior_pid get
1064 saved_inferior_pid
= inferior_pid
;
1067 /* Try to grab a null-terminated string. */
1070 if (target_read_memory (top_of_stack
, four_chars
, 4) != 0)
1072 inferior_pid
= saved_inferior_pid
;
1075 for (i
= 0; i
< 4; i
++)
1077 exec_file_buffer
[name_index
++] = four_chars
[i
];
1078 done
= (four_chars
[i
] == '\0');
1085 if (exec_file_buffer
[0] == '\0')
1087 inferior_pid
= saved_inferior_pid
;
1091 inferior_pid
= saved_inferior_pid
;
1092 return exec_file_buffer
;
1096 pre_fork_inferior (void)
1100 status
= pipe (startup_semaphore
.parent_channel
);
1103 warning ("error getting parent pipe for startup semaphore");
1107 status
= pipe (startup_semaphore
.child_channel
);
1110 warning ("error getting child pipe for startup semaphore");
1116 /* Check to see if the given thread is alive.
1118 This is a no-op, as ptrace doesn't support threads, so we just
1122 child_thread_alive (int pid
)
1127 #endif /* ! GDB_NATIVE_HPUX_11 */