1/* Target-vector operations for controlling Unix child processes, for GDB.
2
3   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
4   2000, 2002, 2003, 2004 Free Software Foundation, Inc.
5
6   Contributed by Cygnus Support.
7
8   ## Contains temporary hacks..
9
10   This file is part of GDB.
11
12   This program is free software; you can redistribute it and/or modify
13   it under the terms of the GNU General Public License as published by
14   the Free Software Foundation; either version 2 of the License, or
15   (at your option) any later version.
16
17   This program is distributed in the hope that it will be useful,
18   but WITHOUT ANY WARRANTY; without even the implied warranty of
19   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20   GNU General Public License for more details.
21
22   You should have received a copy of the GNU General Public License
23   along with this program; if not, write to the Free Software
24   Foundation, Inc., 59 Temple Place - Suite 330,
25   Boston, MA 02111-1307, USA.  */
26
27#include "defs.h"
28#include "frame.h"		/* required by inferior.h */
29#include "inferior.h"
30#include "target.h"
31#include "gdbcore.h"
32#include "command.h"
33#include "gdb_stat.h"
34#include <signal.h>
35#include <sys/types.h>
36#include <fcntl.h>
37
38#include "gdb_wait.h"
39#include "inflow.h"
40
41extern struct symtab_and_line *child_enable_exception_callback (enum
42								exception_event_kind,
43								int);
44
45extern struct exception_event_record
46  *child_get_current_exception_event (void);
47
48extern void _initialize_inftarg (void);
49
50static void child_prepare_to_store (void);
51
52#ifndef CHILD_WAIT
53static ptid_t child_wait (ptid_t, struct target_waitstatus *);
54#endif /* CHILD_WAIT */
55
56#if !defined(CHILD_POST_WAIT)
57void child_post_wait (ptid_t, int);
58#endif
59
60static void child_open (char *, int);
61
62static void child_files_info (struct target_ops *);
63
64static void child_detach (char *, int);
65
66static void child_attach (char *, int);
67
68#if !defined(CHILD_POST_ATTACH)
69extern void child_post_attach (int);
70#endif
71
72static void ptrace_me (void);
73
74static void ptrace_him (int);
75
76static void child_create_inferior (char *, char *, char **);
77
78static void child_mourn_inferior (void);
79
80static int child_can_run (void);
81
82static void child_stop (void);
83
84#ifndef CHILD_THREAD_ALIVE
85int child_thread_alive (ptid_t);
86#endif
87
88static void init_child_ops (void);
89
90extern char **environ;
91
92struct target_ops child_ops;
93
94int child_suppress_run = 0;	/* Non-zero if inftarg should pretend not to
95				   be a runnable target.  Used by targets
96				   that can sit atop inftarg, such as HPUX
97				   thread support.  */
98
99#ifndef CHILD_WAIT
100
101/* Wait for child to do something.  Return pid of child, or -1 in case
102   of error; store status through argument pointer OURSTATUS.  */
103
104static ptid_t
105child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
106{
107  int save_errno;
108  int status;
109  char *execd_pathname = NULL;
110  int exit_status;
111  int related_pid;
112  int syscall_id;
113  enum target_waitkind kind;
114  int pid;
115
116  do
117    {
118      set_sigint_trap ();	/* Causes SIGINT to be passed on to the
119				   attached process. */
120      set_sigio_trap ();
121
122      pid = ptrace_wait (inferior_ptid, &status);
123
124      save_errno = errno;
125
126      clear_sigio_trap ();
127
128      clear_sigint_trap ();
129
130      if (pid == -1)
131	{
132	  if (save_errno == EINTR)
133	    continue;
134
135	  fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
136			      safe_strerror (save_errno));
137
138	  /* Claim it exited with unknown signal.  */
139	  ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
140	  ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
141	  return pid_to_ptid (-1);
142	}
143
144      /* Did it exit?
145       */
146      if (target_has_exited (pid, status, &exit_status))
147	{
148	  /* ??rehrauer: For now, ignore this. */
149	  continue;
150	}
151
152      if (!target_thread_alive (pid_to_ptid (pid)))
153	{
154	  ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
155	  return pid_to_ptid (pid);
156	}
157      } while (pid != PIDGET (inferior_ptid)); /* Some other child died or stopped */
158
159  store_waitstatus (ourstatus, status);
160  return pid_to_ptid (pid);
161}
162#endif /* CHILD_WAIT */
163
164#if !defined(CHILD_POST_WAIT)
165void
166child_post_wait (ptid_t ptid, int wait_status)
167{
168  /* This version of Unix doesn't require a meaningful "post wait"
169     operation.
170   */
171}
172#endif
173
174
175#ifndef CHILD_THREAD_ALIVE
176
177/* Check to see if the given thread is alive.
178
179   FIXME: Is kill() ever the right way to do this?  I doubt it, but
180   for now we're going to try and be compatable with the old thread
181   code.  */
182int
183child_thread_alive (ptid_t ptid)
184{
185  pid_t pid = PIDGET (ptid);
186
187  return (kill (pid, 0) != -1);
188}
189
190#endif
191
192/* Attach to process PID, then initialize for debugging it.  */
193
194static void
195child_attach (char *args, int from_tty)
196{
197  if (!args)
198    error_no_arg ("process-id to attach");
199
200#ifndef ATTACH_DETACH
201  error ("Can't attach to a process on this machine.");
202#else
203  {
204    char *exec_file;
205    int pid;
206    char *dummy;
207
208    dummy = args;
209    pid = strtol (args, &dummy, 0);
210    /* Some targets don't set errno on errors, grrr! */
211    if ((pid == 0) && (args == dummy))
212      error ("Illegal process-id: %s\n", args);
213
214    if (pid == getpid ())	/* Trying to masturbate? */
215      error ("I refuse to debug myself!");
216
217    if (from_tty)
218      {
219	exec_file = (char *) get_exec_file (0);
220
221	if (exec_file)
222	  printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
223			     target_pid_to_str (pid_to_ptid (pid)));
224	else
225	  printf_unfiltered ("Attaching to %s\n",
226	                     target_pid_to_str (pid_to_ptid (pid)));
227
228	gdb_flush (gdb_stdout);
229      }
230
231    attach (pid);
232
233    inferior_ptid = pid_to_ptid (pid);
234    push_target (&child_ops);
235  }
236#endif /* ATTACH_DETACH */
237}
238
239#if !defined(CHILD_POST_ATTACH)
240void
241child_post_attach (int pid)
242{
243  /* This version of Unix doesn't require a meaningful "post attach"
244     operation by a debugger.  */
245}
246#endif
247
248/* Take a program previously attached to and detaches it.
249   The program resumes execution and will no longer stop
250   on signals, etc.  We'd better not have left any breakpoints
251   in the program or it'll die when it hits one.  For this
252   to work, it may be necessary for the process to have been
253   previously attached.  It *might* work if the program was
254   started via the normal ptrace (PTRACE_TRACEME).  */
255
256static void
257child_detach (char *args, int from_tty)
258{
259#ifdef ATTACH_DETACH
260  {
261    int siggnal = 0;
262    int pid = PIDGET (inferior_ptid);
263
264    if (from_tty)
265      {
266	char *exec_file = get_exec_file (0);
267	if (exec_file == 0)
268	  exec_file = "";
269	printf_unfiltered ("Detaching from program: %s, %s\n", exec_file,
270			   target_pid_to_str (pid_to_ptid (pid)));
271	gdb_flush (gdb_stdout);
272      }
273    if (args)
274      siggnal = atoi (args);
275
276    detach (siggnal);
277
278    inferior_ptid = null_ptid;
279    unpush_target (&child_ops);
280  }
281#else
282  error ("This version of Unix does not support detaching a process.");
283#endif
284}
285
286/* Get ready to modify the registers array.  On machines which store
287   individual registers, this doesn't need to do anything.  On machines
288   which store all the registers in one fell swoop, this makes sure
289   that registers contains all the registers from the program being
290   debugged.  */
291
292static void
293child_prepare_to_store (void)
294{
295#ifdef CHILD_PREPARE_TO_STORE
296  CHILD_PREPARE_TO_STORE ();
297#endif
298}
299
300/* Print status information about what we're accessing.  */
301
302static void
303child_files_info (struct target_ops *ignore)
304{
305  printf_unfiltered ("\tUsing the running image of %s %s.\n",
306      attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
307}
308
309static void
310child_open (char *arg, int from_tty)
311{
312  error ("Use the \"run\" command to start a Unix child process.");
313}
314
315/* Stub function which causes the inferior that runs it, to be ptrace-able
316   by its parent process.  */
317
318static void
319ptrace_me (void)
320{
321  /* "Trace me, Dr. Memory!" */
322  call_ptrace (0, 0, (PTRACE_ARG3_TYPE) 0, 0);
323}
324
325/* Stub function which causes the GDB that runs it, to start ptrace-ing
326   the child process.  */
327
328static void
329ptrace_him (int pid)
330{
331  push_target (&child_ops);
332
333  /* On some targets, there must be some explicit synchronization
334     between the parent and child processes after the debugger
335     forks, and before the child execs the debuggee program.  This
336     call basically gives permission for the child to exec.
337   */
338
339  target_acknowledge_created_inferior (pid);
340
341  /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h,
342   * and will be 1 or 2 depending on whether we're starting
343   * without or with a shell.
344   */
345  startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
346
347  /* On some targets, there must be some explicit actions taken after
348     the inferior has been started up.
349   */
350  target_post_startup_inferior (pid_to_ptid (pid));
351}
352
353/* Start an inferior Unix child process and sets inferior_ptid to its pid.
354   EXEC_FILE is the file to run.
355   ALLARGS is a string containing the arguments to the program.
356   ENV is the environment vector to pass.  Errors reported with error().  */
357
358static void
359child_create_inferior (char *exec_file, char *allargs, char **env)
360{
361#ifdef HPUXHPPA
362  fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
363#else
364  fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
365#endif
366  /* We are at the first instruction we care about.  */
367  /* Pedal to the metal... */
368  proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
369}
370
371#if !defined(CHILD_POST_STARTUP_INFERIOR)
372void
373child_post_startup_inferior (ptid_t ptid)
374{
375  /* This version of Unix doesn't require a meaningful "post startup inferior"
376     operation by a debugger.
377   */
378}
379#endif
380
381#if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
382void
383child_acknowledge_created_inferior (int pid)
384{
385  /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
386     operation by a debugger.
387   */
388}
389#endif
390
391
392#if !defined(CHILD_INSERT_FORK_CATCHPOINT)
393int
394child_insert_fork_catchpoint (int pid)
395{
396  /* This version of Unix doesn't support notification of fork events.  */
397  return 0;
398}
399#endif
400
401#if !defined(CHILD_REMOVE_FORK_CATCHPOINT)
402int
403child_remove_fork_catchpoint (int pid)
404{
405  /* This version of Unix doesn't support notification of fork events.  */
406  return 0;
407}
408#endif
409
410#if !defined(CHILD_INSERT_VFORK_CATCHPOINT)
411int
412child_insert_vfork_catchpoint (int pid)
413{
414  /* This version of Unix doesn't support notification of vfork events.  */
415  return 0;
416}
417#endif
418
419#if !defined(CHILD_REMOVE_VFORK_CATCHPOINT)
420int
421child_remove_vfork_catchpoint (int pid)
422{
423  /* This version of Unix doesn't support notification of vfork events.  */
424  return 0;
425}
426#endif
427
428#if !defined(CHILD_FOLLOW_FORK)
429int
430child_follow_fork (int follow_child)
431{
432  /* This version of Unix doesn't support following fork or vfork events.  */
433  return 0;
434}
435#endif
436
437#if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
438int
439child_insert_exec_catchpoint (int pid)
440{
441  /* This version of Unix doesn't support notification of exec events.  */
442  return 0;
443}
444#endif
445
446#if !defined(CHILD_REMOVE_EXEC_CATCHPOINT)
447int
448child_remove_exec_catchpoint (int pid)
449{
450  /* This version of Unix doesn't support notification of exec events.  */
451  return 0;
452}
453#endif
454
455#if !defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
456int
457child_reported_exec_events_per_exec_call (void)
458{
459  /* This version of Unix doesn't support notification of exec events.
460   */
461  return 1;
462}
463#endif
464
465#if !defined(CHILD_HAS_EXITED)
466int
467child_has_exited (int pid, int wait_status, int *exit_status)
468{
469  if (WIFEXITED (wait_status))
470    {
471      *exit_status = WEXITSTATUS (wait_status);
472      return 1;
473    }
474
475  if (WIFSIGNALED (wait_status))
476    {
477      *exit_status = 0;		/* ?? Don't know what else to say here. */
478      return 1;
479    }
480
481  /* ?? Do we really need to consult the event state, too?  Assume the
482     wait_state alone suffices.
483   */
484  return 0;
485}
486#endif
487
488
489static void
490child_mourn_inferior (void)
491{
492  unpush_target (&child_ops);
493  generic_mourn_inferior ();
494}
495
496static int
497child_can_run (void)
498{
499  /* This variable is controlled by modules that sit atop inftarg that may layer
500     their own process structure atop that provided here.  hpux-thread.c does
501     this because of the Hpux user-mode level thread model.  */
502
503  return !child_suppress_run;
504}
505
506/* Send a SIGINT to the process group.  This acts just like the user typed a
507   ^C on the controlling terminal.
508
509   XXX - This may not be correct for all systems.  Some may want to use
510   killpg() instead of kill (-pgrp). */
511
512static void
513child_stop (void)
514{
515  kill (-inferior_process_group, SIGINT);
516}
517
518#if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
519struct symtab_and_line *
520child_enable_exception_callback (enum exception_event_kind kind, int enable)
521{
522  return (struct symtab_and_line *) NULL;
523}
524#endif
525
526#if !defined(CHILD_GET_CURRENT_EXCEPTION_EVENT)
527struct exception_event_record *
528child_get_current_exception_event (void)
529{
530  return (struct exception_event_record *) NULL;
531}
532#endif
533
534
535#if !defined(CHILD_PID_TO_EXEC_FILE)
536char *
537child_pid_to_exec_file (int pid)
538{
539  /* This version of Unix doesn't support translation of a process ID
540     to the filename of the executable file.
541   */
542  return NULL;
543}
544#endif
545
546char *
547child_core_file_to_sym_file (char *core)
548{
549  /* The target stratum for a running executable need not support
550     this operation.
551   */
552  return NULL;
553}
554
555/* Perform a partial transfer to/from the specified object.  For
556   memory transfers, fall back to the old memory xfer functions.  */
557
558static LONGEST
559child_xfer_partial (struct target_ops *ops, enum target_object object,
560		    const char *annex, void *readbuf,
561		    const void *writebuf, ULONGEST offset, LONGEST len)
562{
563  switch (object)
564    {
565    case TARGET_OBJECT_MEMORY:
566      if (readbuf)
567	return child_xfer_memory (offset, readbuf, len, 0/*write*/,
568				  NULL, ops);
569      if (writebuf)
570	return child_xfer_memory (offset, readbuf, len, 1/*write*/,
571				  NULL, ops);
572      return -1;
573
574    case TARGET_OBJECT_UNWIND_TABLE:
575#ifndef NATIVE_XFER_UNWIND_TABLE
576#define NATIVE_XFER_UNWIND_TABLE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
577#endif
578      return NATIVE_XFER_UNWIND_TABLE (ops, object, annex, readbuf, writebuf,
579				       offset, len);
580
581    case TARGET_OBJECT_AUXV:
582#ifndef NATIVE_XFER_AUXV
583#define NATIVE_XFER_AUXV(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
584#endif
585      return NATIVE_XFER_AUXV (ops, object, annex, readbuf, writebuf,
586			       offset, len);
587
588    case TARGET_OBJECT_WCOOKIE:
589#ifndef NATIVE_XFER_WCOOKIE
590#define NATIVE_XFER_WCOOKIE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
591#endif
592      return NATIVE_XFER_WCOOKIE (ops, object, annex, readbuf, writebuf,
593				  offset, len);
594
595    case TARGET_OBJECT_DIRTY:
596#ifndef NATIVE_XFER_DIRTY
597#define NATIVE_XFER_DIRTY(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
598#endif
599      return NATIVE_XFER_DIRTY (ops, object, annex, readbuf, writebuf,
600				offset, len);
601
602    default:
603      return -1;
604    }
605}
606
607#if !defined(CHILD_PID_TO_STR)
608char *
609child_pid_to_str (ptid_t ptid)
610{
611  return normal_pid_to_str (ptid);
612}
613#endif
614
615static void
616init_child_ops (void)
617{
618  child_ops.to_shortname = "child";
619  child_ops.to_longname = "Unix child process";
620  child_ops.to_doc = "Unix child process (started by the \"run\" command).";
621  child_ops.to_open = child_open;
622  child_ops.to_attach = child_attach;
623  child_ops.to_post_attach = child_post_attach;
624  child_ops.to_detach = child_detach;
625  child_ops.to_resume = child_resume;
626  child_ops.to_wait = child_wait;
627  child_ops.to_post_wait = child_post_wait;
628  child_ops.to_fetch_registers = fetch_inferior_registers;
629  child_ops.to_store_registers = store_inferior_registers;
630  child_ops.to_prepare_to_store = child_prepare_to_store;
631  child_ops.to_xfer_memory = child_xfer_memory;
632  child_ops.to_xfer_partial = child_xfer_partial;
633  child_ops.to_files_info = child_files_info;
634  child_ops.to_insert_breakpoint = memory_insert_breakpoint;
635  child_ops.to_remove_breakpoint = memory_remove_breakpoint;
636  child_ops.to_terminal_init = terminal_init_inferior;
637  child_ops.to_terminal_inferior = terminal_inferior;
638  child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
639  child_ops.to_terminal_save_ours = terminal_save_ours;
640  child_ops.to_terminal_ours = terminal_ours;
641  child_ops.to_terminal_info = child_terminal_info;
642  child_ops.to_kill = kill_inferior;
643  child_ops.to_create_inferior = child_create_inferior;
644  child_ops.to_post_startup_inferior = child_post_startup_inferior;
645  child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
646  child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
647  child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
648  child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
649  child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
650  child_ops.to_follow_fork = child_follow_fork;
651  child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
652  child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
653  child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
654  child_ops.to_has_exited = child_has_exited;
655  child_ops.to_mourn_inferior = child_mourn_inferior;
656  child_ops.to_can_run = child_can_run;
657  child_ops.to_thread_alive = child_thread_alive;
658  child_ops.to_pid_to_str = child_pid_to_str;
659  child_ops.to_stop = child_stop;
660  child_ops.to_enable_exception_callback = child_enable_exception_callback;
661  child_ops.to_get_current_exception_event = child_get_current_exception_event;
662  child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
663  child_ops.to_stratum = process_stratum;
664  child_ops.to_has_all_memory = 1;
665  child_ops.to_has_memory = 1;
666  child_ops.to_has_stack = 1;
667  child_ops.to_has_registers = 1;
668  child_ops.to_has_execution = 1;
669  child_ops.to_magic = OPS_MAGIC;
670}
671
672/* Take over the 'find_mapped_memory' vector from inftarg.c. */
673extern void
674inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
675						       unsigned long,
676						       int, int, int,
677						       void *),
678					      void *))
679{
680  child_ops.to_find_memory_regions = func;
681}
682
683/* Take over the 'make_corefile_notes' vector from inftarg.c. */
684extern void
685inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
686{
687  child_ops.to_make_corefile_notes = func;
688}
689
690void
691_initialize_inftarg (void)
692{
693#ifdef HAVE_OPTIONAL_PROC_FS
694  char procname[32];
695  int fd;
696
697  /* If we have an optional /proc filesystem (e.g. under OSF/1),
698     don't add ptrace support if we can access the running GDB via /proc.  */
699#ifndef PROC_NAME_FMT
700#define PROC_NAME_FMT "/proc/%05d"
701#endif
702  sprintf (procname, PROC_NAME_FMT, getpid ());
703  fd = open (procname, O_RDONLY);
704  if (fd >= 0)
705    {
706      close (fd);
707      return;
708    }
709#endif
710
711  init_child_ops ();
712  add_target (&child_ops);
713}
714