From: Mark Alexander Date: Tue, 11 Mar 1997 15:49:20 +0000 (+0000) Subject: First cut at supporting simulators in gdbserver: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=33ef0f9387895c65abe028aa584d490e572100f8;p=binutils-gdb.git 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. --- diff --git a/gdb/config/mips/vr5000.mt b/gdb/config/mips/vr5000.mt index 2d439ee4c74..94fd5b334c7 100644 --- a/gdb/config/mips/vr5000.mt +++ b/gdb/config/mips/vr5000.mt @@ -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 diff --git a/gdb/configure b/gdb/configure index 02c60df5be8..7fc7bde93f6 100755 --- a/gdb/configure +++ b/gdb/configure @@ -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 diff --git a/gdb/configure.in b/gdb/configure.in index 6e28fc338ad..4c75e8fe55a 100644 --- a/gdb/configure.in +++ b/gdb/configure.in @@ -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([,]) diff --git a/gdb/gdbserver/.Sanitize b/gdb/gdbserver/.Sanitize index 91353f9f929..128ab1d6bb0 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 2a8ce158ab1..1bbb73c489d 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 00000000000..3f4c69a5ba1 --- /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, ®isters[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, ®isters[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 6f9810e9a99..ddffaec5927 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 -#include +#include extern int sys_nerr; extern char **sys_errlist;