]> Git Repo - binutils.git/blob - gdb/hppah-nat.c
*** empty log message ***
[binutils.git] / gdb / hppah-nat.c
1 /* Native support code for HPUX PA-RISC.
2    Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
3    1998, 1999, 2000, 2001
4    Free Software Foundation, Inc.
5
6    Contributed by the Center for Software Science at the
7    University of Utah ([email protected]).
8
9    This file is part of GDB.
10
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.
15
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.
20
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.  */
25
26
27 #include "defs.h"
28 #include "inferior.h"
29 #include "target.h"
30 #include <sys/ptrace.h>
31 #include "gdbcore.h"
32 #include "gdb_wait.h"
33 #include "regcache.h"
34 #include <signal.h>
35
36 extern CORE_ADDR text_end;
37
38 extern int hpux_has_forked (int pid, int *childpid);
39 extern int hpux_has_vforked (int pid, int *childpid);
40 extern int hpux_has_execd (int pid, char **execd_pathname);
41 extern int hpux_has_syscall_event (int pid, enum target_waitkind *kind,
42                                    int *syscall_id);
43
44 static void fetch_register (int);
45
46 void
47 fetch_inferior_registers (int regno)
48 {
49   if (regno == -1)
50     for (regno = 0; regno < NUM_REGS; regno++)
51       fetch_register (regno);
52   else
53     fetch_register (regno);
54 }
55
56 /* Our own version of the offsetof macro, since we can't assume ANSI C.  */
57 #define HPPAH_OFFSETOF(type, member) ((int) (&((type *) 0)->member))
58
59 /* Store our register values back into the inferior.
60    If REGNO is -1, do this for all registers.
61    Otherwise, REGNO specifies which register (so we can save time).  */
62
63 void
64 store_inferior_registers (int regno)
65 {
66   register unsigned int regaddr;
67   char buf[80];
68   register int i;
69   unsigned int offset = U_REGS_OFFSET;
70   int scratch;
71
72   if (regno >= 0)
73     {
74       unsigned int addr, len, offset;
75
76       if (CANNOT_STORE_REGISTER (regno))
77         return;
78
79       offset = 0;
80       len = REGISTER_RAW_SIZE (regno);
81
82       /* Requests for register zero actually want the save_state's
83          ss_flags member.  As RM says: "Oh, what a hack!"  */
84       if (regno == 0)
85         {
86           save_state_t ss;
87           addr = HPPAH_OFFSETOF (save_state_t, ss_flags);
88           len = sizeof (ss.ss_flags);
89
90           /* Note that ss_flags is always an int, no matter what
91              REGISTER_RAW_SIZE(0) says.  Assuming all HP-UX PA machines
92              are big-endian, put it at the least significant end of the
93              value, and zap the rest of the buffer.  */
94           offset = REGISTER_RAW_SIZE (0) - len;
95         }
96
97       /* Floating-point registers come from the ss_fpblock area.  */
98       else if (regno >= FP0_REGNUM)
99         addr = (HPPAH_OFFSETOF (save_state_t, ss_fpblock) 
100                 + (REGISTER_BYTE (regno) - REGISTER_BYTE (FP0_REGNUM)));
101
102       /* Wide registers come from the ss_wide area.
103          I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
104          between ss_wide and ss_narrow than to use the raw register size.
105          But checking ss_flags would require an extra ptrace call for
106          every register reference.  Bleah.  */
107       else if (len == 8)
108         addr = (HPPAH_OFFSETOF (save_state_t, ss_wide) 
109                 + REGISTER_BYTE (regno));
110
111       /* Narrow registers come from the ss_narrow area.  Note that
112          ss_narrow starts with gr1, not gr0.  */
113       else if (len == 4)
114         addr = (HPPAH_OFFSETOF (save_state_t, ss_narrow)
115                 + (REGISTER_BYTE (regno) - REGISTER_BYTE (1)));
116       else
117         internal_error (__FILE__, __LINE__,
118                         "hppah-nat.c (write_register): unexpected register size");
119
120 #ifdef GDB_TARGET_IS_HPPA_20W
121       /* Unbelieveable.  The PC head and tail must be written in 64bit hunks
122          or we will get an error.  Worse yet, the oddball ptrace/ttrace
123          layering will not allow us to perform a 64bit register store.
124
125          What a crock.  */
126       if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM && len == 8)
127         {
128           CORE_ADDR temp;
129
130           temp = *(CORE_ADDR *)&deprecated_registers[REGISTER_BYTE (regno)];
131
132           /* Set the priv level (stored in the low two bits of the PC.  */
133           temp |= 0x3;
134
135           ttrace_write_reg_64 (PIDGET (inferior_ptid), (CORE_ADDR)addr,
136                                (CORE_ADDR)&temp);
137
138           /* If we fail to write the PC, give a true error instead of
139              just a warning.  */
140           if (errno != 0)
141             {
142               char *err = safe_strerror (errno);
143               char *msg = alloca (strlen (err) + 128);
144               sprintf (msg, "writing `%s' register: %s",
145                         REGISTER_NAME (regno), err);
146               perror_with_name (msg);
147             }
148           return;
149         }
150
151       /* Another crock.  HPUX complains if you write a nonzero value to
152          the high part of IPSW.  What will it take for HP to catch a
153          clue about building sensible interfaces?  */
154      if (regno == IPSW_REGNUM && len == 8)
155         *(int *)&deprecated_registers[REGISTER_BYTE (regno)] = 0;
156 #endif
157
158       for (i = 0; i < len; i += sizeof (int))
159         {
160           errno = 0;
161           call_ptrace (PT_WUREGS, PIDGET (inferior_ptid),
162                        (PTRACE_ARG3_TYPE) addr + i,
163                        *(int *) &deprecated_registers[REGISTER_BYTE (regno) + i]);
164           if (errno != 0)
165             {
166               /* Warning, not error, in case we are attached; sometimes
167                  the kernel doesn't let us at the registers. */
168               char *err = safe_strerror (errno);
169               char *msg = alloca (strlen (err) + 128);
170               sprintf (msg, "writing `%s' register: %s",
171                         REGISTER_NAME (regno), err);
172               /* If we fail to write the PC, give a true error instead of
173                  just a warning.  */
174               if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
175                 perror_with_name (msg);
176               else
177                 warning (msg);
178               return;
179             }
180         }
181     }
182   else
183     for (regno = 0; regno < NUM_REGS; regno++)
184       store_inferior_registers (regno);
185 }
186
187
188 /* Fetch a register's value from the process's U area.  */
189 static void
190 fetch_register (int regno)
191 {
192   char buf[MAX_REGISTER_RAW_SIZE];
193   unsigned int addr, len, offset;
194   int i;
195
196   offset = 0;
197   len = REGISTER_RAW_SIZE (regno);
198
199   /* Requests for register zero actually want the save_state's
200      ss_flags member.  As RM says: "Oh, what a hack!"  */
201   if (regno == 0)
202     {
203       save_state_t ss;
204       addr = HPPAH_OFFSETOF (save_state_t, ss_flags);
205       len = sizeof (ss.ss_flags);
206
207       /* Note that ss_flags is always an int, no matter what
208          REGISTER_RAW_SIZE(0) says.  Assuming all HP-UX PA machines
209          are big-endian, put it at the least significant end of the
210          value, and zap the rest of the buffer.  */
211       offset = REGISTER_RAW_SIZE (0) - len;
212       memset (buf, 0, sizeof (buf));
213     }
214
215   /* Floating-point registers come from the ss_fpblock area.  */
216   else if (regno >= FP0_REGNUM)
217     addr = (HPPAH_OFFSETOF (save_state_t, ss_fpblock) 
218             + (REGISTER_BYTE (regno) - REGISTER_BYTE (FP0_REGNUM)));
219
220   /* Wide registers come from the ss_wide area.
221      I think it's more PC to test (ss_flags & SS_WIDEREGS) to select
222      between ss_wide and ss_narrow than to use the raw register size.
223      But checking ss_flags would require an extra ptrace call for
224      every register reference.  Bleah.  */
225   else if (len == 8)
226     addr = (HPPAH_OFFSETOF (save_state_t, ss_wide) 
227             + REGISTER_BYTE (regno));
228
229   /* Narrow registers come from the ss_narrow area.  Note that
230      ss_narrow starts with gr1, not gr0.  */
231   else if (len == 4)
232     addr = (HPPAH_OFFSETOF (save_state_t, ss_narrow)
233             + (REGISTER_BYTE (regno) - REGISTER_BYTE (1)));
234
235   else
236     internal_error (__FILE__, __LINE__,
237                     "hppa-nat.c (fetch_register): unexpected register size");
238
239   for (i = 0; i < len; i += sizeof (int))
240     {
241       errno = 0;
242       /* Copy an int from the U area to buf.  Fill the least
243          significant end if len != raw_size.  */
244       * (int *) &buf[offset + i] =
245           call_ptrace (PT_RUREGS, PIDGET (inferior_ptid),
246                        (PTRACE_ARG3_TYPE) addr + i, 0);
247       if (errno != 0)
248         {
249           /* Warning, not error, in case we are attached; sometimes
250              the kernel doesn't let us at the registers. */
251           char *err = safe_strerror (errno);
252           char *msg = alloca (strlen (err) + 128);
253           sprintf (msg, "reading `%s' register: %s",
254                    REGISTER_NAME (regno), err);
255           warning (msg);
256           return;
257         }
258     }
259
260   /* If we're reading an address from the instruction address queue,
261      mask out the bottom two bits --- they contain the privilege
262      level.  */
263   if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM)
264     buf[len - 1] &= ~0x3;
265
266   supply_register (regno, buf);
267 }
268
269
270 /* Copy LEN bytes to or from inferior's memory starting at MEMADDR
271    to debugger memory starting at MYADDR.   Copy to inferior if
272    WRITE is nonzero.
273
274    Returns the length copied, which is either the LEN argument or zero.
275    This xfer function does not do partial moves, since child_ops
276    doesn't allow memory operations to cross below us in the target stack
277    anyway.  TARGET is ignored.  */
278
279 int
280 child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
281                    struct mem_attrib *mem,
282                    struct target_ops *target)
283 {
284   register int i;
285   /* Round starting address down to longword boundary.  */
286   register CORE_ADDR addr = memaddr & - (CORE_ADDR)(sizeof (int));
287   /* Round ending address up; get number of longwords that makes.  */
288   register int count
289   = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
290
291   /* Allocate buffer of that many longwords.
292      Note -- do not use alloca to allocate this buffer since there is no
293      guarantee of when the buffer will actually be deallocated.
294
295      This routine can be called over and over with the same call chain;
296      this (in effect) would pile up all those alloca requests until a call
297      to alloca was made from a point higher than this routine in the
298      call chain.  */
299   register int *buffer = (int *) xmalloc (count * sizeof (int));
300
301   if (write)
302     {
303       /* Fill start and end extra bytes of buffer with existing memory data.  */
304       if (addr != memaddr || len < (int) sizeof (int))
305         {
306           /* Need part of initial word -- fetch it.  */
307           buffer[0] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
308                                    PIDGET (inferior_ptid),
309                                    (PTRACE_ARG3_TYPE) addr, 0);
310         }
311
312       if (count > 1)            /* FIXME, avoid if even boundary */
313         {
314           buffer[count - 1]
315             = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
316                            PIDGET (inferior_ptid),
317                            (PTRACE_ARG3_TYPE) (addr
318                                                + (count - 1) * sizeof (int)),
319                            0);
320         }
321
322       /* Copy data to be written over corresponding part of buffer */
323       memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
324
325       /* Write the entire buffer.  */
326       for (i = 0; i < count; i++, addr += sizeof (int))
327         {
328           int pt_status;
329           int pt_request;
330           /* The HP-UX kernel crashes if you use PT_WDUSER to write into the
331              text segment.  FIXME -- does it work to write into the data
332              segment using WIUSER, or do these idiots really expect us to
333              figure out which segment the address is in, so we can use a
334              separate system call for it??!  */
335           errno = 0;
336           pt_request = (addr < text_end) ? PT_WIUSER : PT_WDUSER;
337           pt_status = call_ptrace (pt_request,
338                                    PIDGET (inferior_ptid),
339                                    (PTRACE_ARG3_TYPE) addr,
340                                    buffer[i]);
341
342           /* Did we fail?  Might we've guessed wrong about which
343              segment this address resides in?  Try the other request,
344              and see if that works...  */
345           if ((pt_status == -1) && errno)
346             {
347               errno = 0;
348               pt_request = (pt_request == PT_WIUSER) ? PT_WDUSER : PT_WIUSER;
349               pt_status = call_ptrace (pt_request,
350                                        PIDGET (inferior_ptid),
351                                        (PTRACE_ARG3_TYPE) addr,
352                                        buffer[i]);
353
354               /* No, we still fail.  Okay, time to punt. */
355               if ((pt_status == -1) && errno)
356                 {
357                   xfree (buffer);
358                   return 0;
359                 }
360             }
361         }
362     }
363   else
364     {
365       /* Read all the longwords */
366       for (i = 0; i < count; i++, addr += sizeof (int))
367         {
368           errno = 0;
369           buffer[i] = call_ptrace (addr < text_end ? PT_RIUSER : PT_RDUSER,
370                                    PIDGET (inferior_ptid),
371                                    (PTRACE_ARG3_TYPE) addr, 0);
372           if (errno)
373             {
374               xfree (buffer);
375               return 0;
376             }
377           QUIT;
378         }
379
380       /* Copy appropriate bytes out of the buffer.  */
381       memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
382     }
383   xfree (buffer);
384   return len;
385 }
386
387 char *saved_child_execd_pathname = NULL;
388 int saved_vfork_pid;
389 enum {
390   STATE_NONE,
391   STATE_GOT_CHILD,
392   STATE_GOT_EXEC,
393   STATE_GOT_PARENT,
394   STATE_FAKE_EXEC
395 } saved_vfork_state = STATE_NONE;
396
397 int
398 child_follow_fork (int follow_child)
399 {
400   ptid_t last_ptid;
401   struct target_waitstatus last_status;
402   int has_vforked;
403   int parent_pid, child_pid;
404
405   get_last_target_status (&last_ptid, &last_status);
406   has_vforked = (last_status.kind == TARGET_WAITKIND_VFORKED);
407   parent_pid = ptid_get_pid (last_ptid);
408   child_pid = last_status.value.related_pid;
409
410   /* At this point, if we are vforking, breakpoints were already
411      detached from the child in child_wait; and the child has already
412      called execve().  If we are forking, both the parent and child
413      have breakpoints inserted.  */
414
415   if (! follow_child)
416     {
417       if (! has_vforked)
418         {
419           detach_breakpoints (child_pid);
420 #ifdef SOLIB_REMOVE_INFERIOR_HOOK
421           SOLIB_REMOVE_INFERIOR_HOOK (child_pid);
422 #endif
423         }
424
425       /* Detach from the child. */
426       printf_unfiltered ("Detaching after fork from %s\n",
427                          target_pid_to_str (pid_to_ptid (child_pid)));
428       hppa_require_detach (child_pid, 0);
429
430       /* The parent and child of a vfork share the same address space.
431          Also, on some targets the order in which vfork and exec events
432          are received for parent in child requires some delicate handling
433          of the events.
434
435          For instance, on ptrace-based HPUX we receive the child's vfork
436          event first, at which time the parent has been suspended by the
437          OS and is essentially untouchable until the child's exit or second
438          exec event arrives.  At that time, the parent's vfork event is
439          delivered to us, and that's when we see and decide how to follow
440          the vfork.  But to get to that point, we must continue the child
441          until it execs or exits.  To do that smoothly, all breakpoints
442          must be removed from the child, in case there are any set between
443          the vfork() and exec() calls.  But removing them from the child
444          also removes them from the parent, due to the shared-address-space
445          nature of a vfork'd parent and child.  On HPUX, therefore, we must
446          take care to restore the bp's to the parent before we continue it.
447          Else, it's likely that we may not stop in the expected place.  (The
448          worst scenario is when the user tries to step over a vfork() call;
449          the step-resume bp must be restored for the step to properly stop
450          in the parent after the call completes!)
451
452          Sequence of events, as reported to gdb from HPUX:
453
454          Parent        Child           Action for gdb to take
455          -------------------------------------------------------
456          1                VFORK               Continue child
457          2                EXEC
458          3                EXEC or EXIT
459          4  VFORK
460
461          Now that the child has safely exec'd or exited, we must restore
462          the parent's breakpoints before we continue it.  Else, we may
463          cause it run past expected stopping points.  */
464
465       if (has_vforked)
466         reattach_breakpoints (parent_pid);
467     }
468   else
469     {
470       /* Needed to keep the breakpoint lists in sync.  */
471       if (! has_vforked)
472         detach_breakpoints (child_pid);
473
474       /* Before detaching from the parent, remove all breakpoints from it. */
475       remove_breakpoints ();
476
477       /* Also reset the solib inferior hook from the parent. */
478 #ifdef SOLIB_REMOVE_INFERIOR_HOOK
479       SOLIB_REMOVE_INFERIOR_HOOK (PIDGET (inferior_ptid));
480 #endif
481
482       /* Detach from the parent. */
483       target_detach (NULL, 1);
484
485       /* Attach to the child. */
486       printf_unfiltered ("Attaching after fork to %s\n",
487                          target_pid_to_str (pid_to_ptid (child_pid)));
488       hppa_require_attach (child_pid);
489       inferior_ptid = pid_to_ptid (child_pid);
490
491       /* If we vforked, then we've also execed by now.  The exec will be
492          reported momentarily.  follow_exec () will handle breakpoints, so
493          we don't have to..  */
494       if (!has_vforked)
495         follow_inferior_reset_breakpoints ();
496     }
497
498   if (has_vforked)
499     {
500       /* If we followed the parent, don't try to follow the child's exec.  */
501       if (saved_vfork_state != STATE_GOT_PARENT
502           && saved_vfork_state != STATE_FAKE_EXEC)
503         fprintf_unfiltered (gdb_stdout,
504                             "hppa: post follow vfork: confused state\n");
505
506       if (! follow_child || saved_vfork_state == STATE_GOT_PARENT)
507         saved_vfork_state = STATE_NONE;
508       else
509         return 1;
510     }
511   return 0;
512 }
513
514 /* Format a process id, given PID.  Be sure to terminate
515    this with a null--it's going to be printed via a "%s".  */
516 char *
517 child_pid_to_str (ptid_t ptid)
518 {
519   /* Static because address returned */
520   static char buf[30];
521   pid_t pid = PIDGET (ptid);
522
523   /* Extra NUL for paranoia's sake */
524   sprintf (buf, "process %d%c", pid, '\0');
525
526   return buf;
527 }
528
529 /* Format a thread id, given TID.  Be sure to terminate
530    this with a null--it's going to be printed via a "%s".
531
532    Note: This is a core-gdb tid, not the actual system tid.
533    See infttrace.c for details.  */
534 char *
535 hppa_tid_to_str (ptid_t ptid)
536 {
537   /* Static because address returned */
538   static char buf[30];
539   /* This seems strange, but when I did the ptid conversion, it looked
540      as though a pid was always being passed.  - Kevin Buettner  */
541   pid_t tid = PIDGET (ptid);
542
543   /* Extra NULLs for paranoia's sake */
544   sprintf (buf, "system thread %d%c", tid, '\0');
545
546   return buf;
547 }
548
549 /*## */
550 /* Enable HACK for ttrace work.  In
551  * infttrace.c/require_notification_of_events,
552  * this is set to 0 so that the loop in child_wait
553  * won't loop.
554  */
555 int not_same_real_pid = 1;
556 /*## */
557
558 /* Wait for child to do something.  Return pid of child, or -1 in case
559    of error; store status through argument pointer OURSTATUS.  */
560
561 ptid_t
562 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
563 {
564   int save_errno;
565   int status;
566   char *execd_pathname = NULL;
567   int exit_status;
568   int related_pid;
569   int syscall_id;
570   enum target_waitkind kind;
571   int pid;
572
573   if (saved_vfork_state == STATE_FAKE_EXEC)
574     {
575       saved_vfork_state = STATE_NONE;
576       ourstatus->kind = TARGET_WAITKIND_EXECD;
577       ourstatus->value.execd_pathname = saved_child_execd_pathname;
578       return inferior_ptid;
579     }
580
581   do
582     {
583       set_sigint_trap ();       /* Causes SIGINT to be passed on to the
584                                    attached process. */
585       set_sigio_trap ();
586
587       pid = ptrace_wait (inferior_ptid, &status);
588
589       save_errno = errno;
590
591       clear_sigio_trap ();
592
593       clear_sigint_trap ();
594
595       if (pid == -1)
596         {
597           if (save_errno == EINTR)
598             continue;
599
600           fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
601                               safe_strerror (save_errno));
602
603           /* Claim it exited with unknown signal.  */
604           ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
605           ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
606           return pid_to_ptid (-1);
607         }
608
609       /* Did it exit?
610        */
611       if (target_has_exited (pid, status, &exit_status))
612         {
613           /* ??rehrauer: For now, ignore this. */
614           continue;
615         }
616
617       if (!target_thread_alive (pid_to_ptid (pid)))
618         {
619           ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
620           return pid_to_ptid (pid);
621         }
622
623       if (hpux_has_forked (pid, &related_pid))
624         {
625           /* Ignore the parent's fork event.  */
626           if (pid == PIDGET (inferior_ptid))
627             {
628               ourstatus->kind = TARGET_WAITKIND_IGNORE;
629               return inferior_ptid;
630             }
631
632           /* If this is the child's fork event, report that the
633              process has forked.  */
634           if (related_pid == PIDGET (inferior_ptid))
635             {
636               ourstatus->kind = TARGET_WAITKIND_FORKED;
637               ourstatus->value.related_pid = pid;
638               return inferior_ptid;
639             }
640         }
641
642       if (hpux_has_vforked (pid, &related_pid))
643         {
644           if (pid == PIDGET (inferior_ptid))
645             {
646               if (saved_vfork_state == STATE_GOT_CHILD)
647                 saved_vfork_state = STATE_GOT_PARENT;
648               else if (saved_vfork_state == STATE_GOT_EXEC)
649                 saved_vfork_state = STATE_FAKE_EXEC;
650               else
651                 fprintf_unfiltered (gdb_stdout,
652                                     "hppah: parent vfork: confused\n");
653             }
654           else if (related_pid == PIDGET (inferior_ptid))
655             {
656               if (saved_vfork_state == STATE_NONE)
657                 saved_vfork_state = STATE_GOT_CHILD;
658               else
659                 fprintf_unfiltered (gdb_stdout,
660                                     "hppah: child vfork: confused\n");
661             }
662           else
663             fprintf_unfiltered (gdb_stdout,
664                                 "hppah: unknown vfork: confused\n");
665
666           if (saved_vfork_state == STATE_GOT_CHILD)
667             {
668               child_post_startup_inferior (pid_to_ptid (pid));
669               detach_breakpoints (pid);
670 #ifdef SOLIB_REMOVE_INFERIOR_HOOK
671               SOLIB_REMOVE_INFERIOR_HOOK (pid);
672 #endif
673               child_resume (pid_to_ptid (pid), 0, TARGET_SIGNAL_0);
674               ourstatus->kind = TARGET_WAITKIND_IGNORE;
675               return pid_to_ptid (related_pid);
676             }
677           else if (saved_vfork_state == STATE_FAKE_EXEC)
678             {
679               ourstatus->kind = TARGET_WAITKIND_VFORKED;
680               ourstatus->value.related_pid = related_pid;
681               return pid_to_ptid (pid);
682             }
683           else
684             {
685               /* We saw the parent's vfork, but we haven't seen the exec yet.
686                  Wait for it, for simplicity's sake.  It should be pending.  */
687               saved_vfork_pid = related_pid;
688               ourstatus->kind = TARGET_WAITKIND_IGNORE;
689               return pid_to_ptid (pid);
690             }
691         }
692
693       if (hpux_has_execd (pid, &execd_pathname))
694         {
695           /* On HP-UX, events associated with a vforking inferior come in
696              threes: a vfork event for the child (always first), followed
697              a vfork event for the parent and an exec event for the child.
698              The latter two can come in either order.  Make sure we get
699              both.  */
700           if (saved_vfork_state != STATE_NONE)
701             {
702               if (saved_vfork_state == STATE_GOT_CHILD)
703                 {
704                   saved_vfork_state = STATE_GOT_EXEC;
705                   /* On HP/UX with ptrace, the child must be resumed before
706                      the parent vfork event is delivered.  A single-step
707                      suffices.  */
708                   if (RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK ())
709                     target_resume (pid_to_ptid (pid), 1, TARGET_SIGNAL_0);
710                   ourstatus->kind = TARGET_WAITKIND_IGNORE;
711                 }
712               else if (saved_vfork_state == STATE_GOT_PARENT)
713                 {
714                   saved_vfork_state = STATE_FAKE_EXEC;
715                   ourstatus->kind = TARGET_WAITKIND_VFORKED;
716                   ourstatus->value.related_pid = saved_vfork_pid;
717                 }
718               else
719                 fprintf_unfiltered (gdb_stdout,
720                                     "hppa: exec: unexpected state\n");
721
722               saved_child_execd_pathname = execd_pathname;
723
724               return inferior_ptid;
725             }
726           
727           /* Are we ignoring initial exec events?  (This is likely because
728              we're in the process of starting up the inferior, and another
729              (older) mechanism handles those.)  If so, we'll report this
730              as a regular stop, not an exec.
731            */
732           if (inferior_ignoring_startup_exec_events)
733             {
734               inferior_ignoring_startup_exec_events--;
735             }
736           else
737             {
738               ourstatus->kind = TARGET_WAITKIND_EXECD;
739               ourstatus->value.execd_pathname = execd_pathname;
740               return pid_to_ptid (pid);
741             }
742         }
743
744       /* All we must do with these is communicate their occurrence
745          to wait_for_inferior...
746        */
747       if (hpux_has_syscall_event (pid, &kind, &syscall_id))
748         {
749           ourstatus->kind = kind;
750           ourstatus->value.syscall_id = syscall_id;
751           return pid_to_ptid (pid);
752         }
753
754       /*##  } while (pid != PIDGET (inferior_ptid)); ## *//* Some other child died or stopped */
755 /* hack for thread testing */
756     }
757   while ((pid != PIDGET (inferior_ptid)) && not_same_real_pid);
758 /*## */
759
760   store_waitstatus (ourstatus, status);
761   return pid_to_ptid (pid);
762 }
763
764 #if !defined (GDB_NATIVE_HPUX_11)
765
766 /* The following code is a substitute for the infttrace.c versions used
767    with ttrace() in HPUX 11.  */
768
769 /* This value is an arbitrary integer. */
770 #define PT_VERSION 123456
771
772 /* This semaphore is used to coordinate the child and parent processes
773    after a fork(), and before an exec() by the child.  See
774    parent_attach_all for details.  */
775
776 typedef struct
777 {
778   int parent_channel[2];        /* Parent "talks" to [1], child "listens" to [0] */
779   int child_channel[2];         /* Child "talks" to [1], parent "listens" to [0] */
780 }
781 startup_semaphore_t;
782
783 #define SEM_TALK (1)
784 #define SEM_LISTEN (0)
785
786 static startup_semaphore_t startup_semaphore;
787
788 extern int parent_attach_all (int, PTRACE_ARG3_TYPE, int);
789
790 #ifdef PT_SETTRC
791 /* This function causes the caller's process to be traced by its
792    parent.  This is intended to be called after GDB forks itself,
793    and before the child execs the target.
794
795    Note that HP-UX ptrace is rather funky in how this is done.
796    If the parent wants to get the initial exec event of a child,
797    it must set the ptrace event mask of the child to include execs.
798    (The child cannot do this itself.)  This must be done after the
799    child is forked, but before it execs.
800
801    To coordinate the parent and child, we implement a semaphore using
802    pipes.  After SETTRC'ing itself, the child tells the parent that
803    it is now traceable by the parent, and waits for the parent's
804    acknowledgement.  The parent can then set the child's event mask,
805    and notify the child that it can now exec.
806
807    (The acknowledgement by parent happens as a result of a call to
808    child_acknowledge_created_inferior.)  */
809
810 int
811 parent_attach_all (int pid, PTRACE_ARG3_TYPE addr, int data)
812 {
813   int pt_status = 0;
814
815   /* We need a memory home for a constant.  */
816   int tc_magic_child = PT_VERSION;
817   int tc_magic_parent = 0;
818
819   /* The remainder of this function is only useful for HPUX 10.0 and
820      later, as it depends upon the ability to request notification
821      of specific kinds of events by the kernel.  */
822 #if defined(PT_SET_EVENT_MASK)
823
824   /* Notify the parent that we're potentially ready to exec(). */
825   write (startup_semaphore.child_channel[SEM_TALK],
826          &tc_magic_child,
827          sizeof (tc_magic_child));
828
829   /* Wait for acknowledgement from the parent. */
830   read (startup_semaphore.parent_channel[SEM_LISTEN],
831         &tc_magic_parent,
832         sizeof (tc_magic_parent));
833   if (tc_magic_child != tc_magic_parent)
834     warning ("mismatched semaphore magic");
835
836   /* Discard our copy of the semaphore. */
837   (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
838   (void) close (startup_semaphore.parent_channel[SEM_TALK]);
839   (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
840   (void) close (startup_semaphore.child_channel[SEM_TALK]);
841 #endif
842
843   return 0;
844 }
845 #endif
846
847 int
848 hppa_require_attach (int pid)
849 {
850   int pt_status;
851   CORE_ADDR pc;
852   CORE_ADDR pc_addr;
853   unsigned int regs_offset;
854
855   /* Are we already attached?  There appears to be no explicit way to
856      answer this via ptrace, so we try something which should be
857      innocuous if we are attached.  If that fails, then we assume
858      we're not attached, and so attempt to make it so. */
859
860   errno = 0;
861   regs_offset = U_REGS_OFFSET;
862   pc_addr = register_addr (PC_REGNUM, regs_offset);
863   pc = call_ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE) pc_addr, 0);
864
865   if (errno)
866     {
867       errno = 0;
868       pt_status = call_ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0);
869
870       if (errno)
871         return -1;
872
873       /* Now we really are attached. */
874       errno = 0;
875     }
876   attach_flag = 1;
877   return pid;
878 }
879
880 int
881 hppa_require_detach (int pid, int signal)
882 {
883   errno = 0;
884   call_ptrace (PT_DETACH, pid, (PTRACE_ARG3_TYPE) 1, signal);
885   errno = 0;                    /* Ignore any errors. */
886   return pid;
887 }
888
889 /* Since ptrace doesn't support memory page-protection events, which
890    are used to implement "hardware" watchpoints on HP-UX, these are
891    dummy versions, which perform no useful work.  */
892
893 void
894 hppa_enable_page_protection_events (int pid)
895 {
896 }
897
898 void
899 hppa_disable_page_protection_events (int pid)
900 {
901 }
902
903 int
904 hppa_insert_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len, int type)
905 {
906   error ("Hardware watchpoints not implemented on this platform.");
907 }
908
909 int
910 hppa_remove_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len,
911                            enum bptype type)
912 {
913   error ("Hardware watchpoints not implemented on this platform.");
914 }
915
916 int
917 hppa_can_use_hw_watchpoint (enum bptype type, int cnt, enum bptype ot)
918 {
919   return 0;
920 }
921
922 int
923 hppa_range_profitable_for_hw_watchpoint (int pid, CORE_ADDR start, LONGEST len)
924 {
925   error ("Hardware watchpoints not implemented on this platform.");
926 }
927
928 char *
929 hppa_pid_or_tid_to_str (ptid_t id)
930 {
931   /* In the ptrace world, there are only processes. */
932   return child_pid_to_str (id);
933 }
934
935 /* This function has no meaning in a non-threaded world.  Thus, we
936    return 0 (FALSE).  See the use of "hppa_prepare_to_proceed" in
937    hppa-tdep.c. */
938
939 pid_t
940 hppa_switched_threads (pid_t pid)
941 {
942   return (pid_t) 0;
943 }
944
945 void
946 hppa_ensure_vforking_parent_remains_stopped (int pid)
947 {
948   /* This assumes that the vforked parent is presently stopped, and
949      that the vforked child has just delivered its first exec event.
950      Calling kill() this way will cause the SIGTRAP to be delivered as
951      soon as the parent is resumed, which happens as soon as the
952      vforked child is resumed.  See wait_for_inferior for the use of
953      this function.  */
954   kill (pid, SIGTRAP);
955 }
956
957 int
958 hppa_resume_execd_vforking_child_to_get_parent_vfork (void)
959 {
960   return 1;                     /* Yes, the child must be resumed. */
961 }
962
963 void
964 require_notification_of_events (int pid)
965 {
966 #if defined(PT_SET_EVENT_MASK)
967   int pt_status;
968   ptrace_event_t ptrace_events;
969   int nsigs;
970   int signum;
971
972   /* Instruct the kernel as to the set of events we wish to be
973      informed of.  (This support does not exist before HPUX 10.0.
974      We'll assume if PT_SET_EVENT_MASK has not been defined by
975      <sys/ptrace.h>, then we're being built on pre-10.0.)  */
976   memset (&ptrace_events, 0, sizeof (ptrace_events));
977
978   /* Note: By default, all signals are visible to us.  If we wish
979      the kernel to keep certain signals hidden from us, we do it
980      by calling sigdelset (ptrace_events.pe_signals, signal) for
981      each such signal here, before doing PT_SET_EVENT_MASK.  */
982   /* RM: The above comment is no longer true. We start with ignoring
983      all signals, and then add the ones we are interested in. We could
984      do it the other way: start by looking at all signals and then
985      deleting the ones that we aren't interested in, except that
986      multiple gdb signals may be mapped to the same host signal
987      (eg. TARGET_SIGNAL_IO and TARGET_SIGNAL_POLL both get mapped to
988      signal 22 on HPUX 10.20) We want to be notified if we are
989      interested in either signal.  */
990   sigfillset (&ptrace_events.pe_signals);
991
992   /* RM: Let's not bother with signals we don't care about */
993   nsigs = (int) TARGET_SIGNAL_LAST;
994   for (signum = nsigs; signum > 0; signum--)
995     {
996       if ((signal_stop_state (signum)) ||
997           (signal_print_state (signum)) ||
998           (!signal_pass_state (signum)))
999         {
1000           if (target_signal_to_host_p (signum))
1001             sigdelset (&ptrace_events.pe_signals,
1002                        target_signal_to_host (signum));
1003         }
1004     }
1005
1006   ptrace_events.pe_set_event = 0;
1007
1008   ptrace_events.pe_set_event |= PTRACE_SIGNAL;
1009   ptrace_events.pe_set_event |= PTRACE_EXEC;
1010   ptrace_events.pe_set_event |= PTRACE_FORK;
1011   ptrace_events.pe_set_event |= PTRACE_VFORK;
1012   /* ??rehrauer: Add this one when we're prepared to catch it...
1013      ptrace_events.pe_set_event |= PTRACE_EXIT;
1014    */
1015
1016   errno = 0;
1017   pt_status = call_ptrace (PT_SET_EVENT_MASK,
1018                            pid,
1019                            (PTRACE_ARG3_TYPE) & ptrace_events,
1020                            sizeof (ptrace_events));
1021   if (errno)
1022     perror_with_name ("ptrace");
1023   if (pt_status < 0)
1024     return;
1025 #endif
1026 }
1027
1028 void
1029 require_notification_of_exec_events (int pid)
1030 {
1031 #if defined(PT_SET_EVENT_MASK)
1032   int pt_status;
1033   ptrace_event_t ptrace_events;
1034
1035   /* Instruct the kernel as to the set of events we wish to be
1036      informed of.  (This support does not exist before HPUX 10.0.
1037      We'll assume if PT_SET_EVENT_MASK has not been defined by
1038      <sys/ptrace.h>, then we're being built on pre-10.0.)  */
1039   memset (&ptrace_events, 0, sizeof (ptrace_events));
1040
1041   /* Note: By default, all signals are visible to us.  If we wish
1042      the kernel to keep certain signals hidden from us, we do it
1043      by calling sigdelset (ptrace_events.pe_signals, signal) for
1044      each such signal here, before doing PT_SET_EVENT_MASK.  */
1045   sigemptyset (&ptrace_events.pe_signals);
1046
1047   ptrace_events.pe_set_event = 0;
1048
1049   ptrace_events.pe_set_event |= PTRACE_EXEC;
1050   /* ??rehrauer: Add this one when we're prepared to catch it...
1051      ptrace_events.pe_set_event |= PTRACE_EXIT;
1052    */
1053
1054   errno = 0;
1055   pt_status = call_ptrace (PT_SET_EVENT_MASK,
1056                            pid,
1057                            (PTRACE_ARG3_TYPE) & ptrace_events,
1058                            sizeof (ptrace_events));
1059   if (errno)
1060     perror_with_name ("ptrace");
1061   if (pt_status < 0)
1062     return;
1063 #endif
1064 }
1065
1066 /* This function is called by the parent process, with pid being the
1067    ID of the child process, after the debugger has forked.  */
1068
1069 void
1070 child_acknowledge_created_inferior (int pid)
1071 {
1072   /* We need a memory home for a constant.  */
1073   int tc_magic_parent = PT_VERSION;
1074   int tc_magic_child = 0;
1075
1076   /* The remainder of this function is only useful for HPUX 10.0 and
1077      later, as it depends upon the ability to request notification
1078      of specific kinds of events by the kernel.  */
1079 #if defined(PT_SET_EVENT_MASK)
1080   /* Wait for the child to tell us that it has forked. */
1081   read (startup_semaphore.child_channel[SEM_LISTEN],
1082         &tc_magic_child,
1083         sizeof (tc_magic_child));
1084
1085   /* Notify the child that it can exec.
1086
1087      In the infttrace.c variant of this function, we set the child's
1088      event mask after the fork but before the exec.  In the ptrace
1089      world, it seems we can't set the event mask until after the exec.  */
1090   write (startup_semaphore.parent_channel[SEM_TALK],
1091          &tc_magic_parent,
1092          sizeof (tc_magic_parent));
1093
1094   /* We'd better pause a bit before trying to set the event mask,
1095      though, to ensure that the exec has happened.  We don't want to
1096      wait() on the child, because that'll screw up the upper layers
1097      of gdb's execution control that expect to see the exec event.
1098
1099      After an exec, the child is no longer executing gdb code.  Hence,
1100      we can't have yet another synchronization via the pipes.  We'll
1101      just sleep for a second, and hope that's enough delay...  */
1102   sleep (1);
1103
1104   /* Instruct the kernel as to the set of events we wish to be
1105      informed of.  */
1106   require_notification_of_exec_events (pid);
1107
1108   /* Discard our copy of the semaphore. */
1109   (void) close (startup_semaphore.parent_channel[SEM_LISTEN]);
1110   (void) close (startup_semaphore.parent_channel[SEM_TALK]);
1111   (void) close (startup_semaphore.child_channel[SEM_LISTEN]);
1112   (void) close (startup_semaphore.child_channel[SEM_TALK]);
1113 #endif
1114 }
1115
1116 void
1117 child_post_startup_inferior (ptid_t ptid)
1118 {
1119   require_notification_of_events (PIDGET (ptid));
1120 }
1121
1122 void
1123 child_post_attach (int pid)
1124 {
1125   require_notification_of_events (pid);
1126 }
1127
1128 int
1129 child_insert_fork_catchpoint (int pid)
1130 {
1131   /* This request is only available on HPUX 10.0 and later.  */
1132 #if !defined(PT_SET_EVENT_MASK)
1133   error ("Unable to catch forks prior to HPUX 10.0");
1134 #else
1135   /* Enable reporting of fork events from the kernel. */
1136   /* ??rehrauer: For the moment, we're always enabling these events,
1137      and just ignoring them if there's no catchpoint to catch them.  */
1138   return 0;
1139 #endif
1140 }
1141
1142 int
1143 child_remove_fork_catchpoint (int pid)
1144 {
1145   /* This request is only available on HPUX 10.0 and later.  */
1146 #if !defined(PT_SET_EVENT_MASK)
1147   error ("Unable to catch forks prior to HPUX 10.0");
1148 #else
1149   /* Disable reporting of fork events from the kernel. */
1150   /* ??rehrauer: For the moment, we're always enabling these events,
1151      and just ignoring them if there's no catchpoint to catch them.  */
1152   return 0;
1153 #endif
1154 }
1155
1156 int
1157 child_insert_vfork_catchpoint (int pid)
1158 {
1159   /* This request is only available on HPUX 10.0 and later.  */
1160 #if !defined(PT_SET_EVENT_MASK)
1161   error ("Unable to catch vforks prior to HPUX 10.0");
1162 #else
1163   /* Enable reporting of vfork events from the kernel. */
1164   /* ??rehrauer: For the moment, we're always enabling these events,
1165      and just ignoring them if there's no catchpoint to catch them.  */
1166   return 0;
1167 #endif
1168 }
1169
1170 int
1171 child_remove_vfork_catchpoint (int pid)
1172 {
1173   /* This request is only available on HPUX 10.0 and later.  */
1174 #if !defined(PT_SET_EVENT_MASK)
1175   error ("Unable to catch vforks prior to HPUX 10.0");
1176 #else
1177   /* Disable reporting of vfork events from the kernel. */
1178   /* ??rehrauer: For the moment, we're always enabling these events,
1179      and just ignoring them if there's no catchpoint to catch them.  */
1180   return 0;
1181 #endif
1182 }
1183
1184 int
1185 hpux_has_forked (int pid, int *childpid)
1186 {
1187   /* This request is only available on HPUX 10.0 and later.  */
1188 #if !defined(PT_GET_PROCESS_STATE)
1189   *childpid = 0;
1190   return 0;
1191 #else
1192   int pt_status;
1193   ptrace_state_t ptrace_state;
1194
1195   errno = 0;
1196   pt_status = call_ptrace (PT_GET_PROCESS_STATE,
1197                            pid,
1198                            (PTRACE_ARG3_TYPE) & ptrace_state,
1199                            sizeof (ptrace_state));
1200   if (errno)
1201     perror_with_name ("ptrace");
1202   if (pt_status < 0)
1203     return 0;
1204
1205   if (ptrace_state.pe_report_event & PTRACE_FORK)
1206     {
1207       *childpid = ptrace_state.pe_other_pid;
1208       return 1;
1209     }
1210
1211   return 0;
1212 #endif
1213 }
1214
1215 int
1216 hpux_has_vforked (int pid, int *childpid)
1217 {
1218   /* This request is only available on HPUX 10.0 and later.  */
1219 #if !defined(PT_GET_PROCESS_STATE)
1220   *childpid = 0;
1221   return 0;
1222
1223 #else
1224   int pt_status;
1225   ptrace_state_t ptrace_state;
1226
1227   errno = 0;
1228   pt_status = call_ptrace (PT_GET_PROCESS_STATE,
1229                            pid,
1230                            (PTRACE_ARG3_TYPE) & ptrace_state,
1231                            sizeof (ptrace_state));
1232   if (errno)
1233     perror_with_name ("ptrace");
1234   if (pt_status < 0)
1235     return 0;
1236
1237   if (ptrace_state.pe_report_event & PTRACE_VFORK)
1238     {
1239       *childpid = ptrace_state.pe_other_pid;
1240       return 1;
1241     }
1242
1243   return 0;
1244 #endif
1245 }
1246
1247 int
1248 child_insert_exec_catchpoint (int pid)
1249 {
1250   /* This request is only available on HPUX 10.0 and later.   */
1251 #if !defined(PT_SET_EVENT_MASK)
1252   error ("Unable to catch execs prior to HPUX 10.0");
1253
1254 #else
1255   /* Enable reporting of exec events from the kernel.  */
1256   /* ??rehrauer: For the moment, we're always enabling these events,
1257      and just ignoring them if there's no catchpoint to catch them.  */
1258   return 0;
1259 #endif
1260 }
1261
1262 int
1263 child_remove_exec_catchpoint (int pid)
1264 {
1265   /* This request is only available on HPUX 10.0 and later.  */
1266 #if !defined(PT_SET_EVENT_MASK)
1267   error ("Unable to catch execs prior to HPUX 10.0");
1268
1269 #else
1270   /* Disable reporting of exec events from the kernel. */
1271   /* ??rehrauer: For the moment, we're always enabling these events,
1272      and just ignoring them if there's no catchpoint to catch them.  */
1273   return 0;
1274 #endif
1275 }
1276
1277 int
1278 hpux_has_execd (int pid, char **execd_pathname)
1279 {
1280   /* This request is only available on HPUX 10.0 and later.  */
1281 #if !defined(PT_GET_PROCESS_STATE)
1282   *execd_pathname = NULL;
1283   return 0;
1284
1285 #else
1286   int pt_status;
1287   ptrace_state_t ptrace_state;
1288
1289   errno = 0;
1290   pt_status = call_ptrace (PT_GET_PROCESS_STATE,
1291                            pid,
1292                            (PTRACE_ARG3_TYPE) & ptrace_state,
1293                            sizeof (ptrace_state));
1294   if (errno)
1295     perror_with_name ("ptrace");
1296   if (pt_status < 0)
1297     return 0;
1298
1299   if (ptrace_state.pe_report_event & PTRACE_EXEC)
1300     {
1301       char *exec_file = target_pid_to_exec_file (pid);
1302       *execd_pathname = savestring (exec_file, strlen (exec_file));
1303       return 1;
1304     }
1305
1306   return 0;
1307 #endif
1308 }
1309
1310 int
1311 child_reported_exec_events_per_exec_call (void)
1312 {
1313   return 2;                     /* ptrace reports the event twice per call. */
1314 }
1315
1316 int
1317 hpux_has_syscall_event (int pid, enum target_waitkind *kind, int *syscall_id)
1318 {
1319   /* This request is only available on HPUX 10.30 and later, via
1320      the ttrace interface.  */
1321
1322   *kind = TARGET_WAITKIND_SPURIOUS;
1323   *syscall_id = -1;
1324   return 0;
1325 }
1326
1327 char *
1328 child_pid_to_exec_file (int pid)
1329 {
1330   static char exec_file_buffer[1024];
1331   int pt_status;
1332   CORE_ADDR top_of_stack;
1333   char four_chars[4];
1334   int name_index;
1335   int i;
1336   ptid_t saved_inferior_ptid;
1337   boolean done;
1338
1339 #ifdef PT_GET_PROCESS_PATHNAME
1340   /* As of 10.x HP-UX, there's an explicit request to get the pathname. */
1341   pt_status = call_ptrace (PT_GET_PROCESS_PATHNAME,
1342                            pid,
1343                            (PTRACE_ARG3_TYPE) exec_file_buffer,
1344                            sizeof (exec_file_buffer) - 1);
1345   if (pt_status == 0)
1346     return exec_file_buffer;
1347 #endif
1348
1349   /* It appears that this request is broken prior to 10.30.
1350      If it fails, try a really, truly amazingly gross hack
1351      that DDE uses, of pawing through the process' data
1352      segment to find the pathname.  */
1353
1354   top_of_stack = 0x7b03a000;
1355   name_index = 0;
1356   done = 0;
1357
1358   /* On the chance that pid != inferior_ptid, set inferior_ptid
1359      to pid, so that (grrrr!) implicit uses of inferior_ptid get
1360      the right id.  */
1361
1362   saved_inferior_ptid = inferior_ptid;
1363   inferior_ptid = pid_to_ptid (pid);
1364
1365   /* Try to grab a null-terminated string. */
1366   while (!done)
1367     {
1368       if (target_read_memory (top_of_stack, four_chars, 4) != 0)
1369         {
1370           inferior_ptid = saved_inferior_ptid;
1371           return NULL;
1372         }
1373       for (i = 0; i < 4; i++)
1374         {
1375           exec_file_buffer[name_index++] = four_chars[i];
1376           done = (four_chars[i] == '\0');
1377           if (done)
1378             break;
1379         }
1380       top_of_stack += 4;
1381     }
1382
1383   if (exec_file_buffer[0] == '\0')
1384     {
1385       inferior_ptid = saved_inferior_ptid;
1386       return NULL;
1387     }
1388
1389   inferior_ptid = saved_inferior_ptid;
1390   return exec_file_buffer;
1391 }
1392
1393 void
1394 pre_fork_inferior (void)
1395 {
1396   int status;
1397
1398   status = pipe (startup_semaphore.parent_channel);
1399   if (status < 0)
1400     {
1401       warning ("error getting parent pipe for startup semaphore");
1402       return;
1403     }
1404
1405   status = pipe (startup_semaphore.child_channel);
1406   if (status < 0)
1407     {
1408       warning ("error getting child pipe for startup semaphore");
1409       return;
1410     }
1411 }
1412 \f
1413
1414 /* Check to see if the given thread is alive.
1415
1416    This is a no-op, as ptrace doesn't support threads, so we just
1417    return "TRUE".  */
1418
1419 int
1420 child_thread_alive (ptid_t ptid)
1421 {
1422   return 1;
1423 }
1424
1425 #endif /* ! GDB_NATIVE_HPUX_11 */
This page took 0.099696 seconds and 4 git commands to generate.