aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorMark Alexander <marka@cygnus>1997-03-11 15:49:20 +0000
committerMark Alexander <marka@cygnus>1997-03-11 15:49:20 +0000
commit33ef0f9387895c65abe028aa584d490e572100f8 (patch)
tree869237eed07ffc6541c14978dee7ff93a7520f4f /gdb/gdbserver
parent52c92c7f75b082b4a7f958b93edbf690fa6128bf (diff)
downloadgdb-33ef0f9387895c65abe028aa584d490e572100f8.zip
gdb-33ef0f9387895c65abe028aa584d490e572100f8.tar.gz
gdb-33ef0f9387895c65abe028aa584d490e572100f8.tar.bz2
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.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r--gdb/gdbserver/.Sanitize1
-rw-r--r--gdb/gdbserver/configure.in246
-rw-r--r--gdb/gdbserver/low-sim.c260
-rw-r--r--gdb/gdbserver/low-sparc.c2
4 files changed, 267 insertions, 242 deletions
diff --git a/gdb/gdbserver/.Sanitize b/gdb/gdbserver/.Sanitize
index 91353f9..128ab1d 100644
--- a/gdb/gdbserver/.Sanitize
+++ b/gdb/gdbserver/.Sanitize
@@ -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
diff --git a/gdb/gdbserver/configure.in b/gdb/gdbserver/configure.in
index 2a8ce15..1bbb73c 100644
--- a/gdb/gdbserver/configure.in
+++ b/gdb/gdbserver/configure.in
@@ -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
index 0000000..3f4c69a
--- /dev/null
+++ b/gdb/gdbserver/low-sim.c
@@ -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
diff --git a/gdb/gdbserver/low-sparc.c b/gdb/gdbserver/low-sparc.c
index 6f9810e..ddffaec 100644
--- a/gdb/gdbserver/low-sparc.c
+++ b/gdb/gdbserver/low-sparc.c
@@ -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;