2004-05-17 Andrew Cagney <cagney@redhat.com>
[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,
baf92889 4 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
1bac305b 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
2146d243 225 printf_unfiltered ("Attaching to %s\n",
39f77062 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
c906108c 309static void
fba45db2 310child_open (char *arg, int from_tty)
c906108c
SS
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
fba45db2 319ptrace_me (void)
c906108c
SS
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
c5aa993b 328static void
fba45db2 329ptrace_him (int pid)
c906108c
SS
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.
c5aa993b 337 */
c906108c
SS
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.
c5aa993b 349 */
39f77062 350 target_post_startup_inferior (pid_to_ptid (pid));
c906108c
SS
351}
352
39f77062 353/* Start an inferior Unix child process and sets inferior_ptid to its pid.
c906108c
SS
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
fba45db2 359child_create_inferior (char *exec_file, char *allargs, char **env)
c906108c 360{
c906108c 361#ifdef HPUXHPPA
c906108c
SS
362 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
363#else
c5aa993b 364 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
c906108c
SS
365#endif
366 /* We are at the first instruction we care about. */
367 /* Pedal to the metal... */
2acceee2 368 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
c906108c
SS
369}
370
371#if !defined(CHILD_POST_STARTUP_INFERIOR)
372void
39f77062 373child_post_startup_inferior (ptid_t ptid)
c906108c
SS
374{
375 /* This version of Unix doesn't require a meaningful "post startup inferior"
376 operation by a debugger.
c5aa993b 377 */
c906108c
SS
378}
379#endif
380
381#if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
382void
fba45db2 383child_acknowledge_created_inferior (int pid)
c906108c
SS
384{
385 /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
386 operation by a debugger.
c5aa993b 387 */
c906108c
SS
388}
389#endif
390
391
c906108c
SS
392#if !defined(CHILD_INSERT_FORK_CATCHPOINT)
393int
fba45db2 394child_insert_fork_catchpoint (int pid)
c906108c
SS
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
fba45db2 403child_remove_fork_catchpoint (int pid)
c906108c
SS
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
fba45db2 412child_insert_vfork_catchpoint (int pid)
c906108c
SS
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
fba45db2 421child_remove_vfork_catchpoint (int pid)
c906108c
SS
422{
423 /* This version of Unix doesn't support notification of vfork events. */
424 return 0;
425}
426#endif
427
6604731b
DJ
428#if !defined(CHILD_FOLLOW_FORK)
429int
430child_follow_fork (int follow_child)
c906108c 431{
6604731b
DJ
432 /* This version of Unix doesn't support following fork or vfork events. */
433 return 0;
c906108c
SS
434}
435#endif
436
437#if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
438int
fba45db2 439child_insert_exec_catchpoint (int pid)
c906108c
SS
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
fba45db2 448child_remove_exec_catchpoint (int pid)
c906108c
SS
449{
450 /* This version of Unix doesn't support notification of exec events. */
451 return 0;
452}
453#endif
454
c906108c
SS
455#if !defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
456int
fba45db2 457child_reported_exec_events_per_exec_call (void)
c906108c
SS
458{
459 /* This version of Unix doesn't support notification of exec events.
c5aa993b 460 */
c906108c
SS
461 return 1;
462}
463#endif
464
c906108c
SS
465#if !defined(CHILD_HAS_EXITED)
466int
fba45db2 467child_has_exited (int pid, int wait_status, int *exit_status)
c906108c
SS
468{
469 if (WIFEXITED (wait_status))
470 {
471 *exit_status = WEXITSTATUS (wait_status);
472 return 1;
473 }
474
475 if (WIFSIGNALED (wait_status))
476 {
c5aa993b 477 *exit_status = 0; /* ?? Don't know what else to say here. */
c906108c
SS
478 return 1;
479 }
480
481 /* ?? Do we really need to consult the event state, too? Assume the
c5aa993b 482 wait_state alone suffices.
c906108c
SS
483 */
484 return 0;
485}
486#endif
487
488
489static void
fba45db2 490child_mourn_inferior (void)
c906108c 491{
c906108c 492 unpush_target (&child_ops);
c906108c
SS
493 generic_mourn_inferior ();
494}
495
496static int
fba45db2 497child_can_run (void)
c906108c
SS
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
fba45db2 513child_stop (void)
c906108c 514{
c906108c
SS
515 kill (-inferior_process_group, SIGINT);
516}
517
518#if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
519struct symtab_and_line *
fba45db2 520child_enable_exception_callback (enum exception_event_kind kind, int enable)
c906108c
SS
521{
522 return (struct symtab_and_line *) NULL;
523}
524#endif
525
526#if !defined(CHILD_GET_CURRENT_EXCEPTION_EVENT)
527struct exception_event_record *
fba45db2 528child_get_current_exception_event (void)
c906108c
SS
529{
530 return (struct exception_event_record *) NULL;
531}
532#endif
533
534
535#if !defined(CHILD_PID_TO_EXEC_FILE)
536char *
fba45db2 537child_pid_to_exec_file (int pid)
c906108c
SS
538{
539 /* This version of Unix doesn't support translation of a process ID
540 to the filename of the executable file.
c5aa993b 541 */
c906108c
SS
542 return NULL;
543}
544#endif
545
546char *
fba45db2 547child_core_file_to_sym_file (char *core)
c906108c
SS
548{
549 /* The target stratum for a running executable need not support
550 this operation.
c5aa993b 551 */
c906108c
SS
552 return NULL;
553}
f168dd80
AC
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
8aa91c1e
AC
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)
f168dd80
AC
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
f168dd80
AC
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
8aa91c1e
AC
578 return NATIVE_XFER_UNWIND_TABLE (ops, object, annex, readbuf, writebuf,
579 offset, len);
f168dd80 580
f168dd80 581 case TARGET_OBJECT_AUXV:
2146d243
RM
582#ifndef NATIVE_XFER_AUXV
583#define NATIVE_XFER_AUXV(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
f168dd80 584#endif
2146d243
RM
585 return NATIVE_XFER_AUXV (ops, object, annex, readbuf, writebuf,
586 offset, len);
f168dd80 587
baf92889
MK
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
f168dd80
AC
595 default:
596 return -1;
597 }
598}
c906108c 599
ed9a39eb
JM
600#if !defined(CHILD_PID_TO_STR)
601char *
39f77062 602child_pid_to_str (ptid_t ptid)
ed9a39eb 603{
39f77062 604 return normal_pid_to_str (ptid);
ed9a39eb
JM
605}
606#endif
c906108c 607
c906108c 608static void
fba45db2 609init_child_ops (void)
c906108c
SS
610{
611 child_ops.to_shortname = "child";
612 child_ops.to_longname = "Unix child process";
613 child_ops.to_doc = "Unix child process (started by the \"run\" command).";
614 child_ops.to_open = child_open;
615 child_ops.to_attach = child_attach;
616 child_ops.to_post_attach = child_post_attach;
c906108c 617 child_ops.to_detach = child_detach;
c906108c
SS
618 child_ops.to_resume = child_resume;
619 child_ops.to_wait = child_wait;
620 child_ops.to_post_wait = child_post_wait;
621 child_ops.to_fetch_registers = fetch_inferior_registers;
622 child_ops.to_store_registers = store_inferior_registers;
623 child_ops.to_prepare_to_store = child_prepare_to_store;
624 child_ops.to_xfer_memory = child_xfer_memory;
f168dd80 625 child_ops.to_xfer_partial = child_xfer_partial;
c906108c
SS
626 child_ops.to_files_info = child_files_info;
627 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
628 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
629 child_ops.to_terminal_init = terminal_init_inferior;
630 child_ops.to_terminal_inferior = terminal_inferior;
631 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
a790ad35 632 child_ops.to_terminal_save_ours = terminal_save_ours;
c906108c
SS
633 child_ops.to_terminal_ours = terminal_ours;
634 child_ops.to_terminal_info = child_terminal_info;
635 child_ops.to_kill = kill_inferior;
636 child_ops.to_create_inferior = child_create_inferior;
637 child_ops.to_post_startup_inferior = child_post_startup_inferior;
638 child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
c906108c
SS
639 child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
640 child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
641 child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
642 child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
6604731b 643 child_ops.to_follow_fork = child_follow_fork;
c906108c
SS
644 child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
645 child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
c906108c 646 child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
c906108c
SS
647 child_ops.to_has_exited = child_has_exited;
648 child_ops.to_mourn_inferior = child_mourn_inferior;
649 child_ops.to_can_run = child_can_run;
650 child_ops.to_thread_alive = child_thread_alive;
ed9a39eb 651 child_ops.to_pid_to_str = child_pid_to_str;
c906108c
SS
652 child_ops.to_stop = child_stop;
653 child_ops.to_enable_exception_callback = child_enable_exception_callback;
654 child_ops.to_get_current_exception_event = child_get_current_exception_event;
655 child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
c906108c
SS
656 child_ops.to_stratum = process_stratum;
657 child_ops.to_has_all_memory = 1;
658 child_ops.to_has_memory = 1;
659 child_ops.to_has_stack = 1;
660 child_ops.to_has_registers = 1;
661 child_ops.to_has_execution = 1;
662 child_ops.to_magic = OPS_MAGIC;
663}
664
be4d1333 665/* Take over the 'find_mapped_memory' vector from inftarg.c. */
2146d243
RM
666extern void
667inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
668 unsigned long,
669 int, int, int,
be4d1333
MS
670 void *),
671 void *))
672{
673 child_ops.to_find_memory_regions = func;
674}
675
676/* Take over the 'make_corefile_notes' vector from inftarg.c. */
2146d243 677extern void
be4d1333
MS
678inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
679{
680 child_ops.to_make_corefile_notes = func;
681}
682
c906108c 683void
fba45db2 684_initialize_inftarg (void)
c906108c
SS
685{
686#ifdef HAVE_OPTIONAL_PROC_FS
687 char procname[32];
688 int fd;
689
690 /* If we have an optional /proc filesystem (e.g. under OSF/1),
691 don't add ptrace support if we can access the running GDB via /proc. */
692#ifndef PROC_NAME_FMT
693#define PROC_NAME_FMT "/proc/%05d"
694#endif
695 sprintf (procname, PROC_NAME_FMT, getpid ());
bde58177
AC
696 fd = open (procname, O_RDONLY);
697 if (fd >= 0)
c906108c
SS
698 {
699 close (fd);
700 return;
701 }
702#endif
703
704 init_child_ops ();
705 add_target (&child_ops);
706}
This page took 0.37928 seconds and 4 git commands to generate.