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
PARAMS ((int));
39 fetch_inferior_registers (regno
)
43 for (regno
= 0; regno
< NUM_REGS
; regno
++)
44 fetch_register (regno
);
46 fetch_register (regno
);
49 /* Our own version of the offsetof macro, since we can't assume ANSI C. */
50 #define HPPAH_OFFSETOF(type, member) ((int) (&((type *) 0)->member))
52 /* Store our register values back into the inferior.
53 If REGNO is -1, do this for all registers.
54 Otherwise, REGNO specifies which register (so we can save time). */
57 store_inferior_registers (regno
)
60 register unsigned int regaddr
;
63 unsigned int offset
= U_REGS_OFFSET
;
68 unsigned int addr
, len
, offset
;
70 if (CANNOT_STORE_REGISTER (regno
))
74 len
= REGISTER_RAW_SIZE (regno
);
76 /* Requests for register zero actually want the save_state's
77 ss_flags member. As RM says: "Oh, what a hack!" */
81 addr
= HPPAH_OFFSETOF (save_state_t
, ss_flags
);
82 len
= sizeof (ss
.ss_flags
);
84 /* Note that ss_flags is always an int, no matter what
85 REGISTER_RAW_SIZE(0) says. Assuming all HP-UX PA machines
86 are big-endian, put it at the least significant end of the
87 value, and zap the rest of the buffer. */
88 offset
= REGISTER_RAW_SIZE (0) - len
;
91 /* Floating-point registers come from the ss_fpblock area. */
92 else if (regno
>= FP0_REGNUM
)
93 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_fpblock
)
94 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (FP0_REGNUM
)));
96 /* Wide registers come from the ss_wide area.
97 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
98 between ss_wide and ss_narrow than to use the raw register size.
99 But checking ss_flags would require an extra ptrace call for
100 every register reference. Bleah. */
102 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_wide
)
103 + REGISTER_BYTE (regno
));
105 /* Narrow registers come from the ss_narrow area. Note that
106 ss_narrow starts with gr1, not gr0. */
108 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_narrow
)
109 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (1)));
111 internal_error ("hppah-nat.c (write_register): unexpected register size");
113 #ifdef GDB_TARGET_IS_HPPA_20W
114 /* Unbelieveable. The PC head and tail must be written in 64bit hunks
115 or we will get an error. Worse yet, the oddball ptrace/ttrace
116 layering will not allow us to perform a 64bit register store.
119 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
&& len
== 8)
123 temp
= *(CORE_ADDR
*)®isters
[REGISTER_BYTE (regno
)];
125 /* Set the priv level (stored in the low two bits of the PC. */
128 ttrace_write_reg_64 (inferior_pid
, (CORE_ADDR
)addr
, (CORE_ADDR
)&temp
);
130 /* If we fail to write the PC, give a true error instead of
134 char *err
= safe_strerror (errno
);
135 char *msg
= alloca (strlen (err
) + 128);
136 sprintf (msg
, "writing `%s' register: %s",
137 REGISTER_NAME (regno
), err
);
138 perror_with_name (msg
);
144 for (i
= 0; i
< len
; i
+= sizeof (int))
147 call_ptrace (PT_WUREGS
, inferior_pid
, (PTRACE_ARG3_TYPE
) addr
+ i
,
148 *(int *) ®isters
[REGISTER_BYTE (regno
) + i
]);
151 /* Warning, not error, in case we are attached; sometimes
152 the kernel doesn't let us at the registers. */
153 char *err
= safe_strerror (errno
);
154 char *msg
= alloca (strlen (err
) + 128);
155 sprintf (msg
, "reading `%s' register: %s",
156 REGISTER_NAME (regno
), err
);
157 /* If we fail to write the PC, give a true error instead of
159 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
)
160 perror_with_name (msg
);
168 for (regno
= 0; regno
< NUM_REGS
; regno
++)
169 store_inferior_registers (regno
);
173 /* Fetch a register's value from the process's U area. */
175 fetch_register (regno
)
178 char buf
[MAX_REGISTER_RAW_SIZE
];
179 unsigned int addr
, len
, offset
;
183 len
= REGISTER_RAW_SIZE (regno
);
185 /* Requests for register zero actually want the save_state's
186 ss_flags member. As RM says: "Oh, what a hack!" */
190 addr
= HPPAH_OFFSETOF (save_state_t
, ss_flags
);
191 len
= sizeof (ss
.ss_flags
);
193 /* Note that ss_flags is always an int, no matter what
194 REGISTER_RAW_SIZE(0) says. Assuming all HP-UX PA machines
195 are big-endian, put it at the least significant end of the
196 value, and zap the rest of the buffer. */
197 offset
= REGISTER_RAW_SIZE (0) - len
;
198 memset (buf
, 0, sizeof (buf
));
201 /* Floating-point registers come from the ss_fpblock area. */
202 else if (regno
>= FP0_REGNUM
)
203 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_fpblock
)
204 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (FP0_REGNUM
)));
206 /* Wide registers come from the ss_wide area.
207 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
208 between ss_wide and ss_narrow than to use the raw register size.
209 But checking ss_flags would require an extra ptrace call for
210 every register reference. Bleah. */
212 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_wide
)
213 + REGISTER_BYTE (regno
));
215 /* Narrow registers come from the ss_narrow area. Note that
216 ss_narrow starts with gr1, not gr0. */
218 addr
= (HPPAH_OFFSETOF (save_state_t
, ss_narrow
)
219 + (REGISTER_BYTE (regno
) - REGISTER_BYTE (1)));
222 internal_error ("hppa-nat.c (fetch_register): unexpected register size");
224 for (i
= 0; i
< len
; i
+= sizeof (int))
227 /* Copy an int from the U area to buf. Fill the least
228 significant end if len != raw_size. */
229 * (int *) &buf
[offset
+ i
] =
230 call_ptrace (PT_RUREGS
, inferior_pid
,
231 (PTRACE_ARG3_TYPE
) addr
+ i
, 0);
234 /* Warning, not error, in case we are attached; sometimes
235 the kernel doesn't let us at the registers. */
236 char *err
= safe_strerror (errno
);
237 char *msg
= alloca (strlen (err
) + 128);
238 sprintf (msg
, "reading `%s' register: %s",
239 REGISTER_NAME (regno
), err
);
245 /* If we're reading an address from the instruction address queue,
246 mask out the bottom two bits --- they contain the privilege
248 if (regno
== PCOQ_HEAD_REGNUM
|| regno
== PCOQ_TAIL_REGNUM
)
249 buf
[len
- 1] &= ~0x3;
251 supply_register (regno
, buf
);
255 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
256 to debugger memory starting at MYADDR. Copy to inferior if
259 Returns the length copied, which is either the LEN argument or zero.
260 This xfer function does not do partial moves, since child_ops
261 doesn't allow memory operations to cross below us in the target stack
265 child_xfer_memory (memaddr
, myaddr
, len
, write
, target
)
270 struct target_ops
*target
; /* ignored */
273 /* Round starting address down to longword boundary. */
274 register CORE_ADDR addr
= memaddr
& - (CORE_ADDR
)(sizeof (int));
275 /* Round ending address up; get number of longwords that makes. */
277 = (((memaddr
+ len
) - addr
) + sizeof (int) - 1) / sizeof (int);
279 /* Allocate buffer of that many longwords.
280 Note -- do not use alloca to allocate this buffer since there is no
281 guarantee of when the buffer will actually be deallocated.
283 This routine can be called over and over with the same call chain;
284 this (in effect) would pile up all those alloca requests until a call
285 to alloca was made from a point higher than this routine in the
287 register int *buffer
= (int *) xmalloc (count
* sizeof (int));
291 /* Fill start and end extra bytes of buffer with existing memory data. */
292 if (addr
!= memaddr
|| len
< (int) sizeof (int))
294 /* Need part of initial word -- fetch it. */
295 buffer
[0] = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
296 inferior_pid
, (PTRACE_ARG3_TYPE
) addr
, 0);
299 if (count
> 1) /* FIXME, avoid if even boundary */
302 = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
304 (PTRACE_ARG3_TYPE
) (addr
305 + (count
- 1) * sizeof (int)),
309 /* Copy data to be written over corresponding part of buffer */
310 memcpy ((char *) buffer
+ (memaddr
& (sizeof (int) - 1)), myaddr
, len
);
312 /* Write the entire buffer. */
313 for (i
= 0; i
< count
; i
++, addr
+= sizeof (int))
317 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the
318 text segment. FIXME -- does it work to write into the data
319 segment using WIUSER, or do these idiots really expect us to
320 figure out which segment the address is in, so we can use a
321 separate system call for it??! */
323 pt_request
= (addr
< text_end
) ? PT_WIUSER
: PT_WDUSER
;
324 pt_status
= call_ptrace (pt_request
,
326 (PTRACE_ARG3_TYPE
) addr
,
329 /* Did we fail? Might we've guessed wrong about which
330 segment this address resides in? Try the other request,
331 and see if that works... */
332 if ((pt_status
== -1) && errno
)
335 pt_request
= (pt_request
== PT_WIUSER
) ? PT_WDUSER
: PT_WIUSER
;
336 pt_status
= call_ptrace (pt_request
,
338 (PTRACE_ARG3_TYPE
) addr
,
341 /* No, we still fail. Okay, time to punt. */
342 if ((pt_status
== -1) && errno
)
352 /* Read all the longwords */
353 for (i
= 0; i
< count
; i
++, addr
+= sizeof (int))
356 buffer
[i
] = call_ptrace (addr
< text_end
? PT_RIUSER
: PT_RDUSER
,
357 inferior_pid
, (PTRACE_ARG3_TYPE
) addr
, 0);
366 /* Copy appropriate bytes out of the buffer. */
367 memcpy (myaddr
, (char *) buffer
+ (memaddr
& (sizeof (int) - 1)), len
);
375 child_post_follow_inferior_by_clone ()
379 /* This function is used when following both the parent and child
380 of a fork. In this case, the debugger clones itself. The original
381 debugger follows the parent, the clone follows the child. The
382 original detaches from the child, delivering a SIGSTOP to it to
383 keep it from running away until the clone can attach itself.
385 At this point, the clone has attached to the child. Because of
386 the SIGSTOP, we must now deliver a SIGCONT to the child, or it
387 won't behave properly. */
388 status
= kill (inferior_pid
, SIGCONT
);
393 child_post_follow_vfork (parent_pid
, followed_parent
, child_pid
, followed_child
)
399 /* Are we a debugger that followed the parent of a vfork? If so,
400 then recall that the child's vfork event was delivered to us
401 first. And, that the parent was suspended by the OS until the
402 child's exec or exit events were received.
404 Upon receiving that child vfork, then, we were forced to remove
405 all breakpoints in the child and continue it so that it could
406 reach the exec or exit point.
408 But also recall that the parent and child of a vfork share the
409 same address space. Thus, removing bp's in the child also
410 removed them from the parent.
412 Now that the child has safely exec'd or exited, we must restore
413 the parent's breakpoints before we continue it. Else, we may
414 cause it run past expected stopping points. */
417 reattach_breakpoints (parent_pid
);
420 /* Are we a debugger that followed the child of a vfork? If so,
421 then recall that we don't actually acquire control of the child
422 until after it has exec'd or exited. */
425 /* If the child has exited, then there's nothing for us to do.
426 In the case of an exec event, we'll let that be handled by
427 the normal mechanism that notices and handles exec events, in
432 /* Format a process id, given PID. Be sure to terminate
433 this with a null--it's going to be printed via a "%s". */
435 hppa_pid_to_str (pid
)
438 /* Static because address returned */
441 /* Extra NULLs for paranoia's sake */
442 sprintf (buf
, "process %d\0\0\0\0", pid
);
447 /* Format a thread id, given TID. Be sure to terminate
448 this with a null--it's going to be printed via a "%s".
450 Note: This is a core-gdb tid, not the actual system tid.
451 See infttrace.c for details. */
453 hppa_tid_to_str (tid
)
456 /* Static because address returned */
459 /* Extra NULLs for paranoia's sake */
460 sprintf (buf
, "system thread %d\0\0\0\0", tid
);
465 #if !defined (GDB_NATIVE_HPUX_11)
467 /* The following code is a substitute for the infttrace.c versions used
468 with ttrace() in HPUX 11. */
470 /* This value is an arbitrary integer. */
471 #define PT_VERSION 123456
473 /* This semaphore is used to coordinate the child and parent processes
474 after a fork(), and before an exec() by the child. See
475 parent_attach_all for details. */
479 int parent_channel
[2]; /* Parent "talks" to [1], child "listens" to [0] */
480 int child_channel
[2]; /* Child "talks" to [1], parent "listens" to [0] */
485 #define SEM_LISTEN (0)
487 static startup_semaphore_t startup_semaphore
;
489 extern int parent_attach_all
PARAMS ((int, PTRACE_ARG3_TYPE
, int));
492 /* This function causes the caller's process to be traced by its
493 parent. This is intended to be called after GDB forks itself,
494 and before the child execs the target.
496 Note that HP-UX ptrace is rather funky in how this is done.
497 If the parent wants to get the initial exec event of a child,
498 it must set the ptrace event mask of the child to include execs.
499 (The child cannot do this itself.) This must be done after the
500 child is forked, but before it execs.
502 To coordinate the parent and child, we implement a semaphore using
503 pipes. After SETTRC'ing itself, the child tells the parent that
504 it is now traceable by the parent, and waits for the parent's
505 acknowledgement. The parent can then set the child's event mask,
506 and notify the child that it can now exec.
508 (The acknowledgement by parent happens as a result of a call to
509 child_acknowledge_created_inferior.) */
512 parent_attach_all (pid
, addr
, data
)
514 PTRACE_ARG3_TYPE addr
;
519 /* We need a memory home for a constant. */
520 int tc_magic_child
= PT_VERSION
;
521 int tc_magic_parent
= 0;
523 /* The remainder of this function is only useful for HPUX 10.0 and
524 later, as it depends upon the ability to request notification
525 of specific kinds of events by the kernel. */
526 #if defined(PT_SET_EVENT_MASK)
528 /* Notify the parent that we're potentially ready to exec(). */
529 write (startup_semaphore
.child_channel
[SEM_TALK
],
531 sizeof (tc_magic_child
));
533 /* Wait for acknowledgement from the parent. */
534 read (startup_semaphore
.parent_channel
[SEM_LISTEN
],
536 sizeof (tc_magic_parent
));
537 if (tc_magic_child
!= tc_magic_parent
)
538 warning ("mismatched semaphore magic");
540 /* Discard our copy of the semaphore. */
541 (void) close (startup_semaphore
.parent_channel
[SEM_LISTEN
]);
542 (void) close (startup_semaphore
.parent_channel
[SEM_TALK
]);
543 (void) close (startup_semaphore
.child_channel
[SEM_LISTEN
]);
544 (void) close (startup_semaphore
.child_channel
[SEM_TALK
]);
552 hppa_require_attach (pid
)
558 unsigned int regs_offset
;
560 /* Are we already attached? There appears to be no explicit way to
561 answer this via ptrace, so we try something which should be
562 innocuous if we are attached. If that fails, then we assume
563 we're not attached, and so attempt to make it so. */
566 regs_offset
= U_REGS_OFFSET
;
567 pc_addr
= register_addr (PC_REGNUM
, regs_offset
);
568 pc
= call_ptrace (PT_READ_U
, pid
, (PTRACE_ARG3_TYPE
) pc_addr
, 0);
573 pt_status
= call_ptrace (PT_ATTACH
, pid
, (PTRACE_ARG3_TYPE
) 0, 0);
578 /* Now we really are attached. */
586 hppa_require_detach (pid
, signal
)
591 call_ptrace (PT_DETACH
, pid
, (PTRACE_ARG3_TYPE
) 1, signal
);
592 errno
= 0; /* Ignore any errors. */
596 /* Since ptrace doesn't support memory page-protection events, which
597 are used to implement "hardware" watchpoints on HP-UX, these are
598 dummy versions, which perform no useful work. */
601 hppa_enable_page_protection_events (pid
)
607 hppa_disable_page_protection_events (pid
)
613 hppa_insert_hw_watchpoint (pid
, start
, len
, type
)
619 error ("Hardware watchpoints not implemented on this platform.");
623 hppa_remove_hw_watchpoint (pid
, start
, len
, type
)
629 error ("Hardware watchpoints not implemented on this platform.");
633 hppa_can_use_hw_watchpoint (type
, cnt
, ot
)
642 hppa_range_profitable_for_hw_watchpoint (pid
, start
, len
)
647 error ("Hardware watchpoints not implemented on this platform.");
651 hppa_pid_or_tid_to_str (id
)
654 /* In the ptrace world, there are only processes. */
655 return hppa_pid_to_str (id
);
658 /* This function has no meaning in a non-threaded world. Thus, we
659 return 0 (FALSE). See the use of "hppa_prepare_to_proceed" in
663 hppa_switched_threads (pid
)
670 hppa_ensure_vforking_parent_remains_stopped (pid
)
673 /* This assumes that the vforked parent is presently stopped, and
674 that the vforked child has just delivered its first exec event.
675 Calling kill() this way will cause the SIGTRAP to be delivered as
676 soon as the parent is resumed, which happens as soon as the
677 vforked child is resumed. See wait_for_inferior for the use of
683 hppa_resume_execd_vforking_child_to_get_parent_vfork ()
685 return 1; /* Yes, the child must be resumed. */
689 require_notification_of_events (pid
)
692 #if defined(PT_SET_EVENT_MASK)
694 ptrace_event_t ptrace_events
;
696 /* Instruct the kernel as to the set of events we wish to be
697 informed of. (This support does not exist before HPUX 10.0.
698 We'll assume if PT_SET_EVENT_MASK has not been defined by
699 <sys/ptrace.h>, then we're being built on pre-10.0.) */
700 memset (&ptrace_events
, 0, sizeof (ptrace_events
));
702 /* Note: By default, all signals are visible to us. If we wish
703 the kernel to keep certain signals hidden from us, we do it
704 by calling sigdelset (ptrace_events.pe_signals, signal) for
705 each such signal here, before doing PT_SET_EVENT_MASK. */
706 sigemptyset (&ptrace_events
.pe_signals
);
708 ptrace_events
.pe_set_event
= 0;
710 ptrace_events
.pe_set_event
|= PTRACE_SIGNAL
;
711 ptrace_events
.pe_set_event
|= PTRACE_EXEC
;
712 ptrace_events
.pe_set_event
|= PTRACE_FORK
;
713 ptrace_events
.pe_set_event
|= PTRACE_VFORK
;
714 /* ??rehrauer: Add this one when we're prepared to catch it...
715 ptrace_events.pe_set_event |= PTRACE_EXIT;
719 pt_status
= call_ptrace (PT_SET_EVENT_MASK
,
721 (PTRACE_ARG3_TYPE
) & ptrace_events
,
722 sizeof (ptrace_events
));
724 perror_with_name ("ptrace");
731 require_notification_of_exec_events (pid
)
734 #if defined(PT_SET_EVENT_MASK)
736 ptrace_event_t ptrace_events
;
738 /* Instruct the kernel as to the set of events we wish to be
739 informed of. (This support does not exist before HPUX 10.0.
740 We'll assume if PT_SET_EVENT_MASK has not been defined by
741 <sys/ptrace.h>, then we're being built on pre-10.0.) */
742 memset (&ptrace_events
, 0, sizeof (ptrace_events
));
744 /* Note: By default, all signals are visible to us. If we wish
745 the kernel to keep certain signals hidden from us, we do it
746 by calling sigdelset (ptrace_events.pe_signals, signal) for
747 each such signal here, before doing PT_SET_EVENT_MASK. */
748 sigemptyset (&ptrace_events
.pe_signals
);
750 ptrace_events
.pe_set_event
= 0;
752 ptrace_events
.pe_set_event
|= PTRACE_EXEC
;
753 /* ??rehrauer: Add this one when we're prepared to catch it...
754 ptrace_events.pe_set_event |= PTRACE_EXIT;
758 pt_status
= call_ptrace (PT_SET_EVENT_MASK
,
760 (PTRACE_ARG3_TYPE
) & ptrace_events
,
761 sizeof (ptrace_events
));
763 perror_with_name ("ptrace");
769 /* This function is called by the parent process, with pid being the
770 ID of the child process, after the debugger has forked. */
773 child_acknowledge_created_inferior (pid
)
776 /* We need a memory home for a constant. */
777 int tc_magic_parent
= PT_VERSION
;
778 int tc_magic_child
= 0;
780 /* The remainder of this function is only useful for HPUX 10.0 and
781 later, as it depends upon the ability to request notification
782 of specific kinds of events by the kernel. */
783 #if defined(PT_SET_EVENT_MASK)
784 /* Wait for the child to tell us that it has forked. */
785 read (startup_semaphore
.child_channel
[SEM_LISTEN
],
787 sizeof (tc_magic_child
));
789 /* Notify the child that it can exec.
791 In the infttrace.c variant of this function, we set the child's
792 event mask after the fork but before the exec. In the ptrace
793 world, it seems we can't set the event mask until after the exec. */
794 write (startup_semaphore
.parent_channel
[SEM_TALK
],
796 sizeof (tc_magic_parent
));
798 /* We'd better pause a bit before trying to set the event mask,
799 though, to ensure that the exec has happened. We don't want to
800 wait() on the child, because that'll screw up the upper layers
801 of gdb's execution control that expect to see the exec event.
803 After an exec, the child is no longer executing gdb code. Hence,
804 we can't have yet another synchronization via the pipes. We'll
805 just sleep for a second, and hope that's enough delay... */
808 /* Instruct the kernel as to the set of events we wish to be
810 require_notification_of_exec_events (pid
);
812 /* Discard our copy of the semaphore. */
813 (void) close (startup_semaphore
.parent_channel
[SEM_LISTEN
]);
814 (void) close (startup_semaphore
.parent_channel
[SEM_TALK
]);
815 (void) close (startup_semaphore
.child_channel
[SEM_LISTEN
]);
816 (void) close (startup_semaphore
.child_channel
[SEM_TALK
]);
821 child_post_startup_inferior (pid
)
824 require_notification_of_events (pid
);
828 child_post_attach (pid
)
831 require_notification_of_events (pid
);
835 child_insert_fork_catchpoint (pid
)
838 /* This request is only available on HPUX 10.0 and later. */
839 #if !defined(PT_SET_EVENT_MASK)
840 error ("Unable to catch forks prior to HPUX 10.0");
842 /* Enable reporting of fork events from the kernel. */
843 /* ??rehrauer: For the moment, we're always enabling these events,
844 and just ignoring them if there's no catchpoint to catch them. */
850 child_remove_fork_catchpoint (pid
)
853 /* This request is only available on HPUX 10.0 and later. */
854 #if !defined(PT_SET_EVENT_MASK)
855 error ("Unable to catch forks prior to HPUX 10.0");
857 /* Disable reporting of fork events from the kernel. */
858 /* ??rehrauer: For the moment, we're always enabling these events,
859 and just ignoring them if there's no catchpoint to catch them. */
865 child_insert_vfork_catchpoint (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 /* Enable 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_remove_vfork_catchpoint (pid
)
883 /* This request is only available on HPUX 10.0 and later. */
884 #if !defined(PT_SET_EVENT_MASK)
885 error ("Unable to catch vforks prior to HPUX 10.0");
887 /* Disable reporting of vfork events from the kernel. */
888 /* ??rehrauer: For the moment, we're always enabling these events,
889 and just ignoring them if there's no catchpoint to catch them. */
895 child_has_forked (pid
, childpid
)
899 /* This request is only available on HPUX 10.0 and later. */
900 #if !defined(PT_GET_PROCESS_STATE)
905 ptrace_state_t ptrace_state
;
908 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
910 (PTRACE_ARG3_TYPE
) & ptrace_state
,
911 sizeof (ptrace_state
));
913 perror_with_name ("ptrace");
917 if (ptrace_state
.pe_report_event
& PTRACE_FORK
)
919 *childpid
= ptrace_state
.pe_other_pid
;
928 child_has_vforked (pid
, childpid
)
932 /* This request is only available on HPUX 10.0 and later. */
933 #if !defined(PT_GET_PROCESS_STATE)
939 ptrace_state_t ptrace_state
;
942 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
944 (PTRACE_ARG3_TYPE
) & ptrace_state
,
945 sizeof (ptrace_state
));
947 perror_with_name ("ptrace");
951 if (ptrace_state
.pe_report_event
& PTRACE_VFORK
)
953 *childpid
= ptrace_state
.pe_other_pid
;
962 child_can_follow_vfork_prior_to_exec ()
964 /* ptrace doesn't allow this. */
969 child_insert_exec_catchpoint (pid
)
972 /* This request is only available on HPUX 10.0 and later. */
973 #if !defined(PT_SET_EVENT_MASK)
974 error ("Unable to catch execs prior to HPUX 10.0");
977 /* Enable reporting of exec events from the kernel. */
978 /* ??rehrauer: For the moment, we're always enabling these events,
979 and just ignoring them if there's no catchpoint to catch them. */
985 child_remove_exec_catchpoint (pid
)
988 /* This request is only available on HPUX 10.0 and later. */
989 #if !defined(PT_SET_EVENT_MASK)
990 error ("Unable to catch execs prior to HPUX 10.0");
993 /* Disable reporting of exec events from the kernel. */
994 /* ??rehrauer: For the moment, we're always enabling these events,
995 and just ignoring them if there's no catchpoint to catch them. */
1001 child_has_execd (pid
, execd_pathname
)
1003 char **execd_pathname
;
1005 /* This request is only available on HPUX 10.0 and later. */
1006 #if !defined(PT_GET_PROCESS_STATE)
1007 *execd_pathname
= NULL
;
1012 ptrace_state_t ptrace_state
;
1015 pt_status
= call_ptrace (PT_GET_PROCESS_STATE
,
1017 (PTRACE_ARG3_TYPE
) & ptrace_state
,
1018 sizeof (ptrace_state
));
1020 perror_with_name ("ptrace");
1024 if (ptrace_state
.pe_report_event
& PTRACE_EXEC
)
1026 char *exec_file
= target_pid_to_exec_file (pid
);
1027 *execd_pathname
= savestring (exec_file
, strlen (exec_file
));
1036 child_reported_exec_events_per_exec_call ()
1038 return 2; /* ptrace reports the event twice per call. */
1042 child_has_syscall_event (pid
, kind
, syscall_id
)
1044 enum target_waitkind
*kind
;
1047 /* This request is only available on HPUX 10.30 and later, via
1048 the ttrace interface. */
1050 *kind
= TARGET_WAITKIND_SPURIOUS
;
1056 child_pid_to_exec_file (pid
)
1059 static char exec_file_buffer
[1024];
1061 CORE_ADDR top_of_stack
;
1065 int saved_inferior_pid
;
1068 #ifdef PT_GET_PROCESS_PATHNAME
1069 /* As of 10.x HP-UX, there's an explicit request to get the pathname. */
1070 pt_status
= call_ptrace (PT_GET_PROCESS_PATHNAME
,
1072 (PTRACE_ARG3_TYPE
) exec_file_buffer
,
1073 sizeof (exec_file_buffer
) - 1);
1075 return exec_file_buffer
;
1078 /* It appears that this request is broken prior to 10.30.
1079 If it fails, try a really, truly amazingly gross hack
1080 that DDE uses, of pawing through the process' data
1081 segment to find the pathname. */
1083 top_of_stack
= 0x7b03a000;
1087 /* On the chance that pid != inferior_pid, set inferior_pid
1088 to pid, so that (grrrr!) implicit uses of inferior_pid get
1091 saved_inferior_pid
= inferior_pid
;
1094 /* Try to grab a null-terminated string. */
1097 if (target_read_memory (top_of_stack
, four_chars
, 4) != 0)
1099 inferior_pid
= saved_inferior_pid
;
1102 for (i
= 0; i
< 4; i
++)
1104 exec_file_buffer
[name_index
++] = four_chars
[i
];
1105 done
= (four_chars
[i
] == '\0');
1112 if (exec_file_buffer
[0] == '\0')
1114 inferior_pid
= saved_inferior_pid
;
1118 inferior_pid
= saved_inferior_pid
;
1119 return exec_file_buffer
;
1123 pre_fork_inferior ()
1127 status
= pipe (startup_semaphore
.parent_channel
);
1130 warning ("error getting parent pipe for startup semaphore");
1134 status
= pipe (startup_semaphore
.child_channel
);
1137 warning ("error getting child pipe for startup semaphore");
1143 /* Check to see if the given thread is alive.
1145 This is a no-op, as ptrace doesn't support threads, so we just
1149 child_thread_alive (pid
)
1155 #endif /* ! GDB_NATIVE_HPUX_11 */