1 /* Native support code for HPUX PA-RISC.
2 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
4 Free Software Foundation, Inc.
6 Contributed by the Center for Software Science at the
9 This file is part of GDB.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330,
24 Boston, MA 02111-1307, USA. */
30 #include <sys/ptrace.h>
36 extern CORE_ADDR text_end;
38 static void fetch_register (int);
41 fetch_inferior_registers (int regno)
44 for (regno = 0; regno < NUM_REGS; regno++)
45 fetch_register (regno);
47 fetch_register (regno);
50 /* Our own version of the offsetof macro, since we can't assume ANSI C. */
51 #define HPPAH_OFFSETOF(type, member) ((int) (&((type *) 0)->member))
53 /* Store our register values back into the inferior.
54 If REGNO is -1, do this for all registers.
55 Otherwise, REGNO specifies which register (so we can save time). */
58 store_inferior_registers (int 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 (__FILE__, __LINE__,
112 "hppah-nat.c (write_register): unexpected register size");
114 #ifdef GDB_TARGET_IS_HPPA_20W
115 /* Unbelieveable. The PC head and tail must be written in 64bit hunks
116 or we will get an error. Worse yet, the oddball ptrace/ttrace
117 layering will not allow us to perform a 64bit register store.
120 if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM && len == 8)
124 temp = *(CORE_ADDR *)&deprecated_registers[REGISTER_BYTE (regno)];
126 /* Set the priv level (stored in the low two bits of the PC. */
129 ttrace_write_reg_64 (PIDGET (inferior_ptid), (CORE_ADDR)addr,
132 /* If we fail to write the PC, give a true error instead of
136 char *err = safe_strerror (errno);
137 char *msg = alloca (strlen (err) + 128);
138 sprintf (msg, "writing `%s' register: %s",
139 REGISTER_NAME (regno), err);
140 perror_with_name (msg);
145 /* Another crock. HPUX complains if you write a nonzero value to
146 the high part of IPSW. What will it take for HP to catch a
147 clue about building sensible interfaces? */
148 if (regno == IPSW_REGNUM && len == 8)
149 *(int *)&deprecated_registers[REGISTER_BYTE (regno)] = 0;
152 for (i = 0; i < len; i += sizeof (int))
155 call_ptrace (PT_WUREGS, PIDGET (inferior_ptid),
156 (PTRACE_ARG3_TYPE) addr + i,
157 *(int *) &deprecated_registers[REGISTER_BYTE (regno) + i]);
160 /* Warning, not error, in case we are attached; sometimes
161 the kernel doesn't let us at the registers. */
162 char *err = safe_strerror (errno);
163 char *msg = alloca (strlen (err) + 128);
164 sprintf (msg, "writing `%s' register: %s",
165 REGISTER_NAME (regno), err);
166 /* If we fail to write the PC, give a true error instead of
168 if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
169 perror_with_name (msg);
177 for (regno = 0; regno < NUM_REGS; regno++)
178 store_inferior_registers (regno);
182 /* Fetch a register's value from the process's U area. */
184 fetch_register (int regno)
186 char buf[MAX_REGISTER_RAW_SIZE];
187 unsigned int addr, len, offset;
191 len = REGISTER_RAW_SIZE (regno);
193 /* Requests for register zero actually want the save_state's
194 ss_flags member. As RM says: "Oh, what a hack!" */
198 addr = HPPAH_OFFSETOF (save_state_t, ss_flags);
199 len = sizeof (ss.ss_flags);
201 /* Note that ss_flags is always an int, no matter what
202 REGISTER_RAW_SIZE(0) says. Assuming all HP-UX PA machines
203 are big-endian, put it at the least significant end of the
204 value, and zap the rest of the buffer. */
205 offset = REGISTER_RAW_SIZE (0) - len;
206 memset (buf, 0, sizeof (buf));
209 /* Floating-point registers come from the ss_fpblock area. */
210 else if (regno >= FP0_REGNUM)
211 addr = (HPPAH_OFFSETOF (save_state_t, ss_fpblock)
212 + (REGISTER_BYTE (regno) - REGISTER_BYTE (FP0_REGNUM)));
214 /* Wide registers come from the ss_wide area.
215 I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
216 between ss_wide and ss_narrow than to use the raw register size.
217 But checking ss_flags would require an extra ptrace call for
218 every register reference. Bleah. */
220 addr = (HPPAH_OFFSETOF (save_state_t, ss_wide)
221 + REGISTER_BYTE (regno));
223 /* Narrow registers come from the ss_narrow area. Note that
224 ss_narrow starts with gr1, not gr0. */
226 addr = (HPPAH_OFFSETOF (save_state_t, ss_narrow)
227 + (REGISTER_BYTE (regno) - REGISTER_BYTE (1)));
230 internal_error (__FILE__, __LINE__,
231 "hppa-nat.c (fetch_register): unexpected register size");
233 for (i = 0; i < len; i += sizeof (int))
236 /* Copy an int from the U area to buf. Fill the least
237 significant end if len != raw_size. */
238 * (int *) &buf[offset + i] =
239 call_ptrace (PT_RUREGS, PIDGET (inferior_ptid),
240 (PTRACE_ARG3_TYPE) addr + i, 0);
243 /* Warning, not error, in case we are attached; sometimes
244 the kernel doesn't let us at the registers. */
245 char *err = safe_strerror (errno);
246 char *msg = alloca (strlen (err) + 128);
247 sprintf (msg, "reading `%s' register: %s",
248 REGISTER_NAME (regno), err);
254 /* If we're reading an address from the instruction address queue,
255 mask out the bottom two bits --- they contain the privilege
257 if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
258 buf[len - 1] &= ~0x3;
260 supply_register (regno, buf);
264 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
265 to debugger memory starting at MYADDR. Copy to inferior if
268 Returns the length copied, which is either the LEN argument or zero.
269 This xfer function does not do partial moves, since child_ops
270 doesn't allow memory operations to cross below us in the target stack
271 anyway. TARGET is ignored. */
274 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
275 struct mem_attrib *mem,
276 struct target_ops *target)
279 /* Round starting address down to longword boundary. */
280 register CORE_ADDR addr = memaddr & - (CORE_ADDR)(sizeof (int));
281 /* Round ending address up; get number of longwords that makes. */
283 = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
285 /* Allocate buffer of that many longwords.
286 Note -- do not use alloca to allocate this buffer since there is no
287 guarantee of when the buffer will actually be deallocated.
289 This routine can be called over and over with the same call chain;
290 this (in effect) would pile up all those alloca requests until a call
291 to alloca was made from a point higher than this routine in the
293 register int *buffer = (int *) xmalloc (count * sizeof (int));
297 /* Fill start and end extra bytes of buffer with existing memory data. */
298 if (addr != memaddr || len < (int) sizeof (int))
300 /* Need part of initial word -- fetch it. */
301 buffer[0] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
302 PIDGET (inferior_ptid),
303 (PTRACE_ARG3_TYPE) addr, 0);
306 if (count > 1) /* FIXME, avoid if even boundary */
309 = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
310 PIDGET (inferior_ptid),
311 (PTRACE_ARG3_TYPE) (addr
312 + (count - 1) * sizeof (int)),
316 /* Copy data to be written over corresponding part of buffer */
317 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
319 /* Write the entire buffer. */
320 for (i = 0; i < count; i++, addr += sizeof (int))
324 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the
325 text segment. FIXME -- does it work to write into the data
326 segment using WIUSER, or do these idiots really expect us to
327 figure out which segment the address is in, so we can use a
328 separate system call for it??! */
330 pt_request = (addr < text_end) ? PT_WIUSER : PT_WDUSER;
331 pt_status = call_ptrace (pt_request,
332 PIDGET (inferior_ptid),
333 (PTRACE_ARG3_TYPE) addr,
336 /* Did we fail? Might we've guessed wrong about which
337 segment this address resides in? Try the other request,
338 and see if that works... */
339 if ((pt_status == -1) && errno)
342 pt_request = (pt_request == PT_WIUSER) ? PT_WDUSER : PT_WIUSER;
343 pt_status = call_ptrace (pt_request,
344 PIDGET (inferior_ptid),
345 (PTRACE_ARG3_TYPE) addr,
348 /* No, we still fail. Okay, time to punt. */
349 if ((pt_status == -1) && errno)
359 /* Read all the longwords */
360 for (i = 0; i < count; i++, addr += sizeof (int))
363 buffer[i] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
364 PIDGET (inferior_ptid),
365 (PTRACE_ARG3_TYPE) addr, 0);
374 /* Copy appropriate bytes out of the buffer. */
375 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
383 child_post_follow_inferior_by_clone (void)
387 /* This function is used when following both the parent and child
388 of a fork. In this case, the debugger clones itself. The original
389 debugger follows the parent, the clone follows the child. The
390 original detaches from the child, delivering a SIGSTOP to it to
391 keep it from running away until the clone can attach itself.
393 At this point, the clone has attached to the child. Because of
394 the SIGSTOP, we must now deliver a SIGCONT to the child, or it
395 won't behave properly. */
396 status = kill (PIDGET (inferior_ptid), SIGCONT);
401 child_post_follow_vfork (int parent_pid, int followed_parent, int child_pid,
404 /* Are we a debugger that followed the parent of a vfork? If so,
405 then recall that the child's vfork event was delivered to us
406 first. And, that the parent was suspended by the OS until the
407 child's exec or exit events were received.
409 Upon receiving that child vfork, then, we were forced to remove
410 all breakpoints in the child and continue it so that it could
411 reach the exec or exit point.
413 But also recall that the parent and child of a vfork share the
414 same address space. Thus, removing bp's in the child also
415 removed them from the parent.
417 Now that the child has safely exec'd or exited, we must restore
418 the parent's breakpoints before we continue it. Else, we may
419 cause it run past expected stopping points. */
422 reattach_breakpoints (parent_pid);
425 /* Are we a debugger that followed the child of a vfork? If so,
426 then recall that we don't actually acquire control of the child
427 until after it has exec'd or exited. */
430 /* If the child has exited, then there's nothing for us to do.
431 In the case of an exec event, we'll let that be handled by
432 the normal mechanism that notices and handles exec events, in
437 /* Format a process id, given PID. Be sure to terminate
438 this with a null--it's going to be printed via a "%s". */
440 child_pid_to_str (ptid_t ptid)
442 /* Static because address returned */
444 pid_t pid = PIDGET (ptid);
446 /* Extra NUL for paranoia's sake */
447 sprintf (buf, "process %d%c", pid, '\0');
452 /* Format a thread id, given TID. Be sure to terminate
453 this with a null--it's going to be printed via a "%s".
455 Note: This is a core-gdb tid, not the actual system tid.
456 See infttrace.c for details. */
458 hppa_tid_to_str (ptid_t ptid)
460 /* Static because address returned */
462 /* This seems strange, but when I did the ptid conversion, it looked
463 as though a pid was always being passed. - Kevin Buettner */
464 pid_t tid = PIDGET (ptid);
466 /* Extra NULLs for paranoia's sake */
467 sprintf (buf, "system thread %d%c", tid, '\0');
472 #if !defined (GDB_NATIVE_HPUX_11)
474 /* The following code is a substitute for the infttrace.c versions used
475 with ttrace() in HPUX 11. */
477 /* This value is an arbitrary integer. */
478 #define PT_VERSION 123456
480 /* This semaphore is used to coordinate the child and parent processes
481 after a fork(), and before an exec() by the child. See
482 parent_attach_all for details. */
486 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */
487 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */
492 #define SEM_LISTEN (0)
494 static startup_semaphore_t startup_semaphore;
496 extern int parent_attach_all (int, PTRACE_ARG3_TYPE, int);
499 /* This function causes the caller's process to be traced by its
500 parent. This is intended to be called after GDB forks itself,
501 and before the child execs the target.
503 Note that HP-UX ptrace is rather funky in how this is done.
504 If the parent wants to get the initial exec event of a child,
505 it must set the ptrace event mask of the child to include execs.
506 (The child cannot do this itself.) This must be done after the
507 child is forked, but before it execs.
509 To coordinate the parent and child, we implement a semaphore using
510 pipes. After SETTRC'ing itself, the child tells the parent that
511 it is now traceable by the parent, and waits for the parent's
512 acknowledgement. The parent can then set the child's event mask,
513 and notify the child that it can now exec.
515 (The acknowledgement by parent happens as a result of a call to
516 child_acknowledge_created_inferior.) */
519 parent_attach_all (int pid, PTRACE_ARG3_TYPE addr, int data)
523 /* We need a memory home for a constant. */
524 int tc_magic_child = PT_VERSION;
525 int tc_magic_parent = 0;
527 /* The remainder of this function is only useful for HPUX 10.0 and
528 later, as it depends upon the ability to request notification
529 of specific kinds of events by the kernel. */
530 #if defined(PT_SET_EVENT_MASK)
532 /* Notify the parent that we're potentially ready to exec(). */
533 write (startup_semaphore.child_channel[SEM_TALK],
535 sizeof (tc_magic_child));
537 /* Wait for acknowledgement from the parent. */
538 read (startup_semaphore.parent_channel[SEM_LISTEN],
540 sizeof (tc_magic_parent));
541 if (tc_magic_child != tc_magic_parent)
542 warning ("mismatched semaphore magic");
544 /* Discard our copy of the semaphore. */
545 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
546 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
547 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
548 (void) close (startup_semaphore.child_channel[SEM_TALK]);
556 hppa_require_attach (int pid)
561 unsigned int regs_offset;
563 /* Are we already attached? There appears to be no explicit way to
564 answer this via ptrace, so we try something which should be
565 innocuous if we are attached. If that fails, then we assume
566 we're not attached, and so attempt to make it so. */
569 regs_offset = U_REGS_OFFSET;
570 pc_addr = register_addr (PC_REGNUM, regs_offset);
571 pc = call_ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE) pc_addr, 0);
576 pt_status = call_ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0);
581 /* Now we really are attached. */
589 hppa_require_detach (int pid, int signal)
592 call_ptrace (PT_DETACH, pid, (PTRACE_ARG3_TYPE) 1, signal);
593 errno = 0; /* Ignore any errors. */
597 /* Since ptrace doesn't support memory page-protection events, which
598 are used to implement "hardware" watchpoints on HP-UX, these are
599 dummy versions, which perform no useful work. */
602 hppa_enable_page_protection_events (int pid)
607 hppa_disable_page_protection_events (int pid)
612 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
614 error ("Hardware watchpoints not implemented on this platform.");
618 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len,
621 error ("Hardware watchpoints not implemented on this platform.");
625 hppa_can_use_hw_watchpoint (enum bptype type, int cnt, enum bptype ot)
631 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len)
633 error ("Hardware watchpoints not implemented on this platform.");
637 hppa_pid_or_tid_to_str (ptid_t id)
639 /* In the ptrace world, there are only processes. */
640 return child_pid_to_str (id);
643 /* This function has no meaning in a non-threaded world. Thus, we
644 return 0 (FALSE). See the use of "hppa_prepare_to_proceed" in
648 hppa_switched_threads (pid_t pid)
654 hppa_ensure_vforking_parent_remains_stopped (int pid)
656 /* This assumes that the vforked parent is presently stopped, and
657 that the vforked child has just delivered its first exec event.
658 Calling kill() this way will cause the SIGTRAP to be delivered as
659 soon as the parent is resumed, which happens as soon as the
660 vforked child is resumed. See wait_for_inferior for the use of
666 hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
668 return 1; /* Yes, the child must be resumed. */
672 require_notification_of_events (int pid)
674 #if defined(PT_SET_EVENT_MASK)
676 ptrace_event_t ptrace_events;
680 /* Instruct the kernel as to the set of events we wish to be
681 informed of. (This support does not exist before HPUX 10.0.
682 We'll assume if PT_SET_EVENT_MASK has not been defined by
683 <sys/ptrace.h>, then we're being built on pre-10.0.) */
684 memset (&ptrace_events, 0, sizeof (ptrace_events));
686 /* Note: By default, all signals are visible to us. If we wish
687 the kernel to keep certain signals hidden from us, we do it
688 by calling sigdelset (ptrace_events.pe_signals, signal) for
689 each such signal here, before doing PT_SET_EVENT_MASK. */
690 /* RM: The above comment is no longer true. We start with ignoring
691 all signals, and then add the ones we are interested in. We could
692 do it the other way: start by looking at all signals and then
693 deleting the ones that we aren't interested in, except that
694 multiple gdb signals may be mapped to the same host signal
695 (eg. TARGET_SIGNAL_IO and TARGET_SIGNAL_POLL both get mapped to
696 signal 22 on HPUX 10.20) We want to be notified if we are
697 interested in either signal. */
698 sigfillset (&ptrace_events.pe_signals);
700 /* RM: Let's not bother with signals we don't care about */
701 nsigs = (int) TARGET_SIGNAL_LAST;
702 for (signum = nsigs; signum > 0; signum--)
704 if ((signal_stop_state (signum)) ||
705 (signal_print_state (signum)) ||
706 (!signal_pass_state (signum)))
708 if (target_signal_to_host_p (signum))
709 sigdelset (&ptrace_events.pe_signals,
710 target_signal_to_host (signum));
714 ptrace_events.pe_set_event = 0;
716 ptrace_events.pe_set_event |= PTRACE_SIGNAL;
717 ptrace_events.pe_set_event |= PTRACE_EXEC;
718 ptrace_events.pe_set_event |= PTRACE_FORK;
719 ptrace_events.pe_set_event |= PTRACE_VFORK;
720 /* ??rehrauer: Add this one when we're prepared to catch it...
721 ptrace_events.pe_set_event |= PTRACE_EXIT;
725 pt_status = call_ptrace (PT_SET_EVENT_MASK,
727 (PTRACE_ARG3_TYPE) & ptrace_events,
728 sizeof (ptrace_events));
730 perror_with_name ("ptrace");
737 require_notification_of_exec_events (int pid)
739 #if defined(PT_SET_EVENT_MASK)
741 ptrace_event_t ptrace_events;
743 /* Instruct the kernel as to the set of events we wish to be
744 informed of. (This support does not exist before HPUX 10.0.
745 We'll assume if PT_SET_EVENT_MASK has not been defined by
746 <sys/ptrace.h>, then we're being built on pre-10.0.) */
747 memset (&ptrace_events, 0, sizeof (ptrace_events));
749 /* Note: By default, all signals are visible to us. If we wish
750 the kernel to keep certain signals hidden from us, we do it
751 by calling sigdelset (ptrace_events.pe_signals, signal) for
752 each such signal here, before doing PT_SET_EVENT_MASK. */
753 sigemptyset (&ptrace_events.pe_signals);
755 ptrace_events.pe_set_event = 0;
757 ptrace_events.pe_set_event |= PTRACE_EXEC;
758 /* ??rehrauer: Add this one when we're prepared to catch it...
759 ptrace_events.pe_set_event |= PTRACE_EXIT;
763 pt_status = call_ptrace (PT_SET_EVENT_MASK,
765 (PTRACE_ARG3_TYPE) & ptrace_events,
766 sizeof (ptrace_events));
768 perror_with_name ("ptrace");
774 /* This function is called by the parent process, with pid being the
775 ID of the child process, after the debugger has forked. */
778 child_acknowledge_created_inferior (int pid)
780 /* We need a memory home for a constant. */
781 int tc_magic_parent = PT_VERSION;
782 int tc_magic_child = 0;
784 /* The remainder of this function is only useful for HPUX 10.0 and
785 later, as it depends upon the ability to request notification
786 of specific kinds of events by the kernel. */
787 #if defined(PT_SET_EVENT_MASK)
788 /* Wait for the child to tell us that it has forked. */
789 read (startup_semaphore.child_channel[SEM_LISTEN],
791 sizeof (tc_magic_child));
793 /* Notify the child that it can exec.
795 In the infttrace.c variant of this function, we set the child's
796 event mask after the fork but before the exec. In the ptrace
797 world, it seems we can't set the event mask until after the exec. */
798 write (startup_semaphore.parent_channel[SEM_TALK],
800 sizeof (tc_magic_parent));
802 /* We'd better pause a bit before trying to set the event mask,
803 though, to ensure that the exec has happened. We don't want to
804 wait() on the child, because that'll screw up the upper layers
805 of gdb's execution control that expect to see the exec event.
807 After an exec, the child is no longer executing gdb code. Hence,
808 we can't have yet another synchronization via the pipes. We'll
809 just sleep for a second, and hope that's enough delay... */
812 /* Instruct the kernel as to the set of events we wish to be
814 require_notification_of_exec_events (pid);
816 /* Discard our copy of the semaphore. */
817 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
818 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
819 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
820 (void) close (startup_semaphore.child_channel[SEM_TALK]);
825 child_post_startup_inferior (ptid_t ptid)
827 require_notification_of_events (PIDGET (ptid));
831 child_post_attach (int pid)
833 require_notification_of_events (pid);
837 child_insert_fork_catchpoint (int pid)
839 /* This request is only available on HPUX 10.0 and later. */
840 #if !defined(PT_SET_EVENT_MASK)
841 error ("Unable to catch forks prior to HPUX 10.0");
843 /* Enable reporting of fork events from the kernel. */
844 /* ??rehrauer: For the moment, we're always enabling these events,
845 and just ignoring them if there's no catchpoint to catch them. */
851 child_remove_fork_catchpoint (int 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 (int pid)
867 /* This request is only available on HPUX 10.0 and later. */
868 #if !defined(PT_SET_EVENT_MASK)
869 error ("Unable to catch vforks prior to HPUX 10.0");
871 /* Enable reporting of vfork events from the kernel. */
872 /* ??rehrauer: For the moment, we're always enabling these events,
873 and just ignoring them if there's no catchpoint to catch them. */
879 child_remove_vfork_catchpoint (int pid)
881 /* This request is only available on HPUX 10.0 and later. */
882 #if !defined(PT_SET_EVENT_MASK)
883 error ("Unable to catch vforks prior to HPUX 10.0");
885 /* Disable reporting of vfork events from the kernel. */
886 /* ??rehrauer: For the moment, we're always enabling these events,
887 and just ignoring them if there's no catchpoint to catch them. */
893 child_has_forked (int pid, int *childpid)
895 /* This request is only available on HPUX 10.0 and later. */
896 #if !defined(PT_GET_PROCESS_STATE)
901 ptrace_state_t ptrace_state;
904 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
906 (PTRACE_ARG3_TYPE) & ptrace_state,
907 sizeof (ptrace_state));
909 perror_with_name ("ptrace");
913 if (ptrace_state.pe_report_event & PTRACE_FORK)
915 *childpid = ptrace_state.pe_other_pid;
924 child_has_vforked (int pid, int *childpid)
926 /* This request is only available on HPUX 10.0 and later. */
927 #if !defined(PT_GET_PROCESS_STATE)
933 ptrace_state_t ptrace_state;
936 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
938 (PTRACE_ARG3_TYPE) & ptrace_state,
939 sizeof (ptrace_state));
941 perror_with_name ("ptrace");
945 if (ptrace_state.pe_report_event & PTRACE_VFORK)
947 *childpid = ptrace_state.pe_other_pid;
956 child_can_follow_vfork_prior_to_exec (void)
958 /* ptrace doesn't allow this. */
963 child_insert_exec_catchpoint (int pid)
965 /* This request is only available on HPUX 10.0 and later. */
966 #if !defined(PT_SET_EVENT_MASK)
967 error ("Unable to catch execs prior to HPUX 10.0");
970 /* Enable reporting of exec events from the kernel. */
971 /* ??rehrauer: For the moment, we're always enabling these events,
972 and just ignoring them if there's no catchpoint to catch them. */
978 child_remove_exec_catchpoint (int pid)
980 /* This request is only available on HPUX 10.0 and later. */
981 #if !defined(PT_SET_EVENT_MASK)
982 error ("Unable to catch execs prior to HPUX 10.0");
985 /* Disable reporting of exec events from the kernel. */
986 /* ??rehrauer: For the moment, we're always enabling these events,
987 and just ignoring them if there's no catchpoint to catch them. */
993 child_has_execd (int pid, char **execd_pathname)
995 /* This request is only available on HPUX 10.0 and later. */
996 #if !defined(PT_GET_PROCESS_STATE)
997 *execd_pathname = NULL;
1002 ptrace_state_t ptrace_state;
1005 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
1007 (PTRACE_ARG3_TYPE) & ptrace_state,
1008 sizeof (ptrace_state));
1010 perror_with_name ("ptrace");
1014 if (ptrace_state.pe_report_event & PTRACE_EXEC)
1016 char *exec_file = target_pid_to_exec_file (pid);
1017 *execd_pathname = savestring (exec_file, strlen (exec_file));
1026 child_reported_exec_events_per_exec_call (void)
1028 return 2; /* ptrace reports the event twice per call. */
1032 child_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id)
1034 /* This request is only available on HPUX 10.30 and later, via
1035 the ttrace interface. */
1037 *kind = TARGET_WAITKIND_SPURIOUS;
1043 child_pid_to_exec_file (int pid)
1045 static char exec_file_buffer[1024];
1047 CORE_ADDR top_of_stack;
1051 ptid_t saved_inferior_ptid;
1054 #ifdef PT_GET_PROCESS_PATHNAME
1055 /* As of 10.x HP-UX, there's an explicit request to get the pathname. */
1056 pt_status = call_ptrace (PT_GET_PROCESS_PATHNAME,
1058 (PTRACE_ARG3_TYPE) exec_file_buffer,
1059 sizeof (exec_file_buffer) - 1);
1061 return exec_file_buffer;
1064 /* It appears that this request is broken prior to 10.30.
1065 If it fails, try a really, truly amazingly gross hack
1066 that DDE uses, of pawing through the process' data
1067 segment to find the pathname. */
1069 top_of_stack = 0x7b03a000;
1073 /* On the chance that pid != inferior_ptid, set inferior_ptid
1074 to pid, so that (grrrr!) implicit uses of inferior_ptid get
1077 saved_inferior_ptid = inferior_ptid;
1078 inferior_ptid = pid_to_ptid (pid);
1080 /* Try to grab a null-terminated string. */
1083 if (target_read_memory (top_of_stack, four_chars, 4) != 0)
1085 inferior_ptid = saved_inferior_ptid;
1088 for (i = 0; i < 4; i++)
1090 exec_file_buffer[name_index++] = four_chars[i];
1091 done = (four_chars[i] == '\0');
1098 if (exec_file_buffer[0] == '\0')
1100 inferior_ptid = saved_inferior_ptid;
1104 inferior_ptid = saved_inferior_ptid;
1105 return exec_file_buffer;
1109 pre_fork_inferior (void)
1113 status = pipe (startup_semaphore.parent_channel);
1116 warning ("error getting parent pipe for startup semaphore");
1120 status = pipe (startup_semaphore.child_channel);
1123 warning ("error getting child pipe for startup semaphore");
1129 /* Check to see if the given thread is alive.
1131 This is a no-op, as ptrace doesn't support threads, so we just
1135 child_thread_alive (ptid_t ptid)
1140 #endif /* ! GDB_NATIVE_HPUX_11 */