* config/tc-xtensa.c (xtensa_mark_literal_pool_location): Remove
[deliverable/binutils-gdb.git] / gdb / inftarg.c
CommitLineData
c906108c 1/* Target-vector operations for controlling Unix child processes, for GDB.
1bac305b
AC
2
3 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
4 2000, 2002, 2003 Free Software Foundation, Inc.
5
c906108c
SS
6 Contributed by Cygnus Support.
7
c5aa993b 8 ## Contains temporary hacks..
c906108c 9
c5aa993b 10 This file is part of GDB.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b
JM
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.
c906108c 21
c5aa993b
JM
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. */
c906108c
SS
26
27#include "defs.h"
c5aa993b 28#include "frame.h" /* required by inferior.h */
c906108c
SS
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
03f2053f 38#include "gdb_wait.h"
44270758 39#include "inflow.h"
c906108c 40
a14ed312
KB
41extern struct symtab_and_line *child_enable_exception_callback (enum
42 exception_event_kind,
43 int);
c906108c 44
a14ed312
KB
45extern struct exception_event_record
46 *child_get_current_exception_event (void);
c906108c 47
a14ed312 48extern void _initialize_inftarg (void);
c906108c 49
a14ed312 50static void child_prepare_to_store (void);
c906108c
SS
51
52#ifndef CHILD_WAIT
39f77062 53static ptid_t child_wait (ptid_t, struct target_waitstatus *);
c906108c
SS
54#endif /* CHILD_WAIT */
55
56#if !defined(CHILD_POST_WAIT)
39f77062 57void child_post_wait (ptid_t, int);
c906108c
SS
58#endif
59
a14ed312 60static void child_open (char *, int);
c906108c 61
a14ed312 62static void child_files_info (struct target_ops *);
c906108c 63
a14ed312 64static void child_detach (char *, int);
c906108c 65
a14ed312 66static void child_attach (char *, int);
c906108c 67
c906108c 68#if !defined(CHILD_POST_ATTACH)
a14ed312 69extern void child_post_attach (int);
c906108c
SS
70#endif
71
a14ed312 72static void ptrace_me (void);
c906108c 73
a14ed312 74static void ptrace_him (int);
c906108c 75
a14ed312 76static void child_create_inferior (char *, char *, char **);
c906108c 77
a14ed312 78static void child_mourn_inferior (void);
c906108c 79
a14ed312 80static int child_can_run (void);
c906108c 81
a14ed312 82static void child_stop (void);
c906108c
SS
83
84#ifndef CHILD_THREAD_ALIVE
39f77062 85int child_thread_alive (ptid_t);
c906108c
SS
86#endif
87
a14ed312 88static void init_child_ops (void);
c906108c
SS
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
c906108c
SS
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
39f77062
KB
104static ptid_t
105child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
c906108c
SS
106{
107 int save_errno;
108 int status;
7a292a7a 109 char *execd_pathname = NULL;
c5aa993b
JM
110 int exit_status;
111 int related_pid;
112 int syscall_id;
113 enum target_waitkind kind;
39f77062 114 int pid;
c906108c 115
c5aa993b
JM
116 do
117 {
118 set_sigint_trap (); /* Causes SIGINT to be passed on to the
119 attached process. */
120 set_sigio_trap ();
c906108c 121
39f77062 122 pid = ptrace_wait (inferior_ptid, &status);
c906108c 123
c5aa993b 124 save_errno = errno;
c906108c 125
c5aa993b 126 clear_sigio_trap ();
c906108c 127
c5aa993b 128 clear_sigint_trap ();
c906108c 129
c5aa993b
JM
130 if (pid == -1)
131 {
132 if (save_errno == EINTR)
133 continue;
c906108c 134
c5aa993b
JM
135 fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
136 safe_strerror (save_errno));
c906108c 137
c5aa993b
JM
138 /* Claim it exited with unknown signal. */
139 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
140 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
39f77062 141 return pid_to_ptid (-1);
c5aa993b 142 }
c906108c 143
c5aa993b 144 /* Did it exit?
c906108c 145 */
c5aa993b
JM
146 if (target_has_exited (pid, status, &exit_status))
147 {
148 /* ??rehrauer: For now, ignore this. */
149 continue;
150 }
151
39f77062 152 if (!target_thread_alive (pid_to_ptid (pid)))
c5aa993b
JM
153 {
154 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
39f77062 155 return pid_to_ptid (pid);
c5aa993b 156 }
47932f85 157 } while (pid != PIDGET (inferior_ptid)); /* Some other child died or stopped */
c906108c
SS
158
159 store_waitstatus (ourstatus, status);
39f77062 160 return pid_to_ptid (pid);
c906108c
SS
161}
162#endif /* CHILD_WAIT */
163
164#if !defined(CHILD_POST_WAIT)
165void
39f77062 166child_post_wait (ptid_t ptid, int wait_status)
c906108c
SS
167{
168 /* This version of Unix doesn't require a meaningful "post wait"
169 operation.
c5aa993b 170 */
c906108c
SS
171}
172#endif
c5aa993b 173
c906108c
SS
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
39f77062 183child_thread_alive (ptid_t ptid)
c906108c 184{
39f77062
KB
185 pid_t pid = PIDGET (ptid);
186
c906108c
SS
187 return (kill (pid, 0) != -1);
188}
189
190#endif
191
4c9ba7e0
DJ
192/* Attach to process PID, then initialize for debugging it. */
193
c906108c 194static void
4c9ba7e0 195child_attach (char *args, int from_tty)
c906108c
SS
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
c5aa993b 214 if (pid == getpid ()) /* Trying to masturbate? */
c906108c
SS
215 error ("I refuse to debug myself!");
216
217 if (from_tty)
218 {
219 exec_file = (char *) get_exec_file (0);
220
4c9ba7e0 221 if (exec_file)
c906108c 222 printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
39f77062 223 target_pid_to_str (pid_to_ptid (pid)));
c5aa993b 224 else
39f77062
KB
225 printf_unfiltered ("Attaching to %s\n",
226 target_pid_to_str (pid_to_ptid (pid)));
c906108c
SS
227
228 gdb_flush (gdb_stdout);
229 }
230
4c9ba7e0 231 attach (pid);
c906108c 232
39f77062 233 inferior_ptid = pid_to_ptid (pid);
c906108c
SS
234 push_target (&child_ops);
235 }
c5aa993b 236#endif /* ATTACH_DETACH */
c906108c
SS
237}
238
c906108c
SS
239#if !defined(CHILD_POST_ATTACH)
240void
fba45db2 241child_post_attach (int pid)
c906108c
SS
242{
243 /* This version of Unix doesn't require a meaningful "post attach"
244 operation by a debugger. */
245}
246#endif
247
4c9ba7e0
DJ
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). */
c906108c
SS
255
256static void
4c9ba7e0 257child_detach (char *args, int from_tty)
c906108c
SS
258{
259#ifdef ATTACH_DETACH
260 {
261 int siggnal = 0;
4c9ba7e0 262 int pid = PIDGET (inferior_ptid);
c906108c
SS
263
264 if (from_tty)
265 {
266 char *exec_file = get_exec_file (0);
267 if (exec_file == 0)
268 exec_file = "";
4c9ba7e0
DJ
269 printf_unfiltered ("Detaching from program: %s, %s\n", exec_file,
270 target_pid_to_str (pid_to_ptid (pid)));
c906108c
SS
271 gdb_flush (gdb_stdout);
272 }
273 if (args)
274 siggnal = atoi (args);
275
4c9ba7e0
DJ
276 detach (siggnal);
277
278 inferior_ptid = null_ptid;
279 unpush_target (&child_ops);
c906108c
SS
280 }
281#else
282 error ("This version of Unix does not support detaching a process.");
283#endif
284}
285
c906108c
SS
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
fba45db2 293child_prepare_to_store (void)
c906108c
SS
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
fba45db2 303child_files_info (struct target_ops *ignore)
c906108c
SS
304{
305 printf_unfiltered ("\tUsing the running image of %s %s.\n",
39f77062 306 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
c906108c
SS
307}
308
309/* ARGSUSED */
310static void
fba45db2 311child_open (char *arg, int from_tty)
c906108c
SS
312{
313 error ("Use the \"run\" command to start a Unix child process.");
314}
315
316/* Stub function which causes the inferior that runs it, to be ptrace-able
317 by its parent process. */
318
319static void
fba45db2 320ptrace_me (void)
c906108c
SS
321{
322 /* "Trace me, Dr. Memory!" */
323 call_ptrace (0, 0, (PTRACE_ARG3_TYPE) 0, 0);
324}
325
326/* Stub function which causes the GDB that runs it, to start ptrace-ing
327 the child process. */
328
c5aa993b 329static void
fba45db2 330ptrace_him (int pid)
c906108c
SS
331{
332 push_target (&child_ops);
333
334 /* On some targets, there must be some explicit synchronization
335 between the parent and child processes after the debugger
336 forks, and before the child execs the debuggee program. This
337 call basically gives permission for the child to exec.
c5aa993b 338 */
c906108c
SS
339
340 target_acknowledge_created_inferior (pid);
341
342 /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h,
343 * and will be 1 or 2 depending on whether we're starting
344 * without or with a shell.
345 */
346 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
347
348 /* On some targets, there must be some explicit actions taken after
349 the inferior has been started up.
c5aa993b 350 */
39f77062 351 target_post_startup_inferior (pid_to_ptid (pid));
c906108c
SS
352}
353
39f77062 354/* Start an inferior Unix child process and sets inferior_ptid to its pid.
c906108c
SS
355 EXEC_FILE is the file to run.
356 ALLARGS is a string containing the arguments to the program.
357 ENV is the environment vector to pass. Errors reported with error(). */
358
359static void
fba45db2 360child_create_inferior (char *exec_file, char *allargs, char **env)
c906108c 361{
c906108c 362#ifdef HPUXHPPA
c906108c
SS
363 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
364#else
c5aa993b 365 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
c906108c
SS
366#endif
367 /* We are at the first instruction we care about. */
368 /* Pedal to the metal... */
2acceee2 369 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
c906108c
SS
370}
371
372#if !defined(CHILD_POST_STARTUP_INFERIOR)
373void
39f77062 374child_post_startup_inferior (ptid_t ptid)
c906108c
SS
375{
376 /* This version of Unix doesn't require a meaningful "post startup inferior"
377 operation by a debugger.
c5aa993b 378 */
c906108c
SS
379}
380#endif
381
382#if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
383void
fba45db2 384child_acknowledge_created_inferior (int pid)
c906108c
SS
385{
386 /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
387 operation by a debugger.
c5aa993b 388 */
c906108c
SS
389}
390#endif
391
392
c906108c
SS
393#if !defined(CHILD_INSERT_FORK_CATCHPOINT)
394int
fba45db2 395child_insert_fork_catchpoint (int pid)
c906108c
SS
396{
397 /* This version of Unix doesn't support notification of fork events. */
398 return 0;
399}
400#endif
401
402#if !defined(CHILD_REMOVE_FORK_CATCHPOINT)
403int
fba45db2 404child_remove_fork_catchpoint (int pid)
c906108c
SS
405{
406 /* This version of Unix doesn't support notification of fork events. */
407 return 0;
408}
409#endif
410
411#if !defined(CHILD_INSERT_VFORK_CATCHPOINT)
412int
fba45db2 413child_insert_vfork_catchpoint (int pid)
c906108c
SS
414{
415 /* This version of Unix doesn't support notification of vfork events. */
416 return 0;
417}
418#endif
419
420#if !defined(CHILD_REMOVE_VFORK_CATCHPOINT)
421int
fba45db2 422child_remove_vfork_catchpoint (int pid)
c906108c
SS
423{
424 /* This version of Unix doesn't support notification of vfork events. */
425 return 0;
426}
427#endif
428
6604731b
DJ
429#if !defined(CHILD_FOLLOW_FORK)
430int
431child_follow_fork (int follow_child)
c906108c 432{
6604731b
DJ
433 /* This version of Unix doesn't support following fork or vfork events. */
434 return 0;
c906108c
SS
435}
436#endif
437
438#if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
439int
fba45db2 440child_insert_exec_catchpoint (int pid)
c906108c
SS
441{
442 /* This version of Unix doesn't support notification of exec events. */
443 return 0;
444}
445#endif
446
447#if !defined(CHILD_REMOVE_EXEC_CATCHPOINT)
448int
fba45db2 449child_remove_exec_catchpoint (int pid)
c906108c
SS
450{
451 /* This version of Unix doesn't support notification of exec events. */
452 return 0;
453}
454#endif
455
c906108c
SS
456#if !defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
457int
fba45db2 458child_reported_exec_events_per_exec_call (void)
c906108c
SS
459{
460 /* This version of Unix doesn't support notification of exec events.
c5aa993b 461 */
c906108c
SS
462 return 1;
463}
464#endif
465
c906108c
SS
466#if !defined(CHILD_HAS_EXITED)
467int
fba45db2 468child_has_exited (int pid, int wait_status, int *exit_status)
c906108c
SS
469{
470 if (WIFEXITED (wait_status))
471 {
472 *exit_status = WEXITSTATUS (wait_status);
473 return 1;
474 }
475
476 if (WIFSIGNALED (wait_status))
477 {
c5aa993b 478 *exit_status = 0; /* ?? Don't know what else to say here. */
c906108c
SS
479 return 1;
480 }
481
482 /* ?? Do we really need to consult the event state, too? Assume the
c5aa993b 483 wait_state alone suffices.
c906108c
SS
484 */
485 return 0;
486}
487#endif
488
489
490static void
fba45db2 491child_mourn_inferior (void)
c906108c 492{
c906108c 493 unpush_target (&child_ops);
c906108c
SS
494 generic_mourn_inferior ();
495}
496
497static int
fba45db2 498child_can_run (void)
c906108c
SS
499{
500 /* This variable is controlled by modules that sit atop inftarg that may layer
501 their own process structure atop that provided here. hpux-thread.c does
502 this because of the Hpux user-mode level thread model. */
503
504 return !child_suppress_run;
505}
506
507/* Send a SIGINT to the process group. This acts just like the user typed a
508 ^C on the controlling terminal.
509
510 XXX - This may not be correct for all systems. Some may want to use
511 killpg() instead of kill (-pgrp). */
512
513static void
fba45db2 514child_stop (void)
c906108c 515{
c906108c
SS
516 kill (-inferior_process_group, SIGINT);
517}
518
519#if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
520struct symtab_and_line *
fba45db2 521child_enable_exception_callback (enum exception_event_kind kind, int enable)
c906108c
SS
522{
523 return (struct symtab_and_line *) NULL;
524}
525#endif
526
527#if !defined(CHILD_GET_CURRENT_EXCEPTION_EVENT)
528struct exception_event_record *
fba45db2 529child_get_current_exception_event (void)
c906108c
SS
530{
531 return (struct exception_event_record *) NULL;
532}
533#endif
534
535
536#if !defined(CHILD_PID_TO_EXEC_FILE)
537char *
fba45db2 538child_pid_to_exec_file (int pid)
c906108c
SS
539{
540 /* This version of Unix doesn't support translation of a process ID
541 to the filename of the executable file.
c5aa993b 542 */
c906108c
SS
543 return NULL;
544}
545#endif
546
547char *
fba45db2 548child_core_file_to_sym_file (char *core)
c906108c
SS
549{
550 /* The target stratum for a running executable need not support
551 this operation.
c5aa993b 552 */
c906108c
SS
553 return NULL;
554}
c5aa993b 555\f
c906108c 556
ed9a39eb
JM
557#if !defined(CHILD_PID_TO_STR)
558char *
39f77062 559child_pid_to_str (ptid_t ptid)
ed9a39eb 560{
39f77062 561 return normal_pid_to_str (ptid);
ed9a39eb
JM
562}
563#endif
c906108c 564
c906108c 565static void
fba45db2 566init_child_ops (void)
c906108c
SS
567{
568 child_ops.to_shortname = "child";
569 child_ops.to_longname = "Unix child process";
570 child_ops.to_doc = "Unix child process (started by the \"run\" command).";
571 child_ops.to_open = child_open;
572 child_ops.to_attach = child_attach;
573 child_ops.to_post_attach = child_post_attach;
c906108c 574 child_ops.to_detach = child_detach;
c906108c
SS
575 child_ops.to_resume = child_resume;
576 child_ops.to_wait = child_wait;
577 child_ops.to_post_wait = child_post_wait;
578 child_ops.to_fetch_registers = fetch_inferior_registers;
579 child_ops.to_store_registers = store_inferior_registers;
580 child_ops.to_prepare_to_store = child_prepare_to_store;
581 child_ops.to_xfer_memory = child_xfer_memory;
582 child_ops.to_files_info = child_files_info;
583 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
584 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
585 child_ops.to_terminal_init = terminal_init_inferior;
586 child_ops.to_terminal_inferior = terminal_inferior;
587 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
a790ad35 588 child_ops.to_terminal_save_ours = terminal_save_ours;
c906108c
SS
589 child_ops.to_terminal_ours = terminal_ours;
590 child_ops.to_terminal_info = child_terminal_info;
591 child_ops.to_kill = kill_inferior;
592 child_ops.to_create_inferior = child_create_inferior;
593 child_ops.to_post_startup_inferior = child_post_startup_inferior;
594 child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
c906108c
SS
595 child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
596 child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
597 child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
598 child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
6604731b 599 child_ops.to_follow_fork = child_follow_fork;
c906108c
SS
600 child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
601 child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
c906108c 602 child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
c906108c
SS
603 child_ops.to_has_exited = child_has_exited;
604 child_ops.to_mourn_inferior = child_mourn_inferior;
605 child_ops.to_can_run = child_can_run;
606 child_ops.to_thread_alive = child_thread_alive;
ed9a39eb 607 child_ops.to_pid_to_str = child_pid_to_str;
c906108c
SS
608 child_ops.to_stop = child_stop;
609 child_ops.to_enable_exception_callback = child_enable_exception_callback;
610 child_ops.to_get_current_exception_event = child_get_current_exception_event;
611 child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
c906108c
SS
612 child_ops.to_stratum = process_stratum;
613 child_ops.to_has_all_memory = 1;
614 child_ops.to_has_memory = 1;
615 child_ops.to_has_stack = 1;
616 child_ops.to_has_registers = 1;
617 child_ops.to_has_execution = 1;
618 child_ops.to_magic = OPS_MAGIC;
619}
620
be4d1333
MS
621/* Take over the 'find_mapped_memory' vector from inftarg.c. */
622extern void
623inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
624 unsigned long,
625 int, int, int,
626 void *),
627 void *))
628{
629 child_ops.to_find_memory_regions = func;
630}
631
632/* Take over the 'make_corefile_notes' vector from inftarg.c. */
633extern void
634inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
635{
636 child_ops.to_make_corefile_notes = func;
637}
638
c906108c 639void
fba45db2 640_initialize_inftarg (void)
c906108c
SS
641{
642#ifdef HAVE_OPTIONAL_PROC_FS
643 char procname[32];
644 int fd;
645
646 /* If we have an optional /proc filesystem (e.g. under OSF/1),
647 don't add ptrace support if we can access the running GDB via /proc. */
648#ifndef PROC_NAME_FMT
649#define PROC_NAME_FMT "/proc/%05d"
650#endif
651 sprintf (procname, PROC_NAME_FMT, getpid ());
bde58177
AC
652 fd = open (procname, O_RDONLY);
653 if (fd >= 0)
c906108c
SS
654 {
655 close (fd);
656 return;
657 }
658#endif
659
660 init_child_ops ();
661 add_target (&child_ops);
662}
This page took 0.319428 seconds and 4 git commands to generate.