diff options
author | David Edelsohn <dje.gcc@gmail.com> | 1997-03-13 20:28:26 +0000 |
---|---|---|
committer | David Edelsohn <dje.gcc@gmail.com> | 1997-03-13 20:28:26 +0000 |
commit | 286f83b4303f08f70f71f84a50b8c202b638a17a (patch) | |
tree | c2615764a9f2ce2c3ebdb46ae09acb35bd69927a /gdb | |
parent | d428c89fdf14de695deb00233e8775c6370a0227 (diff) | |
download | gdb-286f83b4303f08f70f71f84a50b8c202b638a17a.zip gdb-286f83b4303f08f70f71f84a50b8c202b638a17a.tar.gz gdb-286f83b4303f08f70f71f84a50b8c202b638a17a.tar.bz2 |
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 34 | ||||
-rw-r--r-- | gdb/remote-sim.c | 65 | ||||
-rw-r--r-- | gdb/remote-sim.h | 43 |
3 files changed, 101 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f7dbae0..9b8f574 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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, diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 3b0ddb4..3d4a960 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -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 */ diff --git a/gdb/remote-sim.h b/gdb/remote-sim.h index 77d5432..ddaa718 100644 --- a/gdb/remote-sim.h +++ b/gdb/remote-sim.h @@ -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) */ |