* 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,3 +1,37 @@
Thu Mar 13 11:00:22 1997 Doug Evans <dje@canuck.cygnus.com>
* 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.
Tue Mar 11 07:25:27 1997 Mark Alexander <marka@cygnus.com>
First cut at supporting simulators in gdbserver:
* configure, configure.in: Allow gdbserver to be configured
for cross-target environments.
* gdbserver/Makefile.in: Add simulator support.
* gdbserver/configure.in: Eliminate assumption that host == target.
Simplify using gdb/configure.tgt and gdb/configure.host.
Fix other minor configuration errors.
* gdbserver/low-sparc.c: Fix compile error.
* gdbserver/remote-utils.c: Eliminate assumption that registers
and addresses are four bytes. Fix minor compile errors and warnings.
* gdbserver/server.c: Rewrite numerous instances of identical code
for starting inferior processes to call new function start_inferior.
Eliminate assumption that registers and addresses are four bytes.
* gdbserver/server.h: Add missing prototypes to eliminate compiler
warnings.
* gdbserver/low-sim.c: New file to mate gdbserver with simulators.
* config/mips/vr5000.mt: Add Vr5000 simulator support to gdbserver.
* config/i386/linux.mh: Eliminate gdbserver support as a first step
in moving such support from host to target makefile fragments.
* config/i386/linux.mt: Move gdbserver support here from linux.mh.
Mon Mar 10 12:27:47 1997 Michael Snyder <msnyder@cleaver.cygnus.com>
* symtab.h (INIT_SAL): New macro to initialize symtab_and_line,

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 */

View File

@ -1,5 +1,5 @@
/* This file defines the interface between the simulator and gdb.
Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc.
Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
This file is part of GDB.
@ -32,31 +32,34 @@ typedef unsigned int SIM_ADDR;
typedef CORE_ADDR_TYPE SIM_ADDR;
#endif
/* Semi-opaque type used as result of sim_open and passed back to all
other routines. "desc" is short for "descriptor".
It is up to each simulator to define `sim_state'. */
typedef struct sim_state *SIM_DESC;
/* Main simulator entry points. */
/* Initialize the simulator. This function is called when the simulator
is selected from the command line. ARGS is passed from the command line
is selected from the command line. ARGV is passed from the command line
and can be used to select whatever run time options the simulator provides.
ARGS is the raw character string and must be parsed by the simulator,
which is trivial to do with the buildargv function in libiberty. */
/* FIXME: Eventually create a STATE and return its address and pass it to
all other main entry points. */
ARGV is the standard NULL terminated array of pointers. */
void sim_open PARAMS ((char *args));
SIM_DESC sim_open PARAMS ((char **argv));
/* Terminate usage of the simulator. This may involve freeing target memory
and closing any open files and mmap'd areas. You cannot assume sim_kill
has already been called.
QUITTING is non-zero if we cannot hang on errors. */
void sim_close PARAMS ((int quitting));
void sim_close PARAMS ((SIM_DESC sd, int quitting));
/* Load program PROG into the simulator.
Return non-zero if you wish the caller to handle it
(it is done this way because most simulators can use gr_load_image,
but defining it as a callback seems awkward). */
int sim_load PARAMS ((char *prog, int from_tty));
int sim_load PARAMS ((SIM_DESC sd, char *prog, int from_tty));
/* Prepare to run the simulated program.
START_ADDRESS is, yes, you guessed it, the start address of the program.
@ -66,54 +69,54 @@ int sim_load PARAMS ((char *prog, int from_tty));
sim_store_register, so the START_ADDRESS argument is there as a
workaround. */
void sim_create_inferior PARAMS ((SIM_ADDR start_address,
void sim_create_inferior PARAMS ((SIM_DESC sd, SIM_ADDR start_address,
char **argv, char **env));
/* Kill the running program.
This may involve closing any open files and deleting any mmap'd areas. */
void sim_kill PARAMS ((void));
void sim_kill PARAMS ((SIM_DESC sd));
/* Read LENGTH bytes of the simulated program's memory and store in BUF.
Result is number of bytes read, or zero if error. */
int sim_read PARAMS ((SIM_ADDR mem, unsigned char *buf, int length));
int sim_read PARAMS ((SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length));
/* Store LENGTH bytes from BUF in the simulated program's memory.
Result is number of bytes write, or zero if error. */
int sim_write PARAMS ((SIM_ADDR mem, unsigned char *buf, int length));
int sim_write PARAMS ((SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length));
/* Fetch register REGNO and store the raw value in BUF. */
void sim_fetch_register PARAMS ((int regno, unsigned char *buf));
void sim_fetch_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf));
/* Store register REGNO from BUF (in raw format). */
void sim_store_register PARAMS ((int regno, unsigned char *buf));
void sim_store_register PARAMS ((SIM_DESC sd, int regno, unsigned char *buf));
/* Print some interesting information about the simulator.
VERBOSE is non-zero for the wordy version. */
void sim_info PARAMS ((int verbose));
void sim_info PARAMS ((SIM_DESC sd, int verbose));
/* Fetch why the program stopped.
SIGRC will contain either the argument to exit() or the signal number. */
enum sim_stop { sim_exited, sim_stopped, sim_signalled };
void sim_stop_reason PARAMS ((enum sim_stop *reason, int *sigrc));
void sim_stop_reason PARAMS ((SIM_DESC sd, enum sim_stop *reason, int *sigrc));
/* Run (or resume) the program. */
void sim_resume PARAMS ((int step, int siggnal));
void sim_resume PARAMS ((SIM_DESC sd, int step, int siggnal));
/* Passthru for other commands that the simulator might support. */
void sim_do_command PARAMS ((char *cmd));
void sim_do_command PARAMS ((SIM_DESC sd, char *cmd));
/* Provide simulator with a standard host_callback_struct. */
void sim_set_callbacks PARAMS ((struct host_callback_struct *));
void sim_set_callbacks PARAMS ((SIM_DESC sd, struct host_callback_struct *));
#endif /* !defined (REMOTE_SIM_H) */