* remote-sim.h (sim_state, SIM_DESC): New types.

(sim_open): Return a `descriptor' as result.
	(*): New argument of descriptor result from sim_open.
	* remote-sim.c (gdbsim_desc): Renamed from gdbsim_open_p.
	(gdbsim_open): Record result of sim_open in gdbsim_desc.
	Pass argv list to sim_open, argv[0] = pseudo program name.
	(*): Pass gdbsim_desc to sim_foo fns.
This commit is contained in:
David Edelsohn
1997-03-13 20:28:26 +00:00
parent d428c89fdf
commit 286f83b430
3 changed files with 101 additions and 41 deletions

View File

@@ -1,5 +1,5 @@
/* Generic remote debugging interface for simulators.
Copyright 1993, 1994, 1996 Free Software Foundation, Inc.
Copyright 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
Contributed by Cygnus Support.
Steve Chamberlain (sac@cygnus.com).
@@ -95,8 +95,9 @@ static int program_loaded = 0;
/* We must keep track of whether the simulator has been opened or not because
GDB can call a target's close routine twice, but sim_close doesn't allow
this. */
static int gdbsim_open_p = 0;
this. We also need to record the result of sim_open so we can pass it
back to the other sim_foo routines. */
static SIM_DESC gdbsim_desc = 0;
static void
dump_mem (buf, len)
@@ -138,7 +139,7 @@ init_callbacks ()
gdb_callback.write_stdout = gdb_os_write_stdout;
gdb_callback.printf_filtered = gdb_os_printf_filtered;
gdb_callback.error = gdb_os_error;
sim_set_callbacks (&gdb_callback);
sim_set_callbacks (gdbsim_desc, &gdb_callback);
callbacks_initialized = 1;
}
}
@@ -252,7 +253,7 @@ int regno;
{
char buf[MAX_REGISTER_RAW_SIZE];
sim_fetch_register (regno, buf);
sim_fetch_register (gdbsim_desc, regno, buf);
supply_register (regno, buf);
if (sr_get_debug ())
{
@@ -278,7 +279,7 @@ int regno;
/* FIXME: Until read_register() returns LONGEST, we have this. */
char tmp[MAX_REGISTER_RAW_SIZE];
read_register_gen (regno, tmp);
sim_store_register (regno, tmp);
sim_store_register (gdbsim_desc, regno, tmp);
if (sr_get_debug ())
{
printf_filtered ("gdbsim_store_register: %d", regno);
@@ -297,7 +298,7 @@ gdbsim_kill ()
if (sr_get_debug ())
printf_filtered ("gdbsim_kill\n");
sim_kill (); /* close fd's, remove mappings */
sim_kill (gdbsim_desc); /* close fd's, remove mappings, etc. */
inferior_pid = 0;
}
@@ -318,7 +319,7 @@ gdbsim_load (prog, fromtty)
/* This must be done before calling gr_load_image. */
program_loaded = 1;
if (sim_load (prog, fromtty) != 0)
if (sim_load (gdbsim_desc, prog, fromtty) != 0)
generic_load (prog, fromtty);
}
@@ -365,7 +366,7 @@ gdbsim_create_inferior (exec_file, args, env)
strcat (arg_buf, args);
argv = buildargv (arg_buf);
make_cleanup (freeargv, (char *) argv);
sim_create_inferior (entry_pt, argv, env);
sim_create_inferior (gdbsim_desc, entry_pt, argv, env);
inferior_pid = 42;
insert_breakpoints (); /* Needed to get correct instruction in cache */
@@ -382,6 +383,10 @@ gdbsim_open (args, from_tty)
char *args;
int from_tty;
{
int len;
char *arg_buf;
char **argv;
if (sr_get_debug ())
printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");
@@ -391,13 +396,27 @@ gdbsim_open (args, from_tty)
sim_close to be called if the simulator is already open, but push_target
is called after sim_open! We can't move the call to push_target before
the call to sim_open because sim_open may invoke `error'. */
if (gdbsim_open_p)
if (gdbsim_desc != NULL)
unpush_target (&gdbsim_ops);
init_callbacks ();
sim_open (args);
gdbsim_open_p = 1;
len = 7 + 1 + (args ? strlen (args) : 0) + 1 + /*slop*/ 10;
arg_buf = (char *) alloca (len);
strcpy (arg_buf, "gdbsim");
if (args)
{
strcat (arg_buf, " ");
strcat (arg_buf, args);
}
argv = buildargv (arg_buf);
if (argv == NULL)
error ("Insufficient memory available to allocate simulator arg list.");
make_cleanup (freeargv, (char *) argv);
/* FIXME: sim_open may call `error' if it fails, but perhaps it should
just return an error indicator and let us call `error'. */
gdbsim_desc = sim_open (argv);
push_target (&gdbsim_ops);
target_fetch_registers (-1);
@@ -422,10 +441,10 @@ gdbsim_close (quitting)
program_loaded = 0;
if (gdbsim_open_p)
if (gdbsim_desc != NULL)
{
sim_close (quitting);
gdbsim_open_p = 0;
sim_close (gdbsim_desc, quitting);
gdbsim_desc = NULL;
}
end_callbacks ();
@@ -468,7 +487,7 @@ gdbsim_resume (pid, step, siggnal)
if (sr_get_debug ())
printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);
sim_resume (step, target_signal_to_host (siggnal));
sim_resume (gdbsim_desc, step, target_signal_to_host (siggnal));
}
/* Wait for inferior process to do something. Return pid of child,
@@ -486,7 +505,7 @@ gdbsim_wait (pid, status)
if (sr_get_debug ())
printf_filtered ("gdbsim_wait\n");
sim_stop_reason (&reason, &sigrc);
sim_stop_reason (gdbsim_desc, &reason, &sigrc);
switch (reason)
{
case sim_exited:
@@ -543,11 +562,11 @@ gdbsim_xfer_inferior_memory (memaddr, myaddr, len, write, target)
if (write)
{
len = sim_write (memaddr, myaddr, len);
len = sim_write (gdbsim_desc, memaddr, myaddr, len);
}
else
{
len = sim_read (memaddr, myaddr, len);
len = sim_read (gdbsim_desc, memaddr, myaddr, len);
if (sr_get_debug () && len > 0)
dump_mem(myaddr, len);
}
@@ -570,7 +589,7 @@ gdbsim_files_info (target)
{
printf_filtered ("\tAttached to %s running program %s\n",
target_shortname, file);
sim_info (0);
sim_info (gdbsim_desc, 0);
}
}
@@ -598,7 +617,11 @@ simulator_command (args, from_tty)
ensure that the callbacks have been set up. */
init_callbacks ();
sim_do_command (args);
/* Note that if the simulator hasn't been opened, gdbsim_desc == NULL
which is correct (??? assuming of course one wishes to continue to
allow commands to be sent to unopened simulators, which isn't entirely
unreasonable). */
sim_do_command (gdbsim_desc, args);
}
/* Define the target subroutine names */