35 #include "gdb/callback.h" 36 #include "gdb/remote-sim.h" 41 #include "readline/readline.h" 76 static
void gdbsim_open (const
char *args,
int from_tty);
102 static const struct inferior_data *sim_inferior_data_key;
105 struct sim_inferior_data {
110 SIM_DESC gdbsim_desc;
120 enum gdb_signal resume_siggnal;
134 #define INITIAL_PID 42000 153 struct sim_inferior_data *sim_data;
154 SIM_DESC new_sim_desc = (SIM_DESC) arg;
156 sim_data = ((
struct sim_inferior_data *)
157 inferior_data (
inf, sim_inferior_data_key));
159 return (sim_data != NULL && sim_data->gdbsim_desc == new_sim_desc);
170 static struct sim_inferior_data *
173 SIM_DESC sim_desc = NULL;
174 struct sim_inferior_data *sim_data
175 = (
struct sim_inferior_data *) inferior_data (
inf, sim_inferior_data_key);
182 && (sim_data == NULL || sim_data->gdbsim_desc == NULL))
186 if (sim_desc == NULL)
187 error (
_(
"Unable to create simulator instance for inferior %d."),
202 _(
"Inferior %d and inferior %d would have identical simulator state.\n" 203 "(This simulator does not support the running of more than one inferior.)"),
208 if (sim_data == NULL)
210 sim_data =
XCNEW(
struct sim_inferior_data);
211 set_inferior_data (
inf, sim_inferior_data_key, sim_data);
218 sim_data->program_loaded = 0;
219 sim_data->gdbsim_desc = sim_desc;
220 sim_data->resume_siggnal = GDB_SIGNAL_0;
221 sim_data->resume_step = 0;
227 sim_data->gdbsim_desc = sim_desc;
238 static struct sim_inferior_data *
260 struct sim_inferior_data *sim_data = (
struct sim_inferior_data *) data;
262 if (sim_data != NULL)
264 if (sim_data->gdbsim_desc)
266 sim_close (sim_data->gdbsim_desc, 0);
267 sim_data->gdbsim_desc = NULL;
278 if (len == 8 || len == 4)
282 memcpy (l, buf, len);
291 for (i = 0; i < len; i++)
361 for (i = 0; i < len; i++)
385 va_start (args, format);
409 gdb_os_error (host_callback * p,
const char *format, ...)
413 va_start (args, format);
432 struct sim_inferior_data *sim_data
456 static int warn_user = 1;
462 nr_bytes = sim_fetch_register (sim_data->gdbsim_desc,
465 buf.data (), regsize);
466 if (nr_bytes > 0 && nr_bytes != regsize && warn_user)
469 "Size of register %s (%d/%d) " 470 "incorrect (%d instead of %d))",
486 "gdbsim_fetch_register: %d", regno);
502 struct sim_inferior_data *sim_data
518 nr_bytes = sim_store_register (sim_data->gdbsim_desc,
521 tmp.data (), regsize);
523 if (nr_bytes > 0 && nr_bytes != regsize)
525 _(
"Register size different to expected"));
528 _(
"Register %d not updated"), regno);
530 warning (
_(
"Register %s not updated"),
564 struct sim_inferior_data *sim_data
572 prog = tilde_expand (
argv[0]);
575 error (
_(
"GDB sim does not yet support a load offset."));
583 if (sim_load (sim_data->gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
584 error (
_(
"unable to load program"));
589 sim_data->program_loaded = 1;
603 const std::string &allargs,
char **env,
int from_tty)
605 struct sim_inferior_data *sim_data
609 const char *args = allargs.c_str ();
611 if (exec_file == 0 ||
exec_bfd == 0)
612 warning (
_(
"No executable file specified."));
613 if (!sim_data->program_loaded)
618 "gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
619 (exec_file ? exec_file :
"(NULL)"),
628 if (exec_file != NULL)
630 len = strlen (exec_file) + 1 + allargs.size () + 1 + 10;
631 arg_buf = (
char *) alloca (len);
633 strcat (arg_buf, exec_file);
634 strcat (arg_buf,
" ");
635 strcat (arg_buf, args);
636 built_argv.
reset (arg_buf);
642 if (sim_create_inferior (sim_data->gdbsim_desc,
exec_bfd,
643 built_argv.
get (), env)
645 error (
_(
"Unable to create sim inferior."));
667 struct sim_inferior_data *sim_data;
669 SIM_DESC gdbsim_desc;
677 "gdbsim_open: args \"%s\"\n", args ? args :
"(null)");
690 + strlen (
" -E little")
691 + strlen (
" --architecture=xxxxxxxxxx")
692 + strlen (
" --sysroot=") + strlen (sysroot) +
693 + (args ? strlen (args) : 0)
695 arg_buf = (
char *) alloca (len);
696 strcpy (arg_buf,
"gdbsim");
702 strcat (arg_buf,
" -E big");
704 case BFD_ENDIAN_LITTLE:
705 strcat (arg_buf,
" -E little");
707 case BFD_ENDIAN_UNKNOWN:
714 strcat (arg_buf,
" --architecture=");
718 strcat (arg_buf,
" --sysroot=");
719 strcat (arg_buf, sysroot);
723 strcat (arg_buf,
" ");
724 strcat (arg_buf, args);
733 if (gdbsim_desc == 0)
736 error (
_(
"unable to create simulator instance"));
749 sim_data->gdbsim_desc = gdbsim_desc;
767 struct sim_inferior_data *sim_data
768 = (
struct sim_inferior_data *) inferior_data (
inf, sim_inferior_data_key);
769 if (sim_data != NULL)
771 ptid_t ptid = sim_data->remote_sim_ptid;
774 set_inferior_data (
inf, sim_inferior_data_key, NULL);
796 struct sim_inferior_data *sim_data
848 struct sim_inferior_data *sim_data
854 sim_data->resume_siggnal = rd->
siggnal;
855 sim_data->resume_step = rd->
step;
859 _(
"gdbsim_resume: pid %d, step %d, signal %d\n"),
874 struct sim_inferior_data *sim_data
892 error (
_(
"The program is not being run."));
907 struct sim_inferior_data *sim_data
912 if (!sim_stop (sim_data->gdbsim_desc))
927 struct sim_inferior_data *sim_data;
938 error (
_(
"Can't stop pid %d. No inferior found."),
973 struct sim_inferior_data *sim_data;
974 static sighandler_t prev_sigint;
976 enum sim_stop reason = sim_running;
987 if (sim_data == NULL)
988 error (
_(
"Unable to wait for pid %d. Inferior not found."),
996 #if defined (HAVE_SIGACTION) && defined (SA_RESTART) 998 struct sigaction sa, osa;
1000 sigemptyset (&sa.sa_mask);
1002 sigaction (SIGINT, &sa, &osa);
1003 prev_sigint = osa.sa_handler;
1008 sim_resume (sim_data->gdbsim_desc, sim_data->resume_step,
1009 sim_data->resume_siggnal);
1011 signal (SIGINT, prev_sigint);
1012 sim_data->resume_step = 0;
1014 sim_stop_reason (sim_data->gdbsim_desc, &reason, &sigrc);
1020 status->value.integer = sigrc;
1025 case GDB_SIGNAL_ABRT:
1028 case GDB_SIGNAL_INT:
1029 case GDB_SIGNAL_TRAP:
1032 status->value.sig = (
enum gdb_signal) sigrc;
1038 status->value.sig = (
enum gdb_signal) sigrc;
1069 struct sim_inferior_data *sim_data
1079 if (!sim_data->program_loaded)
1080 error (
_(
"No program loaded."));
1092 "gdbsim_xfer_memory: readbuf %s, writebuf %s, " 1093 "memaddr %s, len %s\n",
1103 l = sim_write (sim_data->gdbsim_desc, memaddr, writebuf, len);
1107 l = sim_read (sim_data->gdbsim_desc, memaddr, readbuf, len);
1126 const char *annex,
gdb_byte *readbuf,
1144 struct sim_inferior_data *sim_data
1146 const char *file =
"nothing";
1149 file = bfd_get_filename (
exec_bfd);
1158 sim_info (sim_data->gdbsim_desc, 0);
1167 struct sim_inferior_data *sim_data
1184 struct sim_inferior_data *sim_data;
1196 sim_data = ((
struct sim_inferior_data *)
1198 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
1211 error (
_(
"Not connected to the simulator target"));
1214 sim_do_command (sim_data->gdbsim_desc, args);
1224 const char *text,
const char *word)
1226 struct sim_inferior_data *sim_data;
1228 sim_data = ((
struct sim_inferior_data *)
1230 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
1235 struct sim_completions_deleter
1237 void operator() (
char **ptr)
const 1239 for (
size_t i = 0; ptr[i] != NULL; i++)
1245 std::unique_ptr<char *[], sim_completions_deleter> sim_completions
1246 (sim_complete_command (sim_data->gdbsim_desc, text, word));
1247 if (sim_completions == NULL)
1254 while (sim_completions[count] != NULL)
1257 for (
size_t i = count; i > 0; i--)
1260 sim_completions[i - 1] = NULL;
1270 struct sim_inferior_data *sim_data
1273 if (sim_data == NULL)
1276 if (
ptid_equal (ptid, sim_data->remote_sim_ptid))
1297 struct sim_inferior_data *sim_data
1300 if (!sim_data->program_loaded)
1309 struct sim_inferior_data *sim_data
1312 if (!sim_data->program_loaded)
1365 _(
"Send a command to the simulator."));
1368 sim_inferior_data_key
void error_no_arg(const char *why)
struct gdbarch * target_gdbarch(void)
static int gdbsim_interrupt_inferior(struct inferior *inf, void *arg)
void add_target(struct target_ops *t)
int default_child_has_stack(struct target_ops *ops)
enum register_status cooked_read(int regnum, gdb_byte *buf)
static void sim_inferior_data_cleanup(struct inferior *inf, void *data)
static void gdbsim_detach(struct target_ops *ops, const char *args, int from_tty)
static void sim_command_completer(struct cmd_list_element *ignore, completion_tracker &tracker, const char *text, const char *word)
static enum target_xfer_status gdbsim_xfer_memory(struct target_ops *target, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
int one2one_register_sim_regno(struct gdbarch *gdbarch, int regnum)
static void gdbsim_create_inferior(struct target_ops *target, const char *exec_file, const std::string &allargs, char **env, int from_tty)
void insert_breakpoints(void)
int ptid_get_pid(const ptid_t &ptid)
void fputs_unfiltered(const char *buf, struct ui_file *file)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
int(* to_has_memory)(struct target_ops *)
void warning(const char *fmt,...)
void init_wait_for_inferior(void)
int(* to_has_stack)(struct target_ops *)
void push_target(struct target_ops *t)
int(* to_insert_breakpoint)(struct target_ops *, struct gdbarch *, struct bp_target_info *) TARGET_DEFAULT_FUNC(memory_insert_breakpoint)
void delete_thread_silent(ptid_t)
ptid_t regcache_get_ptid(const struct regcache *regcache)
int unpush_target(struct target_ops *t)
enum bfd_endian selected_byte_order(void)
void internal_error(const char *file, int line, const char *fmt,...)
void generic_mourn_inferior(void)
void(* to_close)(struct target_ops *)
const char *(* to_pid_to_str)(struct target_ops *, ptid_t) TARGET_DEFAULT_FUNC(default_pid_to_str)
static host_callback gdb_callback
struct inferior * find_inferior_ptid(ptid_t ptid)
struct inferior * iterate_over_inferiors(int(*callback)(struct inferior *, void *), void *data)
int gdbarch_num_regs(struct gdbarch *gdbarch)
static int gdb_os_write_stderr(host_callback *, const char *, int)
static void gdbsim_files_info(struct target_ops *target)
int default_child_has_execution(struct target_ops *ops, ptid_t the_ptid)
static void gdb_os_flush_stderr(host_callback *)
static int gdbsim_resume_inferior(struct inferior *inf, void *arg)
void printf_filtered(const char *format,...)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
#define host_address_to_string(ADDR)
ptid_t ptid_build(int pid, long lwp, long tid)
void(* to_files_info)(struct target_ops *) TARGET_DEFAULT_IGNORE()
#define TARGET_SYSROOT_PREFIX
const char * selected_architecture_name(void)
const char * normal_pid_to_str(ptid_t ptid)
static int gdbsim_has_all_memory(struct target_ops *ops)
void switch_to_thread(ptid_t ptid)
static void gdbsim_cntrl_c(int signo)
void raw_supply(int regnum, const void *buf)
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
void void void void verror(const char *fmt, va_list args) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF(1
void set_cmd_completer(struct cmd_list_element *cmd, completer_ftype *completer)
static void init_gdbsim_ops(void)
void vfprintf_filtered(struct ui_file *stream, const char *format, va_list args)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
void(* to_resume)(struct target_ops *, ptid_t, int TARGET_DEBUG_PRINTER(target_debug_print_step), enum gdb_signal) TARGET_DEFAULT_NORETURN(noprocess())
static void gdbsim_fetch_register(struct target_ops *ops, struct regcache *regcache, int regno)
void reset(const char *str)
static void gdbsim_resume(struct target_ops *ops, ptid_t ptid, int step, enum gdb_signal siggnal)
char * pulongest(ULONGEST u)
int(* to_has_execution)(struct target_ops *, ptid_t)
int gdbarch_register_sim_regno(struct gdbarch *gdbarch, int reg_nr)
struct inferior * find_inferior_pid(int pid)
static int gdb_os_poll_quit(host_callback *)
static void gdb_os_evprintf_filtered(host_callback *, const char *, va_list)
void target_mourn_inferior(ptid_t ptid)
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
struct thread_info * add_thread_silent(ptid_t ptid)
static void gdbsim_prepare_to_store(struct target_ops *self, struct regcache *regcache)
void raw_supply_zeroed(int regnum)
enum target_xfer_status(* to_xfer_partial)(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) TARGET_DEFAULT_RETURN(TARGET_XFER_E_IO)
void(* to_detach)(struct target_ops *ops, const char *, int) TARGET_DEFAULT_IGNORE()
static int gdbsim_is_open
static void init_callbacks(void)
static void gdbsim_close(struct target_ops *self)
static void gdb_os_flush_stdout(host_callback *)
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
void(* to_mourn_inferior)(struct target_ops *) TARGET_DEFAULT_FUNC(default_mourn_inferior)
static int gdbsim_has_memory(struct target_ops *ops)
static void gdbsim_interrupt(struct target_ops *self, ptid_t ptid)
int default_child_has_registers(struct target_ops *ops)
void clear_proceed_status(int step)
int check_quit_flag(void)
void(* to_kill)(struct target_ops *) TARGET_DEFAULT_NORETURN(noprocess())
static void gdb_os_printf_filtered(host_callback *, const char *,...)
int remove_breakpoints(void)
void(* to_open)(const char *, int)
void ui_file_write(struct ui_file *file, const char *buf, long length_buf)
void registers_changed(void)
static struct sim_inferior_data * get_sim_inferior_data(struct inferior *inf, int sim_instance_needed)
void add_completion(gdb::unique_xmalloc_ptr< char > name, completion_match_for_lcd *match_for_lcd=NULL, const char *text=NULL, const char *word=NULL)
int(* to_remove_breakpoint)(struct target_ops *, struct gdbarch *, struct bp_target_info *, enum remove_bp_reason) TARGET_DEFAULT_FUNC(memory_remove_breakpoint)
static struct sim_inferior_data * get_sim_inferior_data_by_ptid(ptid_t ptid, int sim_instance_needed)
struct ui_file * gdb_stdtarg
static void end_callbacks(void)
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
gdb::def_vector< gdb_byte > byte_vector
struct inferior * current_inferior(void)
const char * to_shortname
static void gdbsim_open(const char *args, int from_tty)
unsigned long long ULONGEST
static int ignore(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
static int gdbsim_close_inferior(struct inferior *inf, void *arg)
int register_size(struct gdbarch *gdbarch, int regnum)
static void gdbsim_load(struct target_ops *self, const char *args, int fromtty)
static void gdb_os_error(host_callback *, const char *,...)
int memory_insert_breakpoint(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
static void gdbsim_store_register(struct target_ops *ops, struct regcache *regcache, int regno)
int(* to_has_all_memory)(struct target_ops *)
void(* to_interrupt)(struct target_ops *, ptid_t) TARGET_DEFAULT_IGNORE()
void(* to_create_inferior)(struct target_ops *, const char *, const std::string &, char **, int)
struct ui_file * gdb_stdtargerr
int(* to_thread_alive)(struct target_ops *, ptid_t ptid) TARGET_DEFAULT_RETURN(0)
static enum target_xfer_status gdbsim_xfer_partial(struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
static int callbacks_initialized
static int check_for_duplicate_sim_descriptor(struct inferior *inf, void *arg)
void gdb_flush(struct ui_file *file)
struct cmd_list_element * add_com(const char *name, enum command_class theclass, cmd_const_cfunc_ftype *fun, const char *doc)
void _initialize_remote_sim(void)
void(* to_prepare_to_store)(struct target_ops *, struct regcache *) TARGET_DEFAULT_NORETURN(noprocess())
void(* to_store_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
static void gdbsim_kill(struct target_ops *ops)
int memory_remove_breakpoint(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt, enum remove_bp_reason reason)
int(* to_has_registers)(struct target_ops *)
ptid_t(* to_wait)(struct target_ops *, ptid_t, struct target_waitstatus *, int TARGET_DEBUG_PRINTER(target_debug_print_options)) TARGET_DEFAULT_FUNC(default_target_wait)
static void gdbsim_mourn_inferior(struct target_ops *target)
int is_target_filename(const char *name)
struct target_ops gdbsim_ops
static void dump_mem(const gdb_byte *buf, int len)
void error(const char *fmt,...)
static const char * gdbsim_pid_to_str(struct target_ops *ops, ptid_t ptid)
static ptid_t gdbsim_wait(struct target_ops *ops, ptid_t ptid, struct target_waitstatus *status, int options)
void inferior_appeared(struct inferior *inf, int pid)
void(* to_load)(struct target_ops *, const char *, int) TARGET_DEFAULT_NORETURN(tcomplain())
static int gdbsim_thread_alive(struct target_ops *ops, ptid_t ptid)
void simulator_command(const char *args, int from_tty)
int(* deprecated_ui_loop_hook)(int signo)
void init_thread_list(void)
static int gdb_os_write_stdout(host_callback *, const char *, int)
static void gdb_os_vprintf_filtered(host_callback *, const char *, va_list)