| /* Default child (native) target interface, for GDB when running under |
| Unix. |
| |
| Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, |
| 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. |
| |
| This file is part of GDB. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place - Suite 330, |
| Boston, MA 02111-1307, USA. */ |
| |
| #include "defs.h" |
| #include "regcache.h" |
| #include "memattr.h" |
| #include "symtab.h" |
| #include "target.h" |
| #include "inferior.h" |
| #include "gdb_string.h" |
| |
| /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this |
| for all registers. */ |
| |
| static void |
| inf_child_fetch_inferior_registers (int regnum) |
| { |
| if (regnum == -1) |
| { |
| for (regnum = 0; regnum < NUM_REGS; regnum++) |
| regcache_raw_supply (current_regcache, regnum, NULL); |
| } |
| else |
| regcache_raw_supply (current_regcache, regnum, NULL); |
| } |
| |
| /* Store register REGNUM back into the inferior. If REGNUM is -1, do |
| this for all registers (including the floating point registers). */ |
| |
| static void |
| inf_child_store_inferior_registers (int regnum) |
| { |
| } |
| |
| static void |
| inf_child_post_attach (int pid) |
| { |
| /* This version of Unix doesn't require a meaningful "post attach" |
| operation by a debugger. */ |
| } |
| |
| /* Get ready to modify the registers array. On machines which store |
| individual registers, this doesn't need to do anything. On |
| machines which store all the registers in one fell swoop, this |
| makes sure that registers contains all the registers from the |
| program being debugged. */ |
| |
| static void |
| inf_child_prepare_to_store (void) |
| { |
| } |
| |
| static void |
| inf_child_open (char *arg, int from_tty) |
| { |
| error (_("Use the \"run\" command to start a Unix child process.")); |
| } |
| |
| static void |
| inf_child_post_startup_inferior (ptid_t ptid) |
| { |
| /* This version of Unix doesn't require a meaningful "post startup |
| inferior" operation by a debugger. */ |
| } |
| |
| static void |
| inf_child_acknowledge_created_inferior (int pid) |
| { |
| /* This version of Unix doesn't require a meaningful "acknowledge |
| created inferior" operation by a debugger. */ |
| } |
| |
| static void |
| inf_child_insert_fork_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of fork |
| events. */ |
| } |
| |
| static int |
| inf_child_remove_fork_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of fork |
| events. */ |
| return 0; |
| } |
| |
| static void |
| inf_child_insert_vfork_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of vfork |
| events. */ |
| } |
| |
| static int |
| inf_child_remove_vfork_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of vfork |
| events. */ |
| return 0; |
| } |
| |
| static int |
| inf_child_follow_fork (struct target_ops *ops, int follow_child) |
| { |
| /* This version of Unix doesn't support following fork or vfork |
| events. */ |
| return 0; |
| } |
| |
| static void |
| inf_child_insert_exec_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of exec |
| events. */ |
| } |
| |
| static int |
| inf_child_remove_exec_catchpoint (int pid) |
| { |
| /* This version of Unix doesn't support notification of exec |
| events. */ |
| return 0; |
| } |
| |
| static int |
| inf_child_reported_exec_events_per_exec_call (void) |
| { |
| /* This version of Unix doesn't support notification of exec |
| events. */ |
| return 1; |
| } |
| |
| static int |
| inf_child_can_run (void) |
| { |
| return 1; |
| } |
| |
| static struct symtab_and_line * |
| inf_child_enable_exception_callback (enum exception_event_kind kind, |
| int enable) |
| { |
| return (struct symtab_and_line *) NULL; |
| } |
| |
| static struct exception_event_record * |
| inf_child_get_current_exception_event (void) |
| { |
| return (struct exception_event_record *) NULL; |
| } |
| |
| static char * |
| inf_child_pid_to_exec_file (int pid) |
| { |
| /* This version of Unix doesn't support translation of a process ID |
| to the filename of the executable file. */ |
| return NULL; |
| } |
| |
| struct target_ops * |
| inf_child_target (void) |
| { |
| struct target_ops *t = XZALLOC (struct target_ops); |
| t->to_shortname = "child"; |
| t->to_longname = "Unix child process"; |
| t->to_doc = "Unix child process (started by the \"run\" command)."; |
| t->to_open = inf_child_open; |
| t->to_post_attach = inf_child_post_attach; |
| t->to_fetch_registers = inf_child_fetch_inferior_registers; |
| t->to_store_registers = inf_child_store_inferior_registers; |
| t->to_prepare_to_store = inf_child_prepare_to_store; |
| t->to_insert_breakpoint = memory_insert_breakpoint; |
| t->to_remove_breakpoint = memory_remove_breakpoint; |
| t->to_terminal_init = terminal_init_inferior; |
| t->to_terminal_inferior = terminal_inferior; |
| t->to_terminal_ours_for_output = terminal_ours_for_output; |
| t->to_terminal_save_ours = terminal_save_ours; |
| t->to_terminal_ours = terminal_ours; |
| t->to_terminal_info = child_terminal_info; |
| t->to_post_startup_inferior = inf_child_post_startup_inferior; |
| t->to_acknowledge_created_inferior = inf_child_acknowledge_created_inferior; |
| t->to_insert_fork_catchpoint = inf_child_insert_fork_catchpoint; |
| t->to_remove_fork_catchpoint = inf_child_remove_fork_catchpoint; |
| t->to_insert_vfork_catchpoint = inf_child_insert_vfork_catchpoint; |
| t->to_remove_vfork_catchpoint = inf_child_remove_vfork_catchpoint; |
| t->to_follow_fork = inf_child_follow_fork; |
| t->to_insert_exec_catchpoint = inf_child_insert_exec_catchpoint; |
| t->to_remove_exec_catchpoint = inf_child_remove_exec_catchpoint; |
| t->to_reported_exec_events_per_exec_call = |
| inf_child_reported_exec_events_per_exec_call; |
| t->to_can_run = inf_child_can_run; |
| t->to_enable_exception_callback = inf_child_enable_exception_callback; |
| t->to_get_current_exception_event = inf_child_get_current_exception_event; |
| t->to_pid_to_exec_file = inf_child_pid_to_exec_file; |
| t->to_stratum = process_stratum; |
| t->to_has_all_memory = 1; |
| t->to_has_memory = 1; |
| t->to_has_stack = 1; |
| t->to_has_registers = 1; |
| t->to_has_execution = 1; |
| t->to_magic = OPS_MAGIC; |
| return t; |
| } |