* remote-sim.h (sim_state, SIM_DESC): New types.
authorDavid Edelsohn <dje.gcc@gmail.com>
Thu, 13 Mar 1997 20:28:26 +0000 (20:28 +0000)
committerDavid Edelsohn <dje.gcc@gmail.com>
Thu, 13 Mar 1997 20:28:26 +0000 (20:28 +0000)
(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.

gdb/ChangeLog
gdb/remote-sim.c
gdb/remote-sim.h

index f7dbae024873c9c7b4e89c9bbe4aaaaf68eb2144..9b8f5743816b8b57313955f7f5f9ec26910d2a04 100644 (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, 
index 3b0ddb45970145f5fc341f5319d6e06765bed4fc..3d4a960b4683c89636198b780bd229074e301f6b 100644 (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 */
index 77d543249c61631988920dd7c3d16904915f15ec..ddaa7185e2f997f29ffb90ba5d3193c2954c9c7f 100644 (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) */