First cut at supporting simulators in gdbserver:
authorMark Alexander <marka@cygnus>
Tue, 11 Mar 1997 15:49:20 +0000 (15:49 +0000)
committerMark Alexander <marka@cygnus>
Tue, 11 Mar 1997 15:49:20 +0000 (15:49 +0000)
* 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.

gdb/config/mips/vr5000.mt
gdb/configure
gdb/configure.in
gdb/gdbserver/.Sanitize
gdb/gdbserver/configure.in
gdb/gdbserver/low-sim.c [new file with mode: 0644]
gdb/gdbserver/low-sparc.c

index 2d439ee4c74a3f0276bd3220c81f367bfd22fcd6..94fd5b334c786079f9add7e5ab07e4e4af5c52f5 100644 (file)
@@ -3,3 +3,9 @@ TDEPFILES= mips-tdep.o remote-mips.o
 TM_FILE= tm-vr5000.h
 SIM_OBS = remote-sim.o
 SIM = ../sim/mips/libsim.a -lm
+GDBSERVER_DEPFILES= low-sim.o
+GDBSERVER_LIBS = \
+ ../../sim/mips/libsim.a \
+ ../../bfd/libbfd.a \
+ ../../libiberty/libiberty.a \
+ -lm
index 02c60df5be800ff69518a859274b1556bfc96cc1..7fc7bde93f6fbf2c15e2c2cfdf8380b1312a771b 100755 (executable)
@@ -3053,9 +3053,9 @@ if test "${target}" = "${host}"; then
 nativefile=`sed -n '
 s/NAT_FILE[    ]*=[    ]*\([^  ]*\)/\1/p
 ' ${host_makefile_frag}`
-else
+else
 # GDBserver is only useful in a "native" enviroment
-configdirs=`echo $configdirs | sed 's/gdbserver//'`
+configdirs=`echo $configdirs | sed 's/gdbserver//'`
 fi
 
 
index 6e28fc338adff1ef3df733a6a9461d394b277a57..4c75e8fe55a0d53e03c0f2899a2ce5dcd07639b1 100644 (file)
@@ -411,9 +411,9 @@ if test "${target}" = "${host}"; then
 nativefile=`sed -n '
 s/NAT_FILE[    ]*=[    ]*\([^  ]*\)/\1/p
 ' ${host_makefile_frag}`
-else
+else
 # GDBserver is only useful in a "native" enviroment
-configdirs=`echo $configdirs | sed 's/gdbserver//'`
+configdirs=`echo $configdirs | sed 's/gdbserver//'`
 fi
 changequote([,])
 
index 91353f9f929b2cd518be9475f219882599bd9c4e..128ab1d6bb04d28e4104d18f0f206fbd63103b73 100644 (file)
@@ -31,6 +31,7 @@ gdbserver.1
 low-hppabsd.c
 low-linux.c
 low-lynx.c
+low-sim.c
 low-sparc.c
 low-sun3.c
 remote-utils.c
index 2a8ce158ab199de2b4c92209bad0c3272865b1bd..1bbb73c489de3104e97d41fa9da2f5427af6701e 100644 (file)
@@ -4,116 +4,9 @@ gdb_serial_driver=../ser-unix.c
 
 # per-host:
 
-# per-target:
-
-# Hack alert!  We want this directory to be configured only for the target,
-# which is where it will be running, so we just eliminate the per-host section,
-# and make the per-target stuff setup host & host_cpu according to the target.
-
-host_cpu=$target_cpu
-host=$target
-
-# Map host cpu into the config cpu subdirectory name.
-# The default is $host_cpu.
-
-case "${host_cpu}" in
-
-c[12])                 gdb_host_cpu=convex ;;
-hppa*)                 gdb_host_cpu=pa ;;
-i[3456]86)             gdb_host_cpu=i386 ;;
-m68*)                  gdb_host_cpu=m68k ;;
-np1)                   gdb_host_cpu=gould ;;
-pyramid)               gdb_host_cpu=pyr ;;
-*)                     gdb_host_cpu=$target_cpu ;;
-
-esac
-
-# map host info into gdb names.
-
-case "${host}" in
-
-a29k-*-*)              gdb_host=ultra3 ;;
-
-arm-*-*)               gdb_host=arm ;;
-
-c[12]-*-*)             gdb_host=convex ;;
-
-hppa*-hp-bsd*)         gdb_host=hppabsd ;;
-hppa*-hp-hpux*)                gdb_host=hppahpux ;;
-
-i[3456]86-ncr-*)       gdb_host=ncr3000 ;;
-i[3456]86-sequent-*)   gdb_host=symmetry ;;
-
-i[3456]86-*-bsd*)      gdb_host=i386bsd ;;
-i[3456]86-*-lynxos*)   gdb_host=i386lynx ;;
-i[3456]86-*-go32)      gdb_host=go32
-                       gdb_serial_driver=ser-go32.c
-                       ;;
-i[3456]86-*-linux*)    gdb_host=linux ;;
-i[3456]86-pc-linux-gnu)        gdb_host=linux ;;
-i[3456]86-*-mach)      gdb_host=i386mach ;;
-i[3456]86-*-sco3.2v4*) gdb_host=i386sco4 ;;
-i[3456]86-*-sco*)      gdb_host=i386sco ;;
-i[3456]86-*-solaris*)  gdb_host=i386sol2 ;;
-i[3456]86-*-sunos*)    gdb_host=sun386 ;;
-i[3456]86-*-sysv3.2)   gdb_host=i386v32 ;;
-i[3456]86-*-sysv4*)    gdb_host=i386v4 ;;
-i[3456]86-*-sysv*)     gdb_host=i386v ;;
+. ${srcdir}/../configure.host
 
-m680[01]0-sun-sunos3*) gdb_host=sun2os3 ;;
-m680[01]0-sun-sunos4*) gdb_host=sun2os4 ;;
-m68030-sony-*)         gdb_host=news1000 ;;
-
-m68*-altos-*)          gdb_host=altos ;;
-m68*-apollo*-sysv*)    gdb_host=apollo68v ;;
-m68*-apollo*-bsd*)     gdb_host=apollo68b ;;
-m68*-att-*)            gdb_host=3b1 ;;
-m68*-cbm-sysv4*)       gdb_host=amix ;;
-m68*-hp-bsd*)          gdb_host=hp300bsd ;;
-m68*-hp-hpux*)         gdb_host=hp300hpux ;;
-m68*-isi-*)            gdb_host=isi ;;
-m68*-*-lynxos*)                gdb_host=m68klynx ;;
-m68*-sony-*)           gdb_host=news ;;
-m68*-sun-sunos3*)      gdb_host=sun3os3 ;;
-m68*-sun-sunos4*)      gdb_host=sun3os4 ;;
-m68*-sun-*)            gdb_host=sun3os4 ;;
-
-m88k-motorola-*)       gdb_host=delta88 ;;
-m88k-*-*)              gdb_host=m88k ;;
-
-mips-dec-*)            gdb_host=decstation ;;
-mips-little-*)         gdb_host=littlemips ;;
-mips-sgi-irix3)                gdb_host=irix3 ;;
-mips-sgi-irix4*)       gdb_host=irix4 ;;
-mips-sony-*)           gdb_host=bigmips ;;
-
-none-*-*)              gdb_host=none ;;
-
-np1-*-*)               gdb_host=np1 ;;
-
-ns32k-umax-*)          gdb_host=umax ;;
-ns32k-utek-sysv)       gdb_host=merlin ;;
-
-pn-*-*)                        gdb_host=pn ;;
-
-pyramid-*-*)           gdb_host=pyramid ;;
-
-romp-*-*)              gdb_host=rtbsd ;;
-
-rs6000-*-*)            gdb_host=rs6000 ;;
-
-sparc-*-lynxos*)       gdb_host=sparclynx ;;
-sparc-*-solaris2*)     gdb_host=sun4sol2 ;;
-sparc-*-sunos4*)       gdb_host=sun4os4 ;;
-sparc-*-*)             gdb_host=sun4os4 ;;
-
-tahoe-*-*)             gdb_host=tahoe ;;
-
-vax-*-bsd*)            gdb_host=vaxbsd ;;
-vax-*-ultrix2*)                gdb_host=vaxult2 ;;
-vax-*-ultrix*)         gdb_host=vaxult ;;
-
-esac
+echo "gdbserver/configure.in: host is $host, target is $target"
 
 if [ ! -f ${srcdir}/../config/${gdb_host_cpu}/${gdb_host}.mh ]; then
        echo '***' "GDB remote does not support host ${host}" 1>&2
@@ -125,138 +18,9 @@ hostfile=`awk '$1 == "XM_FILE=" { print $2 }' <${srcdir}/../config/${gdb_host_cp
 
 # per-target:
 
-# Map target cpu into the config cpu subdirectory name.
-# The default is $target_cpu.
-
-case "${target_cpu}" in
-
-c[12])                 gdb_target_cpu=convex ;;
-hppa*)                 gdb_target_cpu=pa ;;
-i[3456]86)             gdb_target_cpu=i386 ;;
-m68*)                  gdb_target_cpu=m68k ;;
-np1)                   gdb_target_cpu=gould ;;
-pn)                    gdb_target_cpu=gould ;;
-pyramid)               gdb_target_cpu=pyr ;;
-sparc*)                        gdb_target_cpu=sparc ;;
-*)                     gdb_target_cpu=$target_cpu ;;
-
-esac
-
-# map target info into gdb names.
-
-case "${target}" in
-
-a29k-*-aout)           gdb_target=a29k ;;
-a29k-*-coff)           gdb_target=a29k ;;
-a29k-*-elf)            gdb_target=a29k ;;
-a29k-*-ebmon)          gdb_target=a29k ;;
-a29k-*-kern)           gdb_target=a29k-kern ;;
-a29k-*-none)           gdb_target=a29k ;;
-a29k-*-sym1)           gdb_target=ultra3 ;;
-a29k-*-udi)            gdb_target=a29k-udi ;;
-
-arm-*-*)               gdb_target=arm ;;
-
-c1-*-*)                        gdb_target=convex ;;
-c2-*-*)                        gdb_target=convex ;;
-
-h8300-*-*)             gdb_target=h8300hms ;;
-h8500-*-*)             gdb_target=h8500hms ;;
-
-sh-*-*)                        gdb_target=sh ;;
-
-hppa*-*-bsd*)          gdb_target=hppabsd ;;
-hppa*-*-hpux*)         gdb_target=hppahpux ;;
-
-i[3456]86-sequent-*)   gdb_target=symmetry ;;
-i[3456]86-ncr-*)       gdb_target=ncr3000 ;;
-
-i[3456]86-*-aout)      gdb_target=i386aout ;;
-i[3456]86-*-coff)      gdb_target=i386v ;;
-i[3456]86-*-elf)       gdb_target=i386v ;;
-
-i[3456]86-*-bsd*)      gdb_target=i386bsd ;;
-i[3456]86-*-lynxos*)   gdb_target=i386lynx ;;
-i[3456]86-*-go32)      gdb_target=i386aout ;;
-i[3456]86-*-solaris*)  gdb_target=i386sol2 ;;
-i[3456]86-*-sunos*)    gdb_target=sun386 ;;
-i[3456]86-*-sysv4*)    gdb_target=i386v4 ;;
-i[3456]86-*-sco*)      gdb_target=i386v ;;
-i[3456]86-*-sysv*)     gdb_target=i386v ;;
-i[3456]86-*-linux*)    gdb_target=linux ;;
-
-i960-*-bout)           gdb_target=vxworks960 ;;
-i960-*-coff)           gdb_target=nindy960 ;;
-i960-*-elf)            gdb_target=nindy960 ;;
-
-i960-*-nindy)          gdb_target=nindy960 ;;
-i960-*-vxworks)                gdb_target=vxworks960 ;;
-
-m68000-*-aout)         gdb_target=m68k-nofp ;;
-m68000-*-coff)         gdb_target=m68k-nofp ;;
-m68000-*-elf)          gdb_target=m68k-nofp ;;
-m68000-*-sunos3*)      gdb_target=sun2os3 ;;
-m68000-*-sunos4*)      gdb_target=sun2os4 ;;
-
-m68*-cbm-sysv4*)       gdb_target=amix ;;
-m68*-hp-bsd*)          gdb_target=hp300bsd ;;
-m68*-hp-hpux*)         gdb_target=hp300hpux ;;
-
-m68*-altos-*)          gdb_target=altos ;;
-m68*-att-*)            gdb_target=3b1 ;;
-m68*-ericsson-*)       gdb_target=es1800 ;;
-m68*-isi-*)            gdb_target=isi ;;
-m68*-netx-*)           gdb_target=vxworks68 ;;
-m68*-sony-*)           gdb_target=news ;;
-m68*-tandem-*)         gdb_target=st2000 ;;
-
-m68*-*-aout)           gdb_target=m68k-fp ;;
-m68*-*-coff)           gdb_target=m68k-fp ;;
-m68*-*-elf)            gdb_target=m68k-fp ;;
-m68*-*-lynxos*)                gdb_target=m68klynx ;;
-m68*-*-os68k)          gdb_target=os68k ;;
-m68*-*-sunos3*)                gdb_target=sun3os3 ;;
-m68*-*-sunos4*)                gdb_target=sun3os4 ;;
-m68*-*-vxworks*)       gdb_target=vxworks68 ;;
-
-m88k-motorola-*)       gdb_target=delta88 ;;
-m88k-*-*)              gdb_target=m88k ;;
-
-mips-big-*)            gdb_target=bigmips ;;
-mips-dec-*)            gdb_target=decstation ;;
-mips-idt-ecoff)                gdb_target=idt ;;
-mips-little-*)         gdb_target=littlemips ;;
-mips-sgi-*)            gdb_target=irix3 ;;
-mips-sony-*)           gdb_target=bigmips ;;
-
-none-*-*)              gdb_target=none ;;
-
-np1-*-*)               gdb_target=np1 ;;
-
-ns32k-utek-sysv)       gdb_target=merlin ;;
-ns32k-utek-*)          gdb_target=umax ;;
-
-pn-*-*)                        gdb_target=pn ;;
-
-pyramid-*-*)           gdb_target=pyramid ;;
-
-rs6000-*-*)            gdb_target=rs6000 ;;
-
-sparc-*-aout)          gdb_target=sparc-em ;;
-sparc-*-coff)          gdb_target=sparc-em ;;
-sparc-*-elf)           gdb_target=sparc-em ;;
-sparc-*-lynxos*)       gdb_target=sparclynx ;;
-sparc-*-solaris2*)     gdb_target=sun4sol2 ;;
-sparc-*-sunos4*)       gdb_target=sun4os4 ;;
-sparc-*-vxworks*)      gdb_target=sparc-em ;;
-sparc-*-*)             gdb_target=sun4os4 ;;
-sparclite*-*-*)                gdb_target=sparclite ;;
-
-tahoe-*-*)             gdb_target=tahoe ;;
-vax-*-*)               gdb_target=vax ;;
+. ${srcdir}/../configure.tgt
 
-z8k-*-sim)             gdb_target=z8ksim ;;
-esac
+echo "gdbserver/configure.in: host_cpu is $host_cpu, target_cpu is $target_cpu"
 
 if [ ! -f ${srcdir}/../config/${gdb_target_cpu}/${gdb_target}.mt ]; then
        echo '***' "GDB remote does not support target ${target}" 1>&2
@@ -319,7 +83,7 @@ if [ "${nativefile}" != "" ]; then
 # temporary scaffolding until all hosts have the host/target/native
 # split in place.
 else
-       files="${files} ../config/nm-trash.h"
+       files="${files} ../config/nm-empty.h"
        links="${links} nm.h"
 fi
 
diff --git a/gdb/gdbserver/low-sim.c b/gdb/gdbserver/low-sim.c
new file mode 100644 (file)
index 0000000..3f4c69a
--- /dev/null
@@ -0,0 +1,260 @@
+/* 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 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.
+
+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 */
+
+extern host_callback default_callback; /* in callback.c */
+
+char registers[REGISTER_BYTES];
+
+int target_byte_order; /* used by simulator */
+
+/* This version of "load" should be usable for any simulator that
+   does not support loading itself.  */
+
+static void
+generic_load (loadfile_bfd)
+    bfd *loadfile_bfd;
+{
+  asection *s;
+
+  for (s = loadfile_bfd->sections; s; s = s->next) 
+    {
+      if (s->flags & SEC_LOAD) 
+       {
+         bfd_size_type size;
+
+         size = bfd_get_section_size_before_reloc (s);
+         if (size > 0)
+           {
+             char *buffer;
+             bfd_vma vma;
+
+             buffer = xmalloc (size);
+             vma = bfd_get_section_vma (loadfile_bfd, s);
+
+             /* 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!! */
+
+             bfd_get_section_contents (loadfile_bfd, s, buffer, 0, size);
+
+             write_inferior_memory (vma, buffer, size);
+             free (buffer);
+           }
+       }
+    }
+
+  fprintf (stderr, "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!! */
+}
+
+int
+create_inferior (program, allargs)
+     char *program;
+     char **allargs;
+{
+  bfd *abfd;
+  int pid = 0;
+
+  abfd = bfd_openr (program, 0);
+  if (!abfd) 
+    {
+      fprintf (stderr, "gdbserver: can't open %s: %s\n", 
+              program, bfd_errmsg (bfd_get_error ()));
+      exit (1);
+    }
+
+  if (!bfd_check_format (abfd, bfd_object))
+    {
+      fprintf (stderr, "gdbserver: unknown load format for %s: %s\n",
+              program, bfd_errmsg (bfd_get_error ()));
+      exit (1);
+    }
+
+  /* This must be set before sim_open is called, because gdb assumes that
+     the simulator endianness is known immediately after the sim_open call.  */
+  target_byte_order = bfd_big_endian (abfd) ? 4321 : 1234;
+
+  sim_set_callbacks (&default_callback);
+  default_callback.init (&default_callback);
+
+  /* Should concatenate args here.  FIXME!! */
+  sim_open (allargs[0]);
+
+  /* Load program.  */
+  if (sim_load (allargs[0], 0) != 0)
+    generic_load (abfd);
+
+  return pid;
+}
+
+/* Kill the inferior process.  Make us have no inferior.  */
+
+void
+kill_inferior ()
+{
+  sim_close (0);
+  default_callback.shutdown (&default_callback);
+}
+
+/* Fetch one register.  */
+
+static void
+fetch_register (regno)
+     int regno;
+{
+  sim_fetch_register (regno, &registers[REGISTER_BYTE (regno)]);
+}
+
+/* Fetch all registers, or just one, from the child process.  */
+
+void
+fetch_inferior_registers (regno)
+     int regno;
+{
+  if (regno == -1 || regno == 0)
+    for (regno = 0; regno < NUM_REGS/*-NUM_FREGS*/; regno++)
+      fetch_register (regno);
+  else
+    fetch_register (regno);
+}
+
+/* Store our register values back into the inferior.
+   If REGNO is -1, do this for all registers.
+   Otherwise, REGNO specifies which register (so we can save time).  */
+
+void
+store_inferior_registers (regno)
+     int regno;
+{
+  if (regno  == -1) 
+    {
+      for (regno = 0; regno < NUM_REGS; regno++)
+       store_inferior_registers (regno);
+    }
+  else
+    sim_store_register (regno, &registers[REGISTER_BYTE (regno)]);
+}
+
+/* Return nonzero if the given thread is still alive.  */
+int
+mythread_alive (pid)
+     int pid;
+{
+  return 1;
+}
+
+/* Wait for process, returns status */
+
+unsigned char
+mywait (status)
+     char *status;
+{
+  int sigrc;
+  enum sim_stop reason;
+
+  sim_stop_reason (&reason, &sigrc);
+  switch (reason)
+    {
+    case sim_exited:
+      fprintf (stderr, "\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);
+      *status = 'X';
+      return sigrc;
+#endif
+
+    default:   /* should this be sim_signalled or sim_stopped?  FIXME!! */
+      fprintf (stderr, "\nChild received signal = %x \n", sigrc);
+      fetch_inferior_registers (0);
+      *status = 'T';
+      return (unsigned char) sigrc;
+    }
+}
+
+/* Resume execution of the inferior process.
+   If STEP is nonzero, single-step it.
+   If SIGNAL is nonzero, give it that signal.  */
+
+void
+myresume (step, signo)
+     int step;
+     int signo;
+{
+  /* Should be using target_signal_to_host() or signal numbers in target.h
+     to convert GDB signal number to target signal number.  */
+  sim_resume (step, signo);
+}
+
+/* Copy LEN bytes from inferior's memory starting at MEMADDR
+   to debugger memory starting at MYADDR.  */
+
+void
+read_inferior_memory (memaddr, myaddr, len)
+     CORE_ADDR memaddr;
+     char *myaddr;
+     int len;
+{
+  sim_read (memaddr, myaddr, len);
+}
+
+/* Copy LEN bytes of data from debugger memory at MYADDR
+   to inferior's memory at MEMADDR.
+   On failure (cannot write the inferior)
+   returns the value of errno.  */
+
+int
+write_inferior_memory (memaddr, myaddr, len)
+     CORE_ADDR memaddr;
+     char *myaddr;
+     int len;
+{
+  sim_write (memaddr, myaddr, len);  /* should check for error.  FIXME!! */
+  return 0;
+}
+
+#if 0
+void
+initialize ()
+{
+  inferior_pid = 0;
+}
+
+int
+have_inferior_p ()
+{
+  return inferior_pid != 0;
+}
+#endif
index 6f9810e9a998bcec052403122810acd1aacf1211..ddffaec59276be254c4275a1e861452c0bd56140 100644 (file)
@@ -46,7 +46,7 @@ char buf2[MAX_REGISTER_RAW_SIZE];
 /***************End MY defs*********************/
 
 #include <sys/ptrace.h>
-#include <machine/reg.h>
+#include <sys/reg.h>
 
 extern int sys_nerr;
 extern char **sys_errlist;