1 /* Native support code for HPUX PA-RISC.
2 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1998
3 Free Software Foundation, Inc.
5 Contributed by the Center for Software Science at the
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, Boston, MA 02111-1307, USA. */
28 #include <sys/ptrace.h>
32 extern CORE_ADDR text_end;
34 static void fetch_register PARAMS ((int));
37 fetch_inferior_registers (regno)
41 for (regno = 0; regno < NUM_REGS; regno++)
42 fetch_register (regno);
44 fetch_register (regno);
47 /* Store our register values back into the inferior.
48 If REGNO is -1, do this for all registers.
49 Otherwise, REGNO specifies which register (so we can save time). */
52 store_inferior_registers (regno)
55 register unsigned int regaddr;
57 extern char registers[];
59 unsigned int offset = U_REGS_OFFSET;
64 if (CANNOT_STORE_REGISTER (regno))
66 regaddr = register_addr (regno, offset);
68 if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
70 scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3;
71 call_ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
75 /* Error, even if attached. Failing to write these two
76 registers is pretty serious. */
77 sprintf (buf, "writing register number %d", regno);
78 perror_with_name (buf);
82 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int))
85 call_ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
86 *(int *) ®isters[REGISTER_BYTE (regno) + i]);
89 /* Warning, not error, in case we are attached; sometimes the
90 kernel doesn't let us at the registers. */
91 char *err = safe_strerror (errno);
92 char *msg = alloca (strlen (err) + 128);
93 sprintf (msg, "writing register %s: %s",
94 REGISTER_NAME (regno), err);
98 regaddr += sizeof(int);
102 for (regno = 0; regno < NUM_REGS; regno++)
103 store_inferior_registers (regno);
106 /* Fetch one register. */
109 fetch_register (regno)
112 register unsigned int regaddr;
113 char buf[MAX_REGISTER_RAW_SIZE];
116 /* Offset of registers within the u area. */
119 offset = U_REGS_OFFSET;
121 regaddr = register_addr (regno, offset);
122 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
125 *(int *) &buf[i] = call_ptrace (PT_RUREGS, inferior_pid,
126 (PTRACE_ARG3_TYPE) regaddr, 0);
127 regaddr += sizeof (int);
130 /* Warning, not error, in case we are attached; sometimes the
131 * kernel doesn't let us at the registers.
133 char *err = safe_strerror (errno);
134 char *msg = alloca (strlen (err) + 128);
135 sprintf (msg, "reading register %s: %s", REGISTER_NAME (regno), err);
140 if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
142 supply_register (regno, buf);
146 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
147 to debugger memory starting at MYADDR. Copy to inferior if
150 Returns the length copied, which is either the LEN argument or zero.
151 This xfer function does not do partial moves, since child_ops
152 doesn't allow memory operations to cross below us in the target stack
156 child_xfer_memory (memaddr, myaddr, len, write, target)
161 struct target_ops *target; /* ignored */
164 /* Round starting address down to longword boundary. */
165 register CORE_ADDR addr = memaddr & - sizeof (int);
166 /* Round ending address up; get number of longwords that makes. */
168 = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
170 /* Allocate buffer of that many longwords. */
171 /* Note (RT) - This code formerly used alloca, which I have
172 * replaced with xmalloc and a matching free() at the end.
173 * The problem with alloca() is that there is no guarantee of
174 * when it'll be freed, and we were seeing cases of memory
178 * where the piled-up alloca's for the child_xfer_memory buffers
179 * were not getting freed.
181 register int *buffer = (int *) xmalloc (count * sizeof (int));
185 /* Fill start and end extra bytes of buffer with existing memory data. */
187 if (addr != memaddr || len < (int)sizeof (int)) {
188 /* Need part of initial word -- fetch it. */
189 buffer[0] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
190 inferior_pid, (PTRACE_ARG3_TYPE) addr, 0);
193 if (count > 1) /* FIXME, avoid if even boundary */
196 = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER, inferior_pid,
197 (PTRACE_ARG3_TYPE) (addr + (count - 1) * sizeof (int)),
201 /* Copy data to be written over corresponding part of buffer */
203 memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
205 /* Write the entire buffer. */
207 for (i = 0; i < count; i++, addr += sizeof (int))
211 /* The HP-UX kernel crashes if you use PT_WDUSER to write into the text
212 segment. FIXME -- does it work to write into the data segment using
213 WIUSER, or do these idiots really expect us to figure out which segment
214 the address is in, so we can use a separate system call for it??! */
216 pt_request = (addr < text_end) ? PT_WIUSER : PT_WDUSER;
217 pt_status = call_ptrace (pt_request,
219 (PTRACE_ARG3_TYPE) addr,
222 /* Did we fail? Might we've guessed wrong about which
223 segment this address resides in? Try the other request,
224 and see if that works...
226 if ((pt_status == -1) && errno) {
228 pt_request = (pt_request == PT_WIUSER) ? PT_WDUSER : PT_WIUSER;
229 pt_status = call_ptrace (pt_request,
231 (PTRACE_ARG3_TYPE) addr,
234 /* No, we still fail. Okay, time to punt. */
235 if ((pt_status == -1) && errno)
245 /* Read all the longwords */
246 for (i = 0; i < count; i++, addr += sizeof (int))
249 buffer[i] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
250 inferior_pid, (PTRACE_ARG3_TYPE) addr, 0);
258 /* Copy appropriate bytes out of the buffer. */
259 memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
267 child_post_follow_inferior_by_clone ()
271 /* This function is used when following both the parent and child
272 of a fork. In this case, the debugger clones itself. The original
273 debugger follows the parent, the clone follows the child. The
274 original detaches from the child, delivering a SIGSTOP to it to
275 keep it from running away until the clone can attach itself.
277 At this point, the clone has attached to the child. Because of
278 the SIGSTOP, we must now deliver a SIGCONT to the child, or it
279 won't behave properly. */
280 status = kill (inferior_pid, SIGCONT);
285 child_post_follow_vfork (parent_pid, followed_parent, child_pid, followed_child)
292 /* Are we a debugger that followed the parent of a vfork? If so,
293 then recall that the child's vfork event was delivered to us
294 first. And, that the parent was suspended by the OS until the
295 child's exec or exit events were received.
297 Upon receiving that child vfork, then, we were forced to remove
298 all breakpoints in the child and continue it so that it could
299 reach the exec or exit point.
301 But also recall that the parent and child of a vfork share the
302 same address space. Thus, removing bp's in the child also
303 removed them from the parent.
305 Now that the child has safely exec'd or exited, we must restore
306 the parent's breakpoints before we continue it. Else, we may
307 cause it run past expected stopping points. */
310 reattach_breakpoints (parent_pid);
313 /* Are we a debugger that followed the child of a vfork? If so,
314 then recall that we don't actually acquire control of the child
315 until after it has exec'd or exited.
319 /* If the child has exited, then there's nothing for us to do.
320 In the case of an exec event, we'll let that be handled by
321 the normal mechanism that notices and handles exec events, in
327 /* Format a process id, given a pid. Be sure to terminate
328 * this with a null--it's going to be printed via a "%s".
331 hppa_pid_to_str( pid )
334 static char buf[30]; /* Static because address returned */
336 sprintf( buf, "process %d\0\0\0\0", pid );
337 /* Extra NULLs for paranoia's sake */
342 /* Format a thread id, given a tid. Be sure to terminate
343 * this with a null--it's going to be printed via a "%s".
345 * Note: This is a core-gdb tid, not the actual system tid.
346 * See infttrace.c for details.
349 hppa_tid_to_str( tid )
352 static char buf[30]; /* Static because address returned */
354 sprintf( buf, "system thread %d\0\0\0\0", tid );
355 /* Extra NULLs for paranoia's sake */
360 #if !defined (GDB_NATIVE_HPUX_11)
362 /* The following code is a substitute for the infttrace.c versions used
363 with ttrace() in HPUX 11. */
365 /* This value is an arbitrary integer. */
366 #define PT_VERSION 123456
368 /* This semaphore is used to coordinate the child and parent processes
369 after a fork(), and before an exec() by the child. See
370 parent_attach_all for details. */
373 int parent_channel[2]; /* Parent "talks" to [1], child "listens" to [0] */
374 int child_channel[2]; /* Child "talks" to [1], parent "listens" to [0] */
375 } startup_semaphore_t;
378 #define SEM_LISTEN (0)
380 static startup_semaphore_t startup_semaphore;
382 extern int parent_attach_all PARAMS ((int, PTRACE_ARG3_TYPE, int));
385 /* This function causes the caller's process to be traced by its
386 parent. This is intended to be called after GDB forks itself,
387 and before the child execs the target.
389 Note that HP-UX ptrace is rather funky in how this is done.
390 If the parent wants to get the initial exec event of a child,
391 it must set the ptrace event mask of the child to include execs.
392 (The child cannot do this itself.) This must be done after the
393 child is forked, but before it execs.
395 To coordinate the parent and child, we implement a semaphore using
396 pipes. After SETTRC'ing itself, the child tells the parent that
397 it is now traceable by the parent, and waits for the parent's
398 acknowledgement. The parent can then set the child's event mask,
399 and notify the child that it can now exec.
401 (The acknowledgement by parent happens as a result of a call to
402 child_acknowledge_created_inferior.) */
405 parent_attach_all (pid, addr, data)
407 PTRACE_ARG3_TYPE addr;
412 /* We need a memory home for a constant. */
413 int tc_magic_child = PT_VERSION;
414 int tc_magic_parent = 0;
416 /* The remainder of this function is only useful for HPUX 10.0 and
417 later, as it depends upon the ability to request notification
418 of specific kinds of events by the kernel. */
419 #if defined(PT_SET_EVENT_MASK)
421 /* Notify the parent that we're potentially ready to exec(). */
422 write (startup_semaphore.child_channel[SEM_TALK],
424 sizeof (tc_magic_child));
426 /* Wait for acknowledgement from the parent. */
427 read (startup_semaphore.parent_channel[SEM_LISTEN],
429 sizeof (tc_magic_parent));
430 if (tc_magic_child != tc_magic_parent)
431 warning ("mismatched semaphore magic");
433 /* Discard our copy of the semaphore. */
434 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
435 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
436 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
437 (void) close (startup_semaphore.child_channel[SEM_TALK]);
445 hppa_require_attach (pid)
451 unsigned int regs_offset;
453 /* Are we already attached? There appears to be no explicit way to
454 answer this via ptrace, so we try something which should be
455 innocuous if we are attached. If that fails, then we assume
456 we're not attached, and so attempt to make it so. */
459 regs_offset = U_REGS_OFFSET;
460 pc_addr = register_addr (PC_REGNUM, regs_offset);
461 pc = call_ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE) pc_addr, 0);
466 pt_status = call_ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0);
471 /* Now we really are attached. */
479 hppa_require_detach (pid, signal)
484 call_ptrace (PT_DETACH, pid, (PTRACE_ARG3_TYPE) 1, signal);
485 errno = 0; /* Ignore any errors. */
489 /* Since ptrace doesn't support memory page-protection events, which
490 are used to implement "hardware" watchpoints on HP-UX, these are
491 dummy versions, which perform no useful work. */
494 hppa_enable_page_protection_events (pid)
500 hppa_disable_page_protection_events (pid)
506 hppa_insert_hw_watchpoint (pid, start, len, type)
512 error ("Hardware watchpoints not implemented on this platform.");
516 hppa_remove_hw_watchpoint (pid, start, len, type)
522 error ("Hardware watchpoints not implemented on this platform.");
526 hppa_can_use_hw_watchpoint (type, cnt, ot)
535 hppa_range_profitable_for_hw_watchpoint (pid, start, len)
540 error ("Hardware watchpoints not implemented on this platform.");
544 hppa_pid_or_tid_to_str (id)
547 /* In the ptrace world, there are only processes. */
548 return hppa_pid_to_str (id);
551 /* This function has no meaning in a non-threaded world. Thus, we
552 return 0 (FALSE). See the use of "hppa_prepare_to_proceed" in
556 hppa_switched_threads (pid)
563 hppa_ensure_vforking_parent_remains_stopped (pid)
566 /* This assumes that the vforked parent is presently stopped, and
567 that the vforked child has just delivered its first exec event.
568 Calling kill() this way will cause the SIGTRAP to be delivered as
569 soon as the parent is resumed, which happens as soon as the
570 vforked child is resumed. See wait_for_inferior for the use of
576 hppa_resume_execd_vforking_child_to_get_parent_vfork ()
578 return 1; /* Yes, the child must be resumed. */
581 #if defined(HPPA_GET_PROCESS_EVENTS)
583 hppa_get_process_events (pid, wait_status, must_continue_pid_after)
586 int * must_continue_pid_after;
589 ptrace_state_t ptrace_state;
590 process_event_vector events = PEVT_NONE;
592 /* This is always TRUE with ptrace. */
593 *must_continue_pid_after = 1;
596 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
598 (PTRACE_ARG3_TYPE) &ptrace_state,
599 sizeof (ptrace_state));
601 perror_with_name ("ptrace");
605 if (ptrace_state.pe_report_event & PTRACE_SIGNAL)
606 events |= PEVT_SIGNAL;
607 if (ptrace_state.pe_report_event & PTRACE_FORK)
609 if (ptrace_state.pe_report_event & PTRACE_VFORK)
610 events |= PEVT_VFORK;
611 if (ptrace_state.pe_report_event & PTRACE_EXEC)
613 if (ptrace_state.pe_report_event & PTRACE_EXIT)
618 #endif /* HPPA_GET_PROCESS_EVENTS */
621 require_notification_of_events (pid)
624 #if defined(PT_SET_EVENT_MASK)
626 ptrace_event_t ptrace_events;
628 /* Instruct the kernel as to the set of events we wish to be
629 informed of. (This support does not exist before HPUX 10.0.
630 We'll assume if PT_SET_EVENT_MASK has not been defined by
631 <sys/ptrace.h>, then we're being built on pre-10.0.)
633 memset (&ptrace_events, 0, sizeof (ptrace_events));
635 /* Note: By default, all signals are visible to us. If we wish
636 the kernel to keep certain signals hidden from us, we do it
637 by calling sigdelset (ptrace_events.pe_signals, signal) for
638 each such signal here, before doing PT_SET_EVENT_MASK.
640 sigemptyset (&ptrace_events.pe_signals);
642 ptrace_events.pe_set_event = 0;
644 ptrace_events.pe_set_event |= PTRACE_SIGNAL;
645 ptrace_events.pe_set_event |= PTRACE_EXEC;
646 ptrace_events.pe_set_event |= PTRACE_FORK;
647 ptrace_events.pe_set_event |= PTRACE_VFORK;
648 /* ??rehrauer: Add this one when we're prepared to catch it...
649 ptrace_events.pe_set_event |= PTRACE_EXIT;
653 pt_status = call_ptrace (PT_SET_EVENT_MASK,
655 (PTRACE_ARG3_TYPE) &ptrace_events,
656 sizeof (ptrace_events));
658 perror_with_name ("ptrace");
665 require_notification_of_exec_events (pid)
668 #if defined(PT_SET_EVENT_MASK)
670 ptrace_event_t ptrace_events;
672 /* Instruct the kernel as to the set of events we wish to be
673 informed of. (This support does not exist before HPUX 10.0.
674 We'll assume if PT_SET_EVENT_MASK has not been defined by
675 <sys/ptrace.h>, then we're being built on pre-10.0.)
677 memset (&ptrace_events, 0, sizeof (ptrace_events));
679 /* Note: By default, all signals are visible to us. If we wish
680 the kernel to keep certain signals hidden from us, we do it
681 by calling sigdelset (ptrace_events.pe_signals, signal) for
682 each such signal here, before doing PT_SET_EVENT_MASK.
684 sigemptyset (&ptrace_events.pe_signals);
686 ptrace_events.pe_set_event = 0;
688 ptrace_events.pe_set_event |= PTRACE_EXEC;
689 /* ??rehrauer: Add this one when we're prepared to catch it...
690 ptrace_events.pe_set_event |= PTRACE_EXIT;
694 pt_status = call_ptrace (PT_SET_EVENT_MASK,
696 (PTRACE_ARG3_TYPE) &ptrace_events,
697 sizeof (ptrace_events));
699 perror_with_name ("ptrace");
705 /* This function is called by the parent process, with pid being the
706 ID of the child process, after the debugger has forked. */
709 child_acknowledge_created_inferior (pid)
712 /* We need a memory home for a constant. */
713 int tc_magic_parent = PT_VERSION;
714 int tc_magic_child = 0;
716 /* Wait for the child to tell us that it has forked. */
717 read (startup_semaphore.child_channel[SEM_LISTEN],
719 sizeof(tc_magic_child));
721 /* Notify the child that it can exec.
723 In the infttrace.c variant of this function, we set the child's
724 event mask after the fork but before the exec. In the ptrace
725 world, it seems we can't set the event mask until after the exec. */
727 write (startup_semaphore.parent_channel[SEM_TALK],
729 sizeof (tc_magic_parent));
731 /* We'd better pause a bit before trying to set the event mask,
732 though, to ensure that the exec has happened. We don't want to
733 wait() on the child, because that'll screw up the upper layers
734 of gdb's execution control that expect to see the exec event.
736 After an exec, the child is no longer executing gdb code. Hence,
737 we can't have yet another synchronization via the pipes. We'll
738 just sleep for a second, and hope that's enough delay... */
742 /* Instruct the kernel as to the set of events we wish to be
745 require_notification_of_exec_events (pid);
747 /* Discard our copy of the semaphore. */
748 (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
749 (void) close (startup_semaphore.parent_channel[SEM_TALK]);
750 (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
751 (void) close (startup_semaphore.child_channel[SEM_TALK]);
755 child_post_startup_inferior (pid)
759 require_notification_of_events (pid);
763 child_post_attach (pid)
766 require_notification_of_events (pid);
770 child_insert_fork_catchpoint (pid)
773 /* This request is only available on HPUX 10.0 and later. */
774 #if !defined(PT_SET_EVENT_MASK)
775 error ("Unable to catch forks prior to HPUX 10.0");
777 /* Enable reporting of fork events from the kernel. */
778 /* ??rehrauer: For the moment, we're always enabling these events,
779 and just ignoring them if there's no catchpoint to catch them.
786 child_remove_fork_catchpoint (pid)
789 /* This request is only available on HPUX 10.0 and later. */
790 #if !defined(PT_SET_EVENT_MASK)
791 error ("Unable to catch forks prior to HPUX 10.0");
793 /* Disable reporting of fork events from the kernel. */
794 /* ??rehrauer: For the moment, we're always enabling these events,
795 and just ignoring them if there's no catchpoint to catch them. */
801 child_insert_vfork_catchpoint (pid)
804 /* This request is only available on HPUX 10.0 and later. */
805 #if !defined(PT_SET_EVENT_MASK)
806 error ("Unable to catch vforks prior to HPUX 10.0");
808 /* Enable reporting of vfork events from the kernel. */
809 /* ??rehrauer: For the moment, we're always enabling these events,
810 and just ignoring them if there's no catchpoint to catch them. */
816 child_remove_vfork_catchpoint (pid)
819 /* This request is only available on HPUX 10.0 and later. */
820 #if !defined(PT_SET_EVENT_MASK)
821 error ("Unable to catch vforks prior to HPUX 10.0");
823 /* Disable reporting of vfork events from the kernel. */
824 /* ??rehrauer: For the moment, we're always enabling these events,
825 and just ignoring them if there's no catchpoint to catch them. */
831 child_has_forked (pid, childpid)
835 /* This request is only available on HPUX 10.0 and later. */
836 #if !defined(PT_GET_PROCESS_STATE)
841 ptrace_state_t ptrace_state;
844 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
846 (PTRACE_ARG3_TYPE) &ptrace_state,
847 sizeof (ptrace_state));
849 perror_with_name ("ptrace");
853 if (ptrace_state.pe_report_event & PTRACE_FORK)
855 *childpid = ptrace_state.pe_other_pid;
864 child_has_vforked (pid, childpid)
868 /* This request is only available on HPUX 10.0 and later. */
869 #if !defined(PT_GET_PROCESS_STATE)
875 ptrace_state_t ptrace_state;
878 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
880 (PTRACE_ARG3_TYPE) &ptrace_state,
881 sizeof (ptrace_state));
883 perror_with_name ("ptrace");
887 if (ptrace_state.pe_report_event & PTRACE_VFORK)
889 *childpid = ptrace_state.pe_other_pid;
898 child_can_follow_vfork_prior_to_exec ()
900 /* ptrace doesn't allow this. */
905 child_insert_exec_catchpoint (pid)
908 /* This request is only available on HPUX 10.0 and later.
910 #if !defined(PT_SET_EVENT_MASK)
911 error ("Unable to catch execs prior to HPUX 10.0");
914 /* Enable reporting of exec events from the kernel. */
915 /* ??rehrauer: For the moment, we're always enabling these events,
916 and just ignoring them if there's no catchpoint to catch them.
923 child_remove_exec_catchpoint (pid)
926 /* This request is only available on HPUX 10.0 and later.
928 #if !defined(PT_SET_EVENT_MASK)
929 error ("Unable to catch execs prior to HPUX 10.0");
932 /* Disable reporting of exec events from the kernel. */
933 /* ??rehrauer: For the moment, we're always enabling these events,
934 and just ignoring them if there's no catchpoint to catch them.
941 child_has_execd (pid, execd_pathname)
943 char ** execd_pathname;
946 /* This request is only available on HPUX 10.0 and later.
948 #if !defined(PT_GET_PROCESS_STATE)
949 *execd_pathname = NULL;
954 ptrace_state_t ptrace_state;
957 pt_status = call_ptrace (PT_GET_PROCESS_STATE,
959 (PTRACE_ARG3_TYPE) &ptrace_state,
960 sizeof (ptrace_state));
962 perror_with_name ("ptrace");
966 if (ptrace_state.pe_report_event & PTRACE_EXEC)
968 char * exec_file = target_pid_to_exec_file (pid);
969 *execd_pathname = savestring (exec_file, strlen (exec_file));
978 child_reported_exec_events_per_exec_call ()
980 return 2; /* ptrace reports the event twice per call. */
984 child_has_syscall_event (pid, kind, syscall_id)
986 enum target_waitkind *kind;
989 /* This request is only available on HPUX 10.30 and later, via
990 the ttrace interface. */
992 *kind = TARGET_WAITKIND_SPURIOUS;
998 child_pid_to_exec_file (pid)
1001 static char exec_file_buffer[1024];
1003 CORE_ADDR top_of_stack;
1007 int saved_inferior_pid;
1010 /* As of 10.x HP-UX, there's an explicit request to get the pathname. */
1011 pt_status = call_ptrace (PT_GET_PROCESS_PATHNAME,
1013 (PTRACE_ARG3_TYPE) exec_file_buffer,
1014 sizeof (exec_file_buffer) - 1);
1016 return exec_file_buffer;
1018 /* It appears that this request is broken prior to 10.30.
1019 If it fails, try a really, truly amazingly gross hack
1020 that DDE uses, of pawing through the process' data
1021 segment to find the pathname. */
1023 top_of_stack = 0x7b03a000;
1027 /* On the chance that pid != inferior_pid, set inferior_pid
1028 to pid, so that (grrrr!) implicit uses of inferior_pid get
1031 saved_inferior_pid = inferior_pid;
1034 /* Try to grab a null-terminated string. */
1037 if (target_read_memory (top_of_stack, four_chars, 4) != 0)
1039 inferior_pid = saved_inferior_pid;
1042 for (i = 0; i < 4; i++)
1044 exec_file_buffer[name_index++] = four_chars[i];
1045 done = (four_chars[i] == '\0');
1052 if (exec_file_buffer[0] == '\0')
1054 inferior_pid = saved_inferior_pid;
1058 inferior_pid = saved_inferior_pid;
1059 return exec_file_buffer;
1063 pre_fork_inferior ()
1067 status = pipe (startup_semaphore.parent_channel);
1070 warning ("error getting parent pipe for startup semaphore");
1074 status = pipe (startup_semaphore.child_channel);
1077 warning ("error getting child pipe for startup semaphore");
1083 /* Check to see if the given thread is alive.
1085 This is a no-op, as ptrace doesn't support threads, so we just
1089 child_thread_alive (pid)
1095 #endif /* ! GDB_NATIVE_HPUX_11 */