2005-02-11 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
index 0bdb3542646bbe3a5a25ed16bb28e5629b306c27..04d8cbe4081b0372e994a00b6efc3fa58f7d10d9 100644 (file)
@@ -1,27 +1,30 @@
 /* Generic remote debugging interface for simulators.
-   Copyright 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
+
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+   2002, 2004 Free Software Foundation, Inc.
+
    Contributed by Cygnus Support.
    Steve Chamberlain (sac@cygnus.com).
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "inferior.h"
-#include "wait.h"
 #include "value.h"
 #include "gdb_string.h"
 #include <ctype.h>
@@ -32,72 +35,76 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "terminal.h"
 #include "target.h"
 #include "gdbcore.h"
-#include "callback.h"
-#include "remote-sim.h"
+#include "gdb/callback.h"
+#include "gdb/remote-sim.h"
 #include "remote-utils.h"
 #include "command.h"
+#include "regcache.h"
+#include "gdb_assert.h"
+#include "sim-regno.h"
+#include "arch-utils.h"
 
 /* Prototypes */
 
-static void dump_mem PARAMS ((char *buf, int len));
+extern void _initialize_remote_sim (void);
 
-static void init_callbacks PARAMS ((void));
+static void dump_mem (char *buf, int len);
 
-static void end_callbacks PARAMS ((void));
+static void init_callbacks (void);
 
-static int gdb_os_write_stdout PARAMS ((host_callback *, const char *, int));
+static void end_callbacks (void);
 
-static void gdb_os_flush_stdout PARAMS ((host_callback *));
+static int gdb_os_write_stdout (host_callback *, const char *, int);
 
-static int gdb_os_write_stderr PARAMS ((host_callback *, const char *, int));
+static void gdb_os_flush_stdout (host_callback *);
 
-static void gdb_os_flush_stderr PARAMS ((host_callback *));
+static int gdb_os_write_stderr (host_callback *, const char *, int);
 
-static int gdb_os_poll_quit PARAMS ((host_callback *));
+static void gdb_os_flush_stderr (host_callback *);
 
-/* printf_filtered is depreciated */
-static void gdb_os_printf_filtered PARAMS ((host_callback *, const char *, ...));
+static int gdb_os_poll_quit (host_callback *);
 
-static void gdb_os_vprintf_filtered PARAMS ((host_callback *, const char *, va_list));
+/* printf_filtered is depreciated */
+static void gdb_os_printf_filtered (host_callback *, const char *, ...);
 
-static void gdb_os_evprintf_filtered PARAMS ((host_callback *, const char *, va_list));
+static void gdb_os_vprintf_filtered (host_callback *, const char *, va_list);
 
-static void gdb_os_error PARAMS ((host_callback *, const char *, ...));
+static void gdb_os_evprintf_filtered (host_callback *, const char *, va_list);
 
-static void gdbsim_fetch_register PARAMS ((int regno));
+static void gdb_os_error (host_callback *, const char *, ...);
 
-static void gdbsim_store_register PARAMS ((int regno));
+static void gdbsim_fetch_register (int regno);
 
-static void gdbsim_kill PARAMS ((void));
+static void gdbsim_store_register (int regno);
 
-static void gdbsim_load PARAMS ((char *prog, int fromtty));
+static void gdbsim_kill (void);
 
-static void gdbsim_create_inferior PARAMS ((char *exec_file, char *args, char **env));
+static void gdbsim_load (char *prog, int fromtty);
 
-static void gdbsim_open PARAMS ((char *args, int from_tty));
+static void gdbsim_open (char *args, int from_tty);
 
-static void gdbsim_close PARAMS ((int quitting));
+static void gdbsim_close (int quitting);
 
-static void gdbsim_detach PARAMS ((char *args, int from_tty));
+static void gdbsim_detach (char *args, int from_tty);
 
-static void gdbsim_resume PARAMS ((int pid, int step, enum target_signal siggnal));
+static void gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal);
 
-static int gdbsim_wait PARAMS ((int pid, struct target_waitstatus *status));
+static ptid_t gdbsim_wait (ptid_t ptid, struct target_waitstatus *status);
 
-static void gdbsim_prepare_to_store PARAMS ((void));
+static void gdbsim_prepare_to_store (void);
 
-static int gdbsim_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
-                                               char *myaddr, int len,
-                                               int write,
-                                               struct target_ops *target));
+static int gdbsim_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, 
+                                       int len, int write,
+                                       struct mem_attrib *attrib,
+                                       struct target_ops *target);
 
-static void gdbsim_files_info PARAMS ((struct target_ops *target));
+static void gdbsim_files_info (struct target_ops *target);
 
-static void gdbsim_mourn_inferior PARAMS ((void));
+static void gdbsim_mourn_inferior (void);
 
-static void gdbsim_stop PARAMS ((void));
+static void gdbsim_stop (void);
 
-static void simulator_command PARAMS ((char *args, int from_tty));
+void simulator_command (char *args, int from_tty);
 
 /* Naming convention:
 
@@ -116,9 +123,7 @@ static int program_loaded = 0;
 static SIM_DESC gdbsim_desc = 0;
 
 static void
-dump_mem (buf, len)
-     char *buf;
-     int len;
+dump_mem (char *buf, int len)
 {
   if (len <= 8)
     {
@@ -126,8 +131,10 @@ dump_mem (buf, len)
        {
          long l[2];
          memcpy (l, buf, len);
-         printf_filtered ("\t0x%x", l[0]);
-         printf_filtered (len == 8 ? " 0x%x\n" : "\n", l[1]);
+         printf_filtered ("\t0x%lx", l[0]);
+         if (len == 8)
+           printf_filtered (" 0x%lx", l[1]);
+         printf_filtered ("\n");
        }
       else
        {
@@ -146,9 +153,9 @@ static int callbacks_initialized = 0;
 /* Initialize gdb_callback.  */
 
 static void
-init_callbacks ()
+init_callbacks (void)
 {
-  if (! callbacks_initialized)
+  if (!callbacks_initialized)
     {
       gdb_callback = default_callback;
       gdb_callback.init (&gdb_callback);
@@ -169,7 +176,7 @@ init_callbacks ()
 /* Release callbacks (free resources used by them).  */
 
 static void
-end_callbacks ()
+end_callbacks (void)
 {
   if (callbacks_initialized)
     {
@@ -180,55 +187,37 @@ end_callbacks ()
 
 /* GDB version of os_write_stdout callback.  */
 
-static int 
-gdb_os_write_stdout (p, buf, len)
-     host_callback *p;
-     const char *buf;
-     int len;
+static int
+gdb_os_write_stdout (host_callback *p, const char *buf, int len)
 {
   int i;
   char b[2];
 
-  for (i = 0; i < len; i++) 
-    {
-      b[0] = buf[i];
-      b[1] = 0;
-      if (target_output_hook)
-       target_output_hook (b);
-      else
-       fputs_filtered (b, gdb_stdout);
-    }
+  ui_file_write (gdb_stdtarg, buf, len);
   return len;
 }
 
 /* GDB version of os_flush_stdout callback.  */
 
 static void
-gdb_os_flush_stdout (p)
-     host_callback *p;
+gdb_os_flush_stdout (host_callback *p)
 {
-  gdb_flush (gdb_stdout);
+  gdb_flush (gdb_stdtarg);
 }
 
 /* GDB version of os_write_stderr callback.  */
 
-static int 
-gdb_os_write_stderr (p, buf, len)
-     host_callback *p;
-     const char *buf;
-     int len;
+static int
+gdb_os_write_stderr (host_callback *p, const char *buf, int len)
 {
   int i;
   char b[2];
 
-  for (i = 0; i < len; i++) 
+  for (i = 0; i < len; i++)
     {
       b[0] = buf[i];
       b[1] = 0;
-      if (target_output_hook)
-       target_output_hook (b);
-      else
-       fputs_filtered (b, gdb_stderr);
+      fputs_unfiltered (b, gdb_stdtargerr);
     }
   return len;
 }
@@ -236,33 +225,18 @@ gdb_os_write_stderr (p, buf, len)
 /* GDB version of os_flush_stderr callback.  */
 
 static void
-gdb_os_flush_stderr (p)
-     host_callback *p;
+gdb_os_flush_stderr (host_callback *p)
 {
-  gdb_flush (gdb_stderr);
+  gdb_flush (gdb_stdtargerr);
 }
 
 /* GDB version of printf_filtered callback.  */
 
-/* VARARGS */
 static void
-#ifdef ANSI_PROTOTYPES
-gdb_os_printf_filtered (host_callback *p, const char *format, ...)
-#else
-gdb_os_printf_filtered (p, va_alist)
-     host_callback *p;
-     va_dcl
-#endif
+gdb_os_printf_filtered (host_callback * p, const char *format,...)
 {
   va_list args;
-#ifdef ANSI_PROTOTYPES
   va_start (args, format);
-#else
-  char *format;
-
-  va_start (args);
-  format = va_arg (args, char *);
-#endif
 
   vfprintf_filtered (gdb_stdout, format, args);
 
@@ -271,115 +245,134 @@ gdb_os_printf_filtered (p, va_alist)
 
 /* GDB version of error vprintf_filtered.  */
 
-/* VARARGS */
 static void
-#ifdef ANSI_PROTOTYPES
-gdb_os_vprintf_filtered (host_callback *p, const char *format, va_list ap)
-#else
-gdb_os_vprintf_filtered (p, format, ap)
-     host_callback *p;
-     char *format;
-     va_list ap;
-#endif
+gdb_os_vprintf_filtered (host_callback * p, const char *format, va_list ap)
 {
   vfprintf_filtered (gdb_stdout, format, ap);
 }
 
 /* GDB version of error evprintf_filtered.  */
 
-/* VARARGS */
 static void
-#ifdef ANSI_PROTOTYPES
-gdb_os_evprintf_filtered (host_callback *p, const char *format, va_list ap)
-#else
-gdb_os_evprintf_filtered (p, format, ap)
-     host_callback *p;
-     char *format;
-     va_list ap;
-#endif
+gdb_os_evprintf_filtered (host_callback * p, const char *format, va_list ap)
 {
   vfprintf_filtered (gdb_stderr, format, ap);
 }
 
 /* GDB version of error callback.  */
 
-/* VARARGS */
 static void
-#ifdef ANSI_PROTOTYPES
-gdb_os_error (host_callback *p, const char *format, ...)
-#else
-gdb_os_error (p, va_alist)
-     host_callback *p;
-     va_dcl
-#endif
+gdb_os_error (host_callback * p, const char *format,...)
 {
-  if (error_hook)
-    (*error_hook) ();
-  else 
+  if (deprecated_error_hook)
+    (*deprecated_error_hook) ();
+  else
     {
       va_list args;
-#ifdef ANSI_PROTOTYPES
       va_start (args, format);
-#else
-      char *format;
-
-      va_start (args);
-      format = va_arg (args, char *);
-#endif
-
-      error_begin ();
-      vfprintf_filtered (gdb_stderr, format, args);
-      fprintf_filtered (gdb_stderr, "\n");
+      verror (format, args);
       va_end (args);
-      return_to_top_level (RETURN_ERROR);
     }
 }
 
+int
+one2one_register_sim_regno (int regnum)
+{
+  /* Only makes sense to supply raw registers.  */
+  gdb_assert (regnum >= 0 && regnum < NUM_REGS);
+  return regnum;
+}
+
 static void
-gdbsim_fetch_register (regno)
-int regno;
+gdbsim_fetch_register (int regno)
 {
-  if (regno == -1) 
+  if (regno == -1)
     {
       for (regno = 0; regno < NUM_REGS; regno++)
        gdbsim_fetch_register (regno);
+      return;
     }
-  else
-    {
-      char buf[MAX_REGISTER_RAW_SIZE];
 
-      sim_fetch_register (gdbsim_desc, regno, buf);
-      supply_register (regno, buf);
-      if (sr_get_debug ())
-       {
-         printf_filtered ("gdbsim_fetch_register: %d", regno);
-         /* FIXME: We could print something more intelligible.  */
-         dump_mem (buf, REGISTER_RAW_SIZE (regno));
-       }
+  switch (REGISTER_SIM_REGNO (regno))
+    {
+    case LEGACY_SIM_REGNO_IGNORE:
+      break;
+    case SIM_REGNO_DOES_NOT_EXIST:
+      {
+       /* For moment treat a `does not exist' register the same way
+           as an ``unavailable'' register.  */
+       char buf[MAX_REGISTER_SIZE];
+       int nr_bytes;
+       memset (buf, 0, MAX_REGISTER_SIZE);
+       regcache_raw_supply (current_regcache, regno, buf);
+       set_register_cached (regno, -1);
+       break;
+      }
+    default:
+      {
+       static int warn_user = 1;
+       char buf[MAX_REGISTER_SIZE];
+       int nr_bytes;
+       gdb_assert (regno >= 0 && regno < NUM_REGS);
+       memset (buf, 0, MAX_REGISTER_SIZE);
+       nr_bytes = sim_fetch_register (gdbsim_desc,
+                                      REGISTER_SIM_REGNO (regno),
+                                      buf, register_size (current_gdbarch, regno));
+       if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno) && warn_user)
+         {
+           fprintf_unfiltered (gdb_stderr,
+                               "Size of register %s (%d/%d) incorrect (%d instead of %d))",
+                               REGISTER_NAME (regno),
+                               regno, REGISTER_SIM_REGNO (regno),
+                               nr_bytes, register_size (current_gdbarch, regno));
+           warn_user = 0;
+         }
+       /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
+          indicating that GDB and the SIM have different ideas about
+          which registers are fetchable.  */
+       /* Else if (nr_bytes < 0): an old simulator, that doesn't
+          think to return the register size.  Just assume all is ok.  */
+       regcache_raw_supply (current_regcache, regno, buf);
+       if (sr_get_debug ())
+         {
+           printf_filtered ("gdbsim_fetch_register: %d", regno);
+           /* FIXME: We could print something more intelligible.  */
+           dump_mem (buf, register_size (current_gdbarch, regno));
+         }
+       break;
+      }
     }
 }
 
 
 static void
-gdbsim_store_register (regno)
-int regno;
+gdbsim_store_register (int regno)
 {
-  if (regno  == -1) 
+  if (regno == -1)
     {
       for (regno = 0; regno < NUM_REGS; regno++)
        gdbsim_store_register (regno);
+      return;
     }
-  else
+  else if (REGISTER_SIM_REGNO (regno) >= 0)
     {
-      /* FIXME: Until read_register() returns LONGEST, we have this.  */
-      char tmp[MAX_REGISTER_RAW_SIZE];
-      read_register_gen (regno, tmp);
-      sim_store_register (gdbsim_desc, regno, tmp);
+      char tmp[MAX_REGISTER_SIZE];
+      int nr_bytes;
+      deprecated_read_register_gen (regno, tmp);
+      nr_bytes = sim_store_register (gdbsim_desc,
+                                    REGISTER_SIM_REGNO (regno),
+                                    tmp, register_size (current_gdbarch, regno));
+      if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno))
+       internal_error (__FILE__, __LINE__,
+                       _("Register size different to expected"));
+      /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
+        indicating that GDB and the SIM have different ideas about
+        which registers are fetchable.  */
       if (sr_get_debug ())
        {
          printf_filtered ("gdbsim_store_register: %d", regno);
          /* FIXME: We could print something more intelligible.  */
-         dump_mem (tmp, REGISTER_RAW_SIZE (regno));
+         dump_mem (tmp, register_size (current_gdbarch, regno));
        }
     }
 }
@@ -388,14 +381,14 @@ int regno;
    and releasing other resources acquired by the simulated program.  */
 
 static void
-gdbsim_kill ()
+gdbsim_kill (void)
 {
   if (sr_get_debug ())
     printf_filtered ("gdbsim_kill\n");
 
   /* There is no need to `kill' running simulator - the simulator is
      not running */
-  inferior_pid = 0;
+  inferior_ptid = null_ptid;
 }
 
 /* Load an executable file into the target process.  This is expected to
@@ -403,20 +396,18 @@ gdbsim_kill ()
    GDB's symbol tables to match.  */
 
 static void
-gdbsim_load (prog, fromtty)
-     char *prog;
-     int fromtty;
+gdbsim_load (char *prog, int fromtty)
 {
   if (sr_get_debug ())
     printf_filtered ("gdbsim_load: prog \"%s\"\n", prog);
 
-  inferior_pid = 0;
+  inferior_ptid = null_ptid;
 
   /* FIXME: We will print two messages on error.
      Need error to either not print anything if passed NULL or need
      another routine that doesn't take any arguments.  */
   if (sim_load (gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
-    error ("unable to load program");
+    error (_("unable to load program"));
 
   /* FIXME: If a load command should reset the targets registers then
      a call to sim_create_inferior() should go here. */
@@ -425,7 +416,7 @@ gdbsim_load (prog, fromtty)
 }
 
 
-/* Start an inferior process and set inferior_pid to its pid.
+/* Start an inferior process and set inferior_ptid to its pid.
    EXEC_FILE is the file to run.
    ARGS is a string containing the arguments to the program.
    ENV is the environment vector to pass.  Errors reported with error().
@@ -434,48 +425,47 @@ gdbsim_load (prog, fromtty)
    user types "run" after having attached.  */
 
 static void
-gdbsim_create_inferior (exec_file, args, env)
-     char *exec_file;
-     char *args;
-     char **env;
+gdbsim_create_inferior (char *exec_file, char *args, char **env, int from_tty)
 {
   int len;
-  char *arg_buf,**argv;
+  char *arg_buf, **argv;
 
   if (exec_file == 0 || exec_bfd == 0)
-    warning ("No exec file specified.");
-  if (! program_loaded)
-    warning ("No program loaded.");
+    warning (_("No executable file specified."));
+  if (!program_loaded)
+    warning (_("No program loaded."));
 
   if (sr_get_debug ())
     printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
-                    (exec_file ? exec_file: "(NULL)"),
+                    (exec_file ? exec_file : "(NULL)"),
                     args);
 
-  gdbsim_kill ();       
+  gdbsim_kill ();
   remove_breakpoints ();
   init_wait_for_inferior ();
 
   if (exec_file != NULL)
     {
-      len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop*/ 10;
+      len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
       arg_buf = (char *) alloca (len);
       arg_buf[0] = '\0';
       strcat (arg_buf, exec_file);
       strcat (arg_buf, " ");
       strcat (arg_buf, args);
       argv = buildargv (arg_buf);
-      make_cleanup (freeargv, (char *) argv);
+      make_cleanup_freeargv (argv);
     }
   else
     argv = NULL;
   sim_create_inferior (gdbsim_desc, exec_bfd, argv, env);
 
-  inferior_pid = 42;
-  insert_breakpoints (); /* Needed to get correct instruction in cache */
+  inferior_ptid = pid_to_ptid (42);
+  insert_breakpoints ();       /* Needed to get correct instruction in cache */
+
+  clear_proceed_status ();
 
   /* NB: Entry point already set by sim_create_inferior. */
-  proceed ((CORE_ADDR)-1, TARGET_SIGNAL_DEFAULT, 0);
+  proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
 }
 
 /* The open routine takes the rest of the parameters from the command,
@@ -484,9 +474,7 @@ gdbsim_create_inferior (exec_file, args, env)
 /* Called when selecting the simulator. EG: (gdb) target sim name.  */
 
 static void
-gdbsim_open (args, from_tty)
-     char *args;
-     int from_tty;
+gdbsim_open (char *args, int from_tty)
 {
   int len;
   char *arg_buf;
@@ -504,54 +492,49 @@ gdbsim_open (args, from_tty)
   if (gdbsim_desc != NULL)
     unpush_target (&gdbsim_ops);
 
-  len = (7 + 1 /* gdbsim */
+  len = (7 + 1                 /* gdbsim */
         + strlen (" -E little")
-        + strlen (" --arch=xxxxxxxxxx")
+        + strlen (" --architecture=xxxxxxxxxx")
         + (args ? strlen (args) : 0)
-        + 50) /* slack */;
+        + 50) /* slack */ ;
   arg_buf = (char *) alloca (len);
-  strcpy (arg_buf, "gdbsim"); /* 7 */
+  strcpy (arg_buf, "gdbsim");  /* 7 */
   /* Specify the byte order for the target when it is both selectable
      and explicitly specified by the user (not auto detected). */
-#ifdef TARGET_BYTE_ORDER_SELECTABLE
-  if (!target_byte_order_auto)
+  switch (selected_byte_order ())
     {
-      switch (TARGET_BYTE_ORDER)
-       {
-       case BIG_ENDIAN:
-         strcat (arg_buf, " -E big");
-         break;
-       case LITTLE_ENDIAN:
-         strcat (arg_buf, " -E little");
-         break;
-       default:
-         fatal ("Value of TARGET_BYTE_ORDER unknown");
-       }
+    case BFD_ENDIAN_BIG:
+      strcat (arg_buf, " -E big");
+      break;
+    case BFD_ENDIAN_LITTLE:
+      strcat (arg_buf, " -E little");
+      break;
+    case BFD_ENDIAN_UNKNOWN:
+      break;
     }
-#endif
   /* Specify the architecture of the target when it has been
      explicitly specified */
-  if (!target_architecture_auto)
+  if (selected_architecture_name () != NULL)
     {
-      strcat (arg_buf, " --arch=");
-      strcat (arg_buf, target_architecture->printable_name);
+      strcat (arg_buf, " --architecture=");
+      strcat (arg_buf, selected_architecture_name ());
     }
   /* finally, any explicit args */
   if (args)
     {
-      strcat (arg_buf, " "); /* 1 */
+      strcat (arg_buf, " ");   /* 1 */
       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);
+    error (_("Insufficient memory available to allocate simulator arg list."));
+  make_cleanup_freeargv (argv);
 
   init_callbacks ();
   gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, argv);
 
   if (gdbsim_desc == 0)
-    error ("unable to create simulator instance");
+    error (_("unable to create simulator instance"));
 
   push_target (&gdbsim_ops);
   target_fetch_registers (-1);
@@ -568,8 +551,7 @@ gdbsim_open (args, from_tty)
 /* Close out all files and local state before this target loses control. */
 
 static void
-gdbsim_close (quitting)
-     int quitting;
+gdbsim_close (int quitting)
 {
   if (sr_get_debug ())
     printf_filtered ("gdbsim_close: quitting %d\n", quitting);
@@ -583,6 +565,7 @@ gdbsim_close (quitting)
     }
 
   end_callbacks ();
+  generic_mourn_inferior ();
 }
 
 /* Takes a program previously attached to and detaches it.
@@ -595,9 +578,7 @@ gdbsim_close (quitting)
    Use this when you want to detach and do something else with your gdb.  */
 
 static void
-gdbsim_detach (args,from_tty)
-     char *args;
-     int from_tty;
+gdbsim_detach (char *args, int from_tty)
 {
   if (sr_get_debug ())
     printf_filtered ("gdbsim_detach: args \"%s\"\n", args);
@@ -606,7 +587,7 @@ gdbsim_detach (args,from_tty)
   if (from_tty)
     printf_filtered ("Ending simulator %s debugging\n", target_shortname);
 }
+
 /* Resume execution of the target process.  STEP says whether to single-step
    or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
    to the target, or zero for no signal.  */
@@ -615,12 +596,10 @@ static enum target_signal resume_siggnal;
 static int resume_step;
 
 static void
-gdbsim_resume (pid, step, siggnal)
-     int pid, step;
-     enum target_signal siggnal;
+gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal)
 {
-  if (inferior_pid != 42)
-    error ("The program is not being run.");
+  if (PIDGET (inferior_ptid) != 42)
+    error (_("The program is not being run."));
 
   if (sr_get_debug ())
     printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);
@@ -630,7 +609,7 @@ gdbsim_resume (pid, step, siggnal)
 }
 
 /* Notify the simulator of an asynchronous request to stop.
-   
+
    The simulator shall ensure that the stop request is eventually
    delivered to the simulator.  If the call is made while the
    simulator is not running then the stop request is processed when
@@ -639,25 +618,26 @@ gdbsim_resume (pid, step, siggnal)
    For simulators that do not support this operation, just abort */
 
 static void
-gdbsim_stop ()
+gdbsim_stop (void)
 {
-  if (! sim_stop (gdbsim_desc))
+  if (!sim_stop (gdbsim_desc))
     {
       quit ();
     }
 }
 
 /* GDB version of os_poll_quit callback.
-   Taken from gdb/util.c - should be in a library */
+   Taken from gdb/util.c - should be in a library */
 
 static int
-gdb_os_poll_quit (p)
-     host_callback *p;
+gdb_os_poll_quit (host_callback *p)
 {
-  notice_quit ();
-  if (quit_flag) /* gdb's idea of quit */
+  if (deprecated_ui_loop_hook != NULL)
+    deprecated_ui_loop_hook (0);
+
+  if (quit_flag)               /* gdb's idea of quit */
     {
-      quit_flag = 0; /* we've stolen it */
+      quit_flag = 0;           /* we've stolen it */
       return 1;
     }
   else if (immediate_quit)
@@ -677,10 +657,8 @@ gdbsim_cntrl_c (int signo)
   gdbsim_stop ();
 }
 
-static int
-gdbsim_wait (pid, status)
-     int pid;
-     struct target_waitstatus *status;
+static ptid_t
+gdbsim_wait (ptid_t ptid, struct target_waitstatus *status)
 {
   static RETSIGTYPE (*prev_sigint) ();
   int sigrc = 0;
@@ -689,7 +667,18 @@ gdbsim_wait (pid, status)
   if (sr_get_debug ())
     printf_filtered ("gdbsim_wait\n");
 
+#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
+  {
+    struct sigaction sa, osa;
+    sa.sa_handler = gdbsim_cntrl_c;
+    sigemptyset (&sa.sa_mask);
+    sa.sa_flags = 0;
+    sigaction (SIGINT, &sa, &osa);
+    prev_sigint = osa.sa_handler;
+  }
+#else
   prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
+#endif
   sim_resume (gdbsim_desc, resume_step,
              target_signal_to_host (resume_siggnal));
   signal (SIGINT, prev_sigint);
@@ -722,7 +711,7 @@ gdbsim_wait (pid, status)
     case sim_signalled:
       status->kind = TARGET_WAITKIND_SIGNALLED;
       /* The signal in sigrc is a host signal.  That probably
-        should be fixed.  */
+         should be fixed.  */
       status->value.sig = target_signal_from_host (sigrc);
       break;
     case sim_running:
@@ -731,7 +720,7 @@ gdbsim_wait (pid, status)
       break;
     }
 
-  return inferior_pid;
+  return inferior_ptid;
 }
 
 /* Get ready to modify the registers array.  On machines which store
@@ -741,46 +730,51 @@ gdbsim_wait (pid, status)
    debugged.  */
 
 static void
-gdbsim_prepare_to_store ()
+gdbsim_prepare_to_store (void)
 {
   /* Do nothing, since we can store individual regs */
 }
 
+/* Transfer LEN bytes between GDB address MYADDR and target address
+   MEMADDR.  If WRITE is non-zero, transfer them to the target,
+   otherwise transfer them from the target.  TARGET is unused.
+
+   Returns the number of bytes transferred. */
+
 static int
-gdbsim_xfer_inferior_memory (memaddr, myaddr, len, write, target)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
-     int write;
-     struct target_ops *target;                        /* ignored */
+gdbsim_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
+                            int write, struct mem_attrib *attrib,
+                            struct target_ops *target)
 {
-  if (! program_loaded)
-    error ("No program loaded.");
+  if (!program_loaded)
+    error (_("No program loaded."));
 
   if (sr_get_debug ())
     {
-      printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x%x, memaddr 0x%x, len %d, write %d\n",
-                      myaddr, memaddr, len, write);
+      /* FIXME: Send to something other than STDOUT? */
+      printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x");
+      gdb_print_host_address (myaddr, gdb_stdout);
+      printf_filtered (", memaddr 0x%s, len %d, write %d\n",
+                      paddr_nz (memaddr), len, write);
       if (sr_get_debug () && write)
-       dump_mem(myaddr, len);
+       dump_mem (myaddr, len);
     }
 
   if (write)
     {
       len = sim_write (gdbsim_desc, memaddr, myaddr, len);
     }
-  else 
+  else
     {
       len = sim_read (gdbsim_desc, memaddr, myaddr, len);
       if (sr_get_debug () && len > 0)
-       dump_mem(myaddr, len);
-    } 
+       dump_mem (myaddr, len);
+    }
   return len;
 }
 
 static void
-gdbsim_files_info (target)
-     struct target_ops *target;
+gdbsim_files_info (struct target_ops *target)
 {
   char *file = "nothing";
 
@@ -801,8 +795,8 @@ gdbsim_files_info (target)
 /* Clear the simulator's notion of what the break points are.  */
 
 static void
-gdbsim_mourn_inferior (
-{ 
+gdbsim_mourn_inferior (void)
+{
   if (sr_get_debug ())
     printf_filtered ("gdbsim_mourn_inferior:\n");
 
@@ -811,61 +805,22 @@ gdbsim_mourn_inferior ()
 }
 
 static int
-gdbsim_insert_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+gdbsim_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
-#ifdef SIM_HAS_BREAKPOINTS
-  SIM_RC retcode;
-
-  retcode = sim_set_breakpoint (gdbsim_desc, addr);
-
-  switch (retcode)
-    {
-    case SIM_RC_OK:
-      return 0;
-    case SIM_RC_INSUFFICIENT_RESOURCES:
-      return ENOMEM;
-    default:
-      return EIO;
-    }
-#else
   return memory_insert_breakpoint (addr, contents_cache);
-#endif
 }
 
 static int
-gdbsim_remove_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+gdbsim_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
-#ifdef SIM_HAS_BREAKPOINTS
-  SIM_RC retcode;
-
-  retcode = sim_clear_breakpoint (gdbsim_desc, addr);
-
-  switch (retcode)
-    {
-    case SIM_RC_OK:
-    case SIM_RC_UNKNOWN_BREAKPOINT:
-      return 0;
-    case SIM_RC_INSUFFICIENT_RESOURCES:
-      return ENOMEM;
-    default:
-      return EIO;
-    }
-#else
   return memory_remove_breakpoint (addr, contents_cache);
-#endif
 }
 
 /* Pass the command argument through to the simulator verbatim.  The
    simulator must do any command interpretation work.  */
 
-static void
-simulator_command (args, from_tty)
-     char *args;
-     int from_tty;
+void
+simulator_command (char *args, int from_tty)
 {
   if (gdbsim_desc == NULL)
     {
@@ -880,62 +835,62 @@ simulator_command (args, from_tty)
          commands, is restricted to the period when the channel to the
          simulator is open. */
 
-      error ("Not connected to the simulator target");
+      error (_("Not connected to the simulator target"));
     }
 
   sim_do_command (gdbsim_desc, args);
+
+  /* Invalidate the register cache, in case the simulator command does
+     something funny. */
+  registers_changed ();
 }
 
 /* Define the target subroutine names */
 
-struct target_ops gdbsim_ops = {
-  "sim",                       /* to_shortname */
-  "simulator",                 /* to_longname */
-  "Use the compiled-in simulator.",  /* to_doc */
-  gdbsim_open,                 /* to_open */
-  gdbsim_close,                        /* to_close */
-  NULL,                                /* to_attach */
-  gdbsim_detach,               /* to_detach */
-  gdbsim_resume,               /* to_resume */
-  gdbsim_wait,                 /* to_wait */
-  gdbsim_fetch_register,       /* to_fetch_registers */
-  gdbsim_store_register,       /* to_store_registers */
-  gdbsim_prepare_to_store,     /* to_prepare_to_store */
-  gdbsim_xfer_inferior_memory, /* to_xfer_memory */
-  gdbsim_files_info,           /* to_files_info */
-  gdbsim_insert_breakpoint,    /* to_insert_breakpoint */
-  gdbsim_remove_breakpoint,    /* to_remove_breakpoint */
-  NULL,                                /* to_terminal_init */
-  NULL,                                /* to_terminal_inferior */
-  NULL,                                /* to_terminal_ours_for_output */
-  NULL,                                /* to_terminal_ours */
-  NULL,                                /* to_terminal_info */
-  gdbsim_kill,                 /* to_kill */
-  gdbsim_load,                 /* to_load */
-  NULL,                                /* to_lookup_symbol */
-  gdbsim_create_inferior,      /* to_create_inferior */ 
-  gdbsim_mourn_inferior,       /* to_mourn_inferior */
-  0,                           /* to_can_run */
-  0,                           /* to_notice_signals */
-  0,                           /* to_thread_alive */
-  gdbsim_stop,                 /* to_stop */
-  process_stratum,             /* to_stratum */
-  NULL,                                /* to_next */
-  1,                           /* to_has_all_memory */
-  1,                           /* to_has_memory */
-  1,                           /* to_has_stack */
-  1,                           /* to_has_registers */
-  1,                           /* to_has_execution */
-  NULL,                                /* sections */
-  NULL,                                /* sections_end */
-  OPS_MAGIC,                   /* to_magic */
-};
+struct target_ops gdbsim_ops;
+
+static void
+init_gdbsim_ops (void)
+{
+  gdbsim_ops.to_shortname = "sim";
+  gdbsim_ops.to_longname = "simulator";
+  gdbsim_ops.to_doc = "Use the compiled-in simulator.";
+  gdbsim_ops.to_open = gdbsim_open;
+  gdbsim_ops.to_close = gdbsim_close;
+  gdbsim_ops.to_detach = gdbsim_detach;
+  gdbsim_ops.to_resume = gdbsim_resume;
+  gdbsim_ops.to_wait = gdbsim_wait;
+  gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
+  gdbsim_ops.to_store_registers = gdbsim_store_register;
+  gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
+  gdbsim_ops.deprecated_xfer_memory = gdbsim_xfer_inferior_memory;
+  gdbsim_ops.to_files_info = gdbsim_files_info;
+  gdbsim_ops.to_insert_breakpoint = gdbsim_insert_breakpoint;
+  gdbsim_ops.to_remove_breakpoint = gdbsim_remove_breakpoint;
+  gdbsim_ops.to_kill = gdbsim_kill;
+  gdbsim_ops.to_load = gdbsim_load;
+  gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
+  gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
+  gdbsim_ops.to_stop = gdbsim_stop;
+  gdbsim_ops.to_stratum = process_stratum;
+  gdbsim_ops.to_has_all_memory = 1;
+  gdbsim_ops.to_has_memory = 1;
+  gdbsim_ops.to_has_stack = 1;
+  gdbsim_ops.to_has_registers = 1;
+  gdbsim_ops.to_has_execution = 1;
+  gdbsim_ops.to_magic = OPS_MAGIC;
+
+#ifdef TARGET_REDEFINE_DEFAULT_OPS
+  TARGET_REDEFINE_DEFAULT_OPS (&gdbsim_ops);
+#endif
+}
 
 void
-_initialize_remote_sim ()
+_initialize_remote_sim (void)
 {
+  init_gdbsim_ops ();
   add_target (&gdbsim_ops);
 
   add_com ("sim <command>", class_obscure, simulator_command,
-          "Send a command to the simulator."); 
+          "Send a command to the simulator.");
 }
This page took 0.038488 seconds and 4 git commands to generate.