]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/gdbserver/low-sim.c
import gdb-1999-11-16 snapshot
[thirdparty/binutils-gdb.git] / gdb / gdbserver / low-sim.c
index 08d600a8ed48dfffefef5f0156bfc3ec5e6e2ece..8d7c2e6c767618f9f80c3e68dab3ac8a7f6d752b 100644 (file)
@@ -1,33 +1,37 @@
 /* Low level interface to simulators, for the remote server for GDB.
    Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 
-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 "bfd.h"
 #include "server.h"
-#include "callback.h"   /* GDB simulator callback interface */
-#include "remote-sim.h" /* GDB simulator interface */
+#include "callback.h"          /* GDB simulator callback interface */
+#include "remote-sim.h"                /* GDB simulator interface */
+
+extern int remote_debug;
 
 extern host_callback default_callback; /* in sim/common/callback.c */
 
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES] __attribute__ ((aligned));
+char * registers = my_registers;
 
-int target_byte_order; /* used by simulator */
+int target_byte_order;         /* used by simulator */
 
 /* We record the result of sim_open so we can pass it
    back to the other sim_foo routines.  */
@@ -38,13 +42,13 @@ static SIM_DESC gdbsim_desc = 0;
 
 static void
 generic_load (loadfile_bfd)
-    bfd *loadfile_bfd;
+     bfd *loadfile_bfd;
 {
   asection *s;
 
-  for (s = loadfile_bfd->sections; s; s = s->next) 
+  for (s = loadfile_bfd->sections; s; s = s->next)
     {
-      if (s->flags & SEC_LOAD) 
+      if (s->flags & SEC_LOAD)
        {
          bfd_size_type size;
 
@@ -52,32 +56,32 @@ generic_load (loadfile_bfd)
          if (size > 0)
            {
              char *buffer;
-             bfd_vma vma;
+             bfd_vma lma;      /* use load address, not virtual address */
 
              buffer = xmalloc (size);
-             vma = bfd_get_section_vma (loadfile_bfd, s);
+             lma = s->lma;
 
              /* Is this really necessary?  I guess it gives the user something
-                to look at during a long download.  */
-             fprintf (stderr, "Loading section %s, size 0x%lx vma 0x%lx\n",
-                      bfd_get_section_name (loadfile_bfd, s),
-                      (unsigned long) size,
-                      (unsigned long) vma); /* chops high 32 bits.  FIXME!! */
+                to look at during a long download.  */
+             printf ("Loading section %s, size 0x%lx lma 0x%lx\n",
+                     bfd_get_section_name (loadfile_bfd, s),
+                     (unsigned long) size,
+                     (unsigned long) lma);     /* chops high 32 bits.  FIXME!! */
 
              bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size);
 
-             write_inferior_memory (vma, buffer, size);
+             write_inferior_memory (lma, buffer, size);
              free (buffer);
            }
        }
     }
 
-  fprintf (stderr, "Start address 0x%lx\n",
-          (unsigned long)loadfile_bfd->start_address);
+  printf ("Start address 0x%lx\n",
+         (unsigned long) loadfile_bfd->start_address);
 
   /* We were doing this in remote-mips.c, I suspect it is right
      for other targets too.  */
-  /* write_pc (loadfile_bfd->start_address); */        /* FIXME!! */
+  /* write_pc (loadfile_bfd->start_address); *//* FIXME!! */
 }
 
 int
@@ -93,9 +97,9 @@ create_inferior (program, argv)
 #endif
 
   abfd = bfd_openr (program, 0);
-  if (!abfd) 
+  if (!abfd)
     {
-      fprintf (stderr, "gdbserver: can't open %s: %s\n", 
+      fprintf (stderr, "gdbserver: can't open %s: %s\n",
               program, bfd_errmsg (bfd_get_error ()));
       exit (1);
     }
@@ -115,25 +119,26 @@ create_inferior (program, argv)
   new_argv = alloca (sizeof (char *) * (nargs + 3));   /* allocate new args */
   for (nargs = 0; argv[nargs] != NULL; nargs++)                /* copy old to new */
     new_argv[nargs] = argv[nargs];
-  new_args[nargs] = "-E";
-  new_args[nargs + 1] = bfd_big_endian (abfd) ? "big" : "little";
-  new_args[nargs + 2] = NULL;
-  argv = new_args;
+  new_argv[nargs] = "-E";
+  new_argv[nargs + 1] = bfd_big_endian (abfd) ? "big" : "little";
+  new_argv[nargs + 2] = NULL;
+  argv = new_argv;
 #endif
 
   /* Create an instance of the simulator.  */
   default_callback.init (&default_callback);
-  gdbsim_desc = sim_open (SIM_OPEN_STANDALONE, &default_callback, argv);
+  gdbsim_desc = sim_open (SIM_OPEN_STANDALONE, &default_callback, abfd, argv);
   if (gdbsim_desc == 0)
     exit (1);
 
   /* Load the program into the simulator.  */
-  if (sim_load (gdbsim_desc, program, NULL, 0) == SIM_RC_FAIL)
-    generic_load (abfd);
+  if (abfd)
+    if (sim_load (gdbsim_desc, program, NULL, 0) == SIM_RC_FAIL)
+      generic_load (abfd);
 
   /* Create an inferior process in the simulator.  This initializes SP.  */
-  sim_create_inferior (gdbsim_desc, argv, /* env */ NULL);
-
+  sim_create_inferior (gdbsim_desc, abfd, argv, /* env */ NULL);
+  sim_resume (gdbsim_desc, 1, 0);      /* execute one instr */
   return pid;
 }
 
@@ -152,7 +157,8 @@ static void
 fetch_register (regno)
      int regno;
 {
-  sim_fetch_register (gdbsim_desc, regno, &registers[REGISTER_BYTE (regno)]);
+  sim_fetch_register (gdbsim_desc, regno, &registers[REGISTER_BYTE (regno)],
+                     REGISTER_RAW_SIZE (regno));
 }
 
 /* Fetch all registers, or just one, from the child process.  */
@@ -162,7 +168,7 @@ fetch_inferior_registers (regno)
      int regno;
 {
   if (regno == -1 || regno == 0)
-    for (regno = 0; regno < NUM_REGS/*-NUM_FREGS*/; regno++)
+    for (regno = 0; regno < NUM_REGS /*-NUM_FREGS*/ ; regno++)
       fetch_register (regno);
   else
     fetch_register (regno);
@@ -176,13 +182,14 @@ void
 store_inferior_registers (regno)
      int regno;
 {
-  if (regno  == -1) 
+  if (regno == -1)
     {
       for (regno = 0; regno < NUM_REGS; regno++)
        store_inferior_registers (regno);
     }
   else
-    sim_store_register (gdbsim_desc, regno, &registers[REGISTER_BYTE (regno)]);
+    sim_store_register (gdbsim_desc, regno, &registers[REGISTER_BYTE (regno)],
+                       REGISTER_RAW_SIZE (regno));
 }
 
 /* Return nonzero if the given thread is still alive.  */
@@ -206,19 +213,22 @@ mywait (status)
   switch (reason)
     {
     case sim_exited:
-      fprintf (stderr, "\nChild exited with retcode = %x \n", sigrc);
+      if (remote_debug)
+       printf ("\nChild exited with retcode = %x \n", sigrc);
       *status = 'W';
       return sigrc;
 
 #if 0
     case sim_stopped:
-      fprintf (stderr, "\nChild terminated with signal = %x \n", sigrc);
+      if (remote_debug)
+       printf ("\nChild terminated with signal = %x \n", sigrc);
       *status = 'X';
       return sigrc;
 #endif
 
-    default:   /* should this be sim_signalled or sim_stopped?  FIXME!! */
-      fprintf (stderr, "\nChild received signal = %x \n", sigrc);
+    default:                   /* should this be sim_signalled or sim_stopped?  FIXME!! */
+      if (remote_debug)
+       printf ("\nChild received signal = %x \n", sigrc);
       fetch_inferior_registers (0);
       *status = 'T';
       return (unsigned char) sigrc;
@@ -262,20 +272,11 @@ write_inferior_memory (memaddr, myaddr, len)
      char *myaddr;
      int len;
 {
-  sim_write (gdbsim_desc, memaddr, myaddr, len);  /* should check for error.  FIXME!! */
+  sim_write (gdbsim_desc, memaddr, myaddr, len);       /* should check for error.  FIXME!! */
   return 0;
 }
 
-#if 0
 void
-initialize ()
-{
-  inferior_pid = 0;
-}
-
-int
-have_inferior_p ()
+initialize_low ()
 {
-  return inferior_pid != 0;
 }
-#endif