diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/Makefile.in gdb/gdbserver/Makefile.in --- /opt/src/gdb/branch/src/gdb/gdbserver/Makefile.in Tue Mar 6 03:21:43 2001 +++ gdb/gdbserver/Makefile.in Sun Jan 20 00:50:28 2002 @@ -1,5 +1,5 @@ #Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, -#1999, 2000 +#1999, 2000, 2001 #Free Software Foundation, Inc. # This file is part of GDB. @@ -86,11 +86,6 @@ BFD_SRC = $(srcdir)/$(BFD_DIR) BFD_CFLAGS = -I$(BFD_DIR) -I$(BFD_SRC) -# Where is the source dir for the READLINE library? Traditionally in .. or . -# (For the binary library built from it, we use ${READLINE_DIR}${subdir}.) -READLINE_DIR = ${srcdir}/../readline -READLINE_DEP = $$(READLINE_DIR) - # All the includes used for CFLAGS and for lint. # -I. for config files. # -I.. for gdb's config files (especially config.h) @@ -137,7 +132,7 @@ SOURCES = $(SFILES) $(ALLDEPFILES) TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS} -OBS = utils.o $(GDBSERVER_DEPFILES) server.o remote-utils.o +OBS = utils.o $(GDBSERVER_DEPFILES) server.o remote-utils.o signals.o regdef.o # Prevent Sun make from putting in the machine type. Setting # TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1. @@ -247,5 +242,8 @@ low-sun3.o : $(srcdir)/low-sun3.c $(srcdir)/server.h low-hppabsd.o : $(srcdir)/low-hppabsd.c $(srcdir)/server.h utils.o : ${srcdir}/utils.c ${srcdir}/server.h +regdef.o : ${srcdir}/regdef.c ${srcdir}/server.h +signals.o : ${srcdir}/../signals.c + ${CC} -c ${INTERNAL_CFLAGS} $< # This is the end of "Makefile.in". diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/gdbreplay.c gdb/gdbserver/gdbreplay.c --- /opt/src/gdb/branch/src/gdb/gdbserver/gdbreplay.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/gdbreplay.c Sun Jan 20 00:50:28 2002 @@ -30,6 +30,9 @@ #include #include #include +#include +#include +#include /* Sort of a hack... */ #define EOL (EOF - 1) @@ -83,8 +86,6 @@ void remote_open (char *name) { - extern char *strchr (); - if (!strchr (name, ':')) { fprintf (stderr, "%s: Must specify tcp connection as host:addr\n", name); diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-hppabsd.c gdb/gdbserver/low-hppabsd.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-hppabsd.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-hppabsd.c Sun Jan 20 00:50:28 2002 @@ -81,6 +81,13 @@ /*************inferior_died ();****VK**************/ } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Return nonzero if the given thread is still alive. */ int mythread_alive (int pid) @@ -229,7 +236,7 @@ errno = 0; if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) { - scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3; + scratch = *(int *) register_data (regno) | 0x3; ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, scratch, 0); if (errno != 0) diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-arm.c gdb/gdbserver/low-linux-arm.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-arm.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-arm.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,46 @@ +/* Linux/i386 specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +int num_regs = 16; + +int regmap[] = { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 56, 60, +}; + +int +cannot_store_register (int regno) +{ + return (regno >= num_regs); +} + +int +cannot_fetch_register (int regno) +{ + return (regno >= num_regs); +} + diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-i386.c gdb/gdbserver/low-linux-i386.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-i386.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-i386.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,59 @@ +/* Linux/i386 specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +/* This module only supports access to the general purpose registers. + Adjust the relevant constants accordingly. + + FIXME: kettenis/2001-03-28: We should really use PTRACE_GETREGS to + get at the registers. Better yet, we should try to share code with + i386-linux-nat.c. */ + +int num_regs = 16; + +/* This stuff comes from i386-linux-nat.c. */ + +/* Mapping between the general-purpose registers in `struct user' + format and GDB's register array layout. */ +int regmap[] = +{ + EAX * 4, ECX * 4, EDX * 4, EBX * 4, + UESP * 4, EBP * 4, ESI * 4, EDI * 4, + EIP * 4, EFL * 4, CS * 4, SS * 4, + DS * 4, ES * 4, FS * 4, GS * 4 +}; + +int +cannot_store_register (int regno) +{ + return (regno >= num_regs); +} + +int +cannot_fetch_register (int regno) +{ + return (regno >= num_regs); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-ia64.c gdb/gdbserver/low-linux-ia64.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-ia64.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-ia64.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,296 @@ +/* Linux/i386 specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +int num_regs = 590; + +#include + +int regmap[] = + { + /* general registers */ + -1, /* gr0 not available; i.e, it's always zero */ + PT_R1, + PT_R2, + PT_R3, + PT_R4, + PT_R5, + PT_R6, + PT_R7, + PT_R8, + PT_R9, + PT_R10, + PT_R11, + PT_R12, + PT_R13, + PT_R14, + PT_R15, + PT_R16, + PT_R17, + PT_R18, + PT_R19, + PT_R20, + PT_R21, + PT_R22, + PT_R23, + PT_R24, + PT_R25, + PT_R26, + PT_R27, + PT_R28, + PT_R29, + PT_R30, + PT_R31, + /* gr32 through gr127 not directly available via the ptrace interface */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* Floating point registers */ + -1, -1, /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */ + PT_F2, + PT_F3, + PT_F4, + PT_F5, + PT_F6, + PT_F7, + PT_F8, + PT_F9, + PT_F10, + PT_F11, + PT_F12, + PT_F13, + PT_F14, + PT_F15, + PT_F16, + PT_F17, + PT_F18, + PT_F19, + PT_F20, + PT_F21, + PT_F22, + PT_F23, + PT_F24, + PT_F25, + PT_F26, + PT_F27, + PT_F28, + PT_F29, + PT_F30, + PT_F31, + PT_F32, + PT_F33, + PT_F34, + PT_F35, + PT_F36, + PT_F37, + PT_F38, + PT_F39, + PT_F40, + PT_F41, + PT_F42, + PT_F43, + PT_F44, + PT_F45, + PT_F46, + PT_F47, + PT_F48, + PT_F49, + PT_F50, + PT_F51, + PT_F52, + PT_F53, + PT_F54, + PT_F55, + PT_F56, + PT_F57, + PT_F58, + PT_F59, + PT_F60, + PT_F61, + PT_F62, + PT_F63, + PT_F64, + PT_F65, + PT_F66, + PT_F67, + PT_F68, + PT_F69, + PT_F70, + PT_F71, + PT_F72, + PT_F73, + PT_F74, + PT_F75, + PT_F76, + PT_F77, + PT_F78, + PT_F79, + PT_F80, + PT_F81, + PT_F82, + PT_F83, + PT_F84, + PT_F85, + PT_F86, + PT_F87, + PT_F88, + PT_F89, + PT_F90, + PT_F91, + PT_F92, + PT_F93, + PT_F94, + PT_F95, + PT_F96, + PT_F97, + PT_F98, + PT_F99, + PT_F100, + PT_F101, + PT_F102, + PT_F103, + PT_F104, + PT_F105, + PT_F106, + PT_F107, + PT_F108, + PT_F109, + PT_F110, + PT_F111, + PT_F112, + PT_F113, + PT_F114, + PT_F115, + PT_F116, + PT_F117, + PT_F118, + PT_F119, + PT_F120, + PT_F121, + PT_F122, + PT_F123, + PT_F124, + PT_F125, + PT_F126, + PT_F127, + /* predicate registers - we don't fetch these individually */ + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + /* branch registers */ + PT_B0, + PT_B1, + PT_B2, + PT_B3, + PT_B4, + PT_B5, + PT_B6, + PT_B7, + /* virtual frame pointer and virtual return address pointer */ + -1, -1, + /* other registers */ + PT_PR, + PT_CR_IIP, /* ip */ + PT_CR_IPSR, /* psr */ + PT_CFM, /* cfm */ + /* kernel registers not visible via ptrace interface (?) */ + -1, -1, -1, -1, -1, -1, -1, -1, + /* hole */ + -1, -1, -1, -1, -1, -1, -1, -1, + PT_AR_RSC, + PT_AR_BSP, + PT_AR_BSPSTORE, + PT_AR_RNAT, + -1, + -1, /* Not available: FCR, IA32 floating control register */ + -1, -1, + -1, /* Not available: EFLAG */ + -1, /* Not available: CSD */ + -1, /* Not available: SSD */ + -1, /* Not available: CFLG */ + -1, /* Not available: FSR */ + -1, /* Not available: FIR */ + -1, /* Not available: FDR */ + -1, + PT_AR_CCV, + -1, -1, -1, + PT_AR_UNAT, + -1, -1, -1, + PT_AR_FPSR, + -1, -1, -1, + -1, /* Not available: ITC */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, + PT_AR_PFS, + PT_AR_LC, + -1, /* Not available: EC, the Epilog Count register */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, + /* nat bits - not fetched directly; instead we obtain these bits from + either rnat or unat or from memory. */ + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + }; + +int +cannot_store_register (int regno) +{ + return 0; +} + +int +cannot_fetch_register (int regno) +{ + return 0; +} + diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-m68k.c gdb/gdbserver/low-linux-m68k.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-m68k.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-m68k.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,64 @@ +/* Linux/i386 specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +int num_regs = 31; + +/* This table must line up with REGISTER_NAMES in tm-m68k.h */ +int regmap[] = +{ +#ifdef PT_D0 + PT_D0 * 4, PT_D1 * 4, PT_D2 * 4, PT_D3 * 4, + PT_D4 * 4, PT_D5 * 4, PT_D6 * 4, PT_D7 * 4, + PT_A0 * 4, PT_A1 * 4, PT_A2 * 4, PT_A3 * 4, + PT_A4 * 4, PT_A5 * 4, PT_A6 * 4, PT_USP * 4, + PT_SR * 4, PT_PC * 4, +#else + 14 * 4, 0 * 4, 1 * 4, 2 * 4, 3 * 4, 4 * 4, 5 * 4, 6 * 4, + 7 * 4, 8 * 4, 9 * 4, 10 * 4, 11 * 4, 12 * 4, 13 * 4, 15 * 4, + 17 * 4, 18 * 4, +#endif +#ifdef PT_FP0 + PT_FP0 * 4, PT_FP1 * 4, PT_FP2 * 4, PT_FP3 * 4, + PT_FP4 * 4, PT_FP5 * 4, PT_FP6 * 4, PT_FP7 * 4, + PT_FPCR * 4, PT_FPSR * 4, PT_FPIAR * 4 +#else + 21 * 4, 24 * 4, 27 * 4, 30 * 4, 33 * 4, 36 * 4, + 39 * 4, 42 * 4, 45 * 4, 46 * 4, 47 * 4 +#endif +}; + +int +cannot_store_register (int regno) +{ + return (regno >= num_regs); +} + +int +cannot_fetch_register (int regno) +{ + return (regno >= num_regs); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-mips.c gdb/gdbserver/low-linux-mips.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-mips.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-mips.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,104 @@ +/* Linux/i386 specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +int num_regs = 90; + +#include + +/* Return the ptrace ``address'' of register REGNO. */ + +/* Matches mips_generic32_regs */ +int regmap[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + + -1, MMLO, MMHI, BADVADDR, CAUSE, PC, + + FPR_BASE, FPR_BASE + 1, FPR_BASE + 2, FPR_BASE + 3, + FPR_BASE + 4, FPR_BASE + 5, FPR_BASE + 6, FPR_BASE + 7, + FPR_BASE + 8, FPR_BASE + 8, FPR_BASE + 10, FPR_BASE + 11, + FPR_BASE + 12, FPR_BASE + 13, FPR_BASE + 14, FPR_BASE + 15, + FPR_BASE + 16, FPR_BASE + 17, FPR_BASE + 18, FPR_BASE + 19, + FPR_BASE + 20, FPR_BASE + 21, FPR_BASE + 22, FPR_BASE + 23, + FPR_BASE + 24, FPR_BASE + 25, FPR_BASE + 26, FPR_BASE + 27, + FPR_BASE + 28, FPR_BASE + 29, FPR_BASE + 30, FPR_BASE + 31, + FPC_CSR, FPC_EIR, + + -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, +}; + +/* From mips-linux-nat.c. */ + +/* Pseudo registers can not be read. ptrace does not provide a way to + read (or set) PS_REGNUM, and there's no point in reading or setting + ZERO_REGNUM. We also can not set BADVADDR, CAUSE, or FCRIR via + ptrace(). */ + +int +cannot_fetch_register (int regno) +{ + struct reg *reg; + + if (regmap[regno] == -1) + return 1; + + reg = find_register_by_number (regno); + + if (strcmp (reg->name, "zero") == 0) + return 1; + + return 0; +} + +int +cannot_store_register (int regno) +{ + struct reg *reg; + + if (regmap[regno] == -1) + return 1; + + reg = find_register_by_number (regno); + + if (strcmp (reg->name, "zero") == 0) + return 1; + + if (strcmp (reg->name, "cause") == 0) + return 1; + + if (strcmp (reg->name, "bad") == 0) + return 1; + + if (strcmp (reg->name, "fir") == 0) + return 1; + + return 0; +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-ppc.c gdb/gdbserver/low-linux-ppc.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-ppc.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-ppc.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,60 @@ +/* Linux/PowerPC specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#include + +int num_regs = 71; + +/* Currently, don't check/send MQ. */ +int regmap[] = + {PT_R0 * 4, PT_R1 * 4, PT_R2 * 4, PT_R3 * 4, + PT_R4 * 4, PT_R5 * 4, PT_R6 * 4, PT_R7 * 4, + PT_R8 * 4, PT_R9 * 4, PT_R10 * 4, PT_R11 * 4, + PT_R12 * 4, PT_R13 * 4, PT_R14 * 4, PT_R15 * 4, + PT_R16 * 4, PT_R17 * 4, PT_R18 * 4, PT_R19 * 4, + PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4, + PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4, + PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4, + PT_FPR0*4, PT_FPR0*4 + 8, PT_FPR0*4+16, PT_FPR0*4+24, + PT_FPR0*4+32, PT_FPR0*4+40, PT_FPR0*4+48, PT_FPR0*4+56, + PT_FPR0*4+64, PT_FPR0*4+72, PT_FPR0*4+80, PT_FPR0*4+88, + PT_FPR0*4+96, PT_FPR0*4+104, PT_FPR0*4+112, PT_FPR0*4+120, + PT_FPR0*4+128, PT_FPR0*4+136, PT_FPR0*4+144, PT_FPR0*4+152, + PT_FPR0*4+160, PT_FPR0*4+168, PT_FPR0*4+176, PT_FPR0*4+184, + PT_FPR0*4+192, PT_FPR0*4+200, PT_FPR0*4+208, PT_FPR0*4+216, + PT_FPR0*4+224, PT_FPR0*4+232, PT_FPR0*4+240, PT_FPR0*4+248, + PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4, + PT_CTR * 4, PT_XER * 4, -1, }; + +int +cannot_store_register (int regno) +{ + return 0; +} + +int +cannot_fetch_register (int regno) +{ + return 0; +} + diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-sh.c gdb/gdbserver/low-linux-sh.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux-sh.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/low-linux-sh.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,58 @@ +/* Linux/SH specific low level interface, for the remote server for GDB. + Copyright 1995, 1996, 1998, 1999, 2000, 2001 + 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 "server.h" + +#ifdef HAVE_SYS_REG_H +#include +#endif + +#include + +int num_regs = 41; + +/* Currently, don't check/send MQ. */ +int regmap[] = { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 44, 48, 52, 56, 60, + + REG_PC*4, REG_PR*4, REG_GBR*4, -1, + REG_MACH*4, REG_MACL*4, REG_SR*4, + REG_FPUL*4, REG_FPSCR*4, + + REG_FPREG0+0, REG_FPREG0+4, REG_FPREG0+8, REG_FPREG0+12, + REG_FPREG0+16, REG_FPREG0+20, REG_FPREG0+24, REG_FPREG0+28, + REG_FPREG0+32, REG_FPREG0+36, REG_FPREG0+40, REG_FPREG0+44, + REG_FPREG0+48, REG_FPREG0+52, REG_FPREG0+56, REG_FPREG0+60, +}; + +int +cannot_store_register (int regno) +{ + return 0; +} + +int +cannot_fetch_register (int regno) +{ + return 0; +} + diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-linux.c gdb/gdbserver/low-linux.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-linux.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-linux.c Sun Jan 20 00:50:28 2002 @@ -21,8 +21,6 @@ #include "server.h" #include -#include "frame.h" -#include "inferior.h" #include #include @@ -32,24 +30,20 @@ #include #include #include - -/***************Begin MY defs*********************/ -static char my_registers[REGISTER_BYTES]; -char *registers = my_registers; -/***************End MY defs*********************/ +#include +#include +#include #ifdef HAVE_SYS_REG_H #include #endif -/* Default the type of the ptrace transfer to int. */ -#ifndef PTRACE_XFER_TYPE +#define PTRACE_ARG3_TYPE long #define PTRACE_XFER_TYPE int -#endif extern int errno; - -static void initialize_arch (void); +extern int num_regs; +extern int regmap[]; /* Start an inferior process and returns its pid. ALLARGS is a vector of program-name and args. */ @@ -70,7 +64,7 @@ execv (program, allargs); fprintf (stderr, "Cannot exec %s: %s.\n", program, - errno < sys_nerr ? sys_errlist[errno] : "unknown error"); + strerror (errno)); fflush (stderr); _exit (0177); } @@ -78,6 +72,23 @@ return pid; } +/* Attach to an inferior process. */ + +int +myattach (int pid) +{ + if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0) + { + fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid, + errno < sys_nerr ? sys_errlist[errno] : "unknown error", + errno); + fflush (stderr); + _exit (0177); + } + + return 0; +} + /* Kill the inferior process. Make us have no inferior. */ void @@ -87,7 +98,6 @@ return; ptrace (PTRACE_KILL, inferior_pid, 0, 0); wait (0); -/*************inferior_died ();****VK**************/ } /* Return nonzero if the given thread is still alive. */ @@ -106,7 +116,7 @@ union wait w; enable_async_io (); - pid = waitpid (inferior_pid, &w, 0); + pid = waitpid (inferior_pid, (int *)&w, 0); disable_async_io (); if (pid != inferior_pid) perror_with_name ("wait"); @@ -144,418 +154,23 @@ } -#if !defined (offsetof) -#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) -#endif - -/* U_REGS_OFFSET is the offset of the registers within the u area. */ -#if !defined (U_REGS_OFFSET) -#define U_REGS_OFFSET \ - ptrace (PT_READ_U, inferior_pid, \ - (PTRACE_ARG3_TYPE) (offsetof (struct user, u_ar0)), 0) \ - - KERNEL_U_ADDR -#endif - -#ifdef I386_GNULINUX_TARGET -/* This module only supports access to the general purpose registers. - Adjust the relevant constants accordingly. - - FIXME: kettenis/2001-03-28: We should really use PTRACE_GETREGS to - get at the registers. Better yet, we should try to share code with - i386-linux-nat.c. */ -#undef NUM_FREGS -#define NUM_FREGS 0 -#undef NUM_REGS -#define NUM_REGS NUM_GREGS - -/* This stuff comes from i386-tdep.c. */ - -/* i386_register_byte[i] is the offset into the register file of the - start of register number i. We initialize this from - i386_register_raw_size. */ -int i386_register_byte[MAX_NUM_REGS]; - -/* i386_register_raw_size[i] is the number of bytes of storage in - GDB's register array occupied by register i. */ -int i386_register_raw_size[MAX_NUM_REGS] = { - 4, 4, 4, 4, - 4, 4, 4, 4, - 4, 4, 4, 4, - 4, 4, 4, 4, - 10, 10, 10, 10, - 10, 10, 10, 10, - 4, 4, 4, 4, - 4, 4, 4, 4, - 16, 16, 16, 16, - 16, 16, 16, 16, - 4 -}; - -static void -initialize_arch (void) -{ - /* Initialize the table saying where each register starts in the - register file. */ - { - int i, offset; - - offset = 0; - for (i = 0; i < MAX_NUM_REGS; i++) - { - i386_register_byte[i] = offset; - offset += i386_register_raw_size[i]; - } - } -} - -/* This stuff comes from i386-linux-nat.c. */ - -/* Mapping between the general-purpose registers in `struct user' - format and GDB's register array layout. */ -static int regmap[] = -{ - EAX, ECX, EDX, EBX, - UESP, EBP, ESI, EDI, - EIP, EFL, CS, SS, - DS, ES, FS, GS -}; - -/* Return the address of register REGNUM. BLOCKEND is the value of - u.u_ar0, which should point to the registers. */ - -CORE_ADDR -register_u_addr (CORE_ADDR blockend, int regnum) -{ - return (blockend + 4 * regmap[regnum]); -} -#elif defined(TARGET_M68K) -static void -initialize_arch (void) -{ - return; -} - -/* This table must line up with REGISTER_NAMES in tm-m68k.h */ -static int regmap[] = -{ -#ifdef PT_D0 - PT_D0, PT_D1, PT_D2, PT_D3, PT_D4, PT_D5, PT_D6, PT_D7, - PT_A0, PT_A1, PT_A2, PT_A3, PT_A4, PT_A5, PT_A6, PT_USP, - PT_SR, PT_PC, -#else - 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, - 17, 18, -#endif -#ifdef PT_FP0 - PT_FP0, PT_FP1, PT_FP2, PT_FP3, PT_FP4, PT_FP5, PT_FP6, PT_FP7, - PT_FPCR, PT_FPSR, PT_FPIAR -#else - 21, 24, 27, 30, 33, 36, 39, 42, 45, 46, 47 -#endif -}; - -/* BLOCKEND is the value of u.u_ar0, and points to the place where GS - is stored. */ - -int -m68k_linux_register_u_addr (int blockend, int regnum) -{ - return (blockend + 4 * regmap[regnum]); -} -#elif defined(IA64_GNULINUX_TARGET) -#undef NUM_FREGS -#define NUM_FREGS 0 - -#include - -static int u_offsets[] = - { - /* general registers */ - -1, /* gr0 not available; i.e, it's always zero */ - PT_R1, - PT_R2, - PT_R3, - PT_R4, - PT_R5, - PT_R6, - PT_R7, - PT_R8, - PT_R9, - PT_R10, - PT_R11, - PT_R12, - PT_R13, - PT_R14, - PT_R15, - PT_R16, - PT_R17, - PT_R18, - PT_R19, - PT_R20, - PT_R21, - PT_R22, - PT_R23, - PT_R24, - PT_R25, - PT_R26, - PT_R27, - PT_R28, - PT_R29, - PT_R30, - PT_R31, - /* gr32 through gr127 not directly available via the ptrace interface */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* Floating point registers */ - -1, -1, /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */ - PT_F2, - PT_F3, - PT_F4, - PT_F5, - PT_F6, - PT_F7, - PT_F8, - PT_F9, - PT_F10, - PT_F11, - PT_F12, - PT_F13, - PT_F14, - PT_F15, - PT_F16, - PT_F17, - PT_F18, - PT_F19, - PT_F20, - PT_F21, - PT_F22, - PT_F23, - PT_F24, - PT_F25, - PT_F26, - PT_F27, - PT_F28, - PT_F29, - PT_F30, - PT_F31, - PT_F32, - PT_F33, - PT_F34, - PT_F35, - PT_F36, - PT_F37, - PT_F38, - PT_F39, - PT_F40, - PT_F41, - PT_F42, - PT_F43, - PT_F44, - PT_F45, - PT_F46, - PT_F47, - PT_F48, - PT_F49, - PT_F50, - PT_F51, - PT_F52, - PT_F53, - PT_F54, - PT_F55, - PT_F56, - PT_F57, - PT_F58, - PT_F59, - PT_F60, - PT_F61, - PT_F62, - PT_F63, - PT_F64, - PT_F65, - PT_F66, - PT_F67, - PT_F68, - PT_F69, - PT_F70, - PT_F71, - PT_F72, - PT_F73, - PT_F74, - PT_F75, - PT_F76, - PT_F77, - PT_F78, - PT_F79, - PT_F80, - PT_F81, - PT_F82, - PT_F83, - PT_F84, - PT_F85, - PT_F86, - PT_F87, - PT_F88, - PT_F89, - PT_F90, - PT_F91, - PT_F92, - PT_F93, - PT_F94, - PT_F95, - PT_F96, - PT_F97, - PT_F98, - PT_F99, - PT_F100, - PT_F101, - PT_F102, - PT_F103, - PT_F104, - PT_F105, - PT_F106, - PT_F107, - PT_F108, - PT_F109, - PT_F110, - PT_F111, - PT_F112, - PT_F113, - PT_F114, - PT_F115, - PT_F116, - PT_F117, - PT_F118, - PT_F119, - PT_F120, - PT_F121, - PT_F122, - PT_F123, - PT_F124, - PT_F125, - PT_F126, - PT_F127, - /* predicate registers - we don't fetch these individually */ - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - /* branch registers */ - PT_B0, - PT_B1, - PT_B2, - PT_B3, - PT_B4, - PT_B5, - PT_B6, - PT_B7, - /* virtual frame pointer and virtual return address pointer */ - -1, -1, - /* other registers */ - PT_PR, - PT_CR_IIP, /* ip */ - PT_CR_IPSR, /* psr */ - PT_CFM, /* cfm */ - /* kernel registers not visible via ptrace interface (?) */ - -1, -1, -1, -1, -1, -1, -1, -1, - /* hole */ - -1, -1, -1, -1, -1, -1, -1, -1, - PT_AR_RSC, - PT_AR_BSP, - PT_AR_BSPSTORE, - PT_AR_RNAT, - -1, - -1, /* Not available: FCR, IA32 floating control register */ - -1, -1, - -1, /* Not available: EFLAG */ - -1, /* Not available: CSD */ - -1, /* Not available: SSD */ - -1, /* Not available: CFLG */ - -1, /* Not available: FSR */ - -1, /* Not available: FIR */ - -1, /* Not available: FDR */ - -1, - PT_AR_CCV, - -1, -1, -1, - PT_AR_UNAT, - -1, -1, -1, - PT_AR_FPSR, - -1, -1, -1, - -1, /* Not available: ITC */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, - PT_AR_PFS, - PT_AR_LC, - -1, /* Not available: EC, the Epilog Count register */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, - /* nat bits - not fetched directly; instead we obtain these bits from - either rnat or unat or from memory. */ - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, - }; +#define REGISTER_RAW_SIZE(regno) register_size((regno)) int -ia64_register_u_addr (int blockend, int regnum) +register_addr (int regnum, CORE_ADDR blockend) { int addr; - if (regnum < 0 || regnum >= NUM_REGS) + if (regnum < 0 || regnum >= num_regs) error ("Invalid register number %d.", regnum); - addr = u_offsets[regnum]; + addr = regmap[regnum]; if (addr == -1) addr = 0; return addr; } -static void -initialize_arch (void) -{ - return; -} -#endif - -CORE_ADDR -register_addr (int regno, CORE_ADDR blockend) -{ - CORE_ADDR addr; - - if (regno < 0 || regno >= NUM_REGS) - error ("Invalid register number %d.", regno); - - REGISTER_U_ADDR (addr, blockend, regno); - - return addr; -} - /* Fetch one register. */ static void @@ -564,16 +179,19 @@ CORE_ADDR regaddr; register int i; - /* Offset of registers within the u area. */ - unsigned int offset; + if (regno >= num_regs) + return; - offset = U_REGS_OFFSET; + if (cannot_fetch_register (regno)) + return; - regaddr = register_addr (regno, offset); + regaddr = register_addr (regno, 0); + if (regaddr == -1) + return; for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE)) { errno = 0; - *(PTRACE_XFER_TYPE *) ®isters[REGISTER_BYTE (regno) + i] = + *(PTRACE_XFER_TYPE *) (register_data (regno) + i) = ptrace (PTRACE_PEEKUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, 0); regaddr += sizeof (PTRACE_XFER_TYPE); if (errno != 0) @@ -596,7 +214,7 @@ fetch_inferior_registers (int regno) { if (regno == -1 || regno == 0) - for (regno = 0; regno < NUM_REGS - NUM_FREGS; regno++) + for (regno = 0; regno < num_regs; regno++) fetch_register (regno); else fetch_register (regno); @@ -611,62 +229,43 @@ { CORE_ADDR regaddr; int i; - unsigned int offset = U_REGS_OFFSET; if (regno >= 0) { -#if 0 - if (CANNOT_STORE_REGISTER (regno)) + if (regno >= num_regs) + return; + + if (cannot_store_register (regno)) + return; + + regaddr = register_addr (regno, 0); + if (regaddr == -1) return; -#endif - regaddr = register_addr (regno, offset); errno = 0; -#if 0 - if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) + for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) { - scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3; - ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - scratch, 0); + errno = 0; + ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, + *(int *) (register_data (regno) + i)); if (errno != 0) { - /* Error, even if attached. Failing to write these two - registers is pretty serious. */ - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); + /* Warning, not error, in case we are attached; sometimes the + kernel doesn't let us at the registers. */ + char *err = strerror (errno); + char *msg = alloca (strlen (err) + 128); + sprintf (msg, "writing register %d: %s", + regno, err); + error (msg); + return; } + regaddr += sizeof (int); } - else -#endif - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) - { - errno = 0; - ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - *(int *) ®isters[REGISTER_BYTE (regno) + i]); - if (errno != 0) - { - /* Warning, not error, in case we are attached; sometimes the - kernel doesn't let us at the registers. */ - char *err = strerror (errno); - char *msg = alloca (strlen (err) + 128); - sprintf (msg, "writing register %d: %s", - regno, err); - error (msg); - return; - } - regaddr += sizeof (int); - } } else - for (regno = 0; regno < NUM_REGS - NUM_FREGS; regno++) + for (regno = 0; regno < num_regs; regno++) store_inferior_registers (regno); } -/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory - in the NEW_SUN_PTRACE case. - It ought to be straightforward. But it appears that writing did - not write the data that I specified. I cannot understand where - it got the data that it actually did write. */ - /* Copy LEN bytes from inferior's memory starting at MEMADDR to debugger memory starting at MYADDR. */ @@ -687,7 +286,7 @@ /* Read all the longwords */ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) { - buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); + buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0); } /* Copy appropriate bytes out of the buffer. */ @@ -714,13 +313,13 @@ /* Fill start and end extra bytes of buffer with existing memory data. */ - buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); + buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0); if (count > 1) { buffer[count - 1] = ptrace (PTRACE_PEEKTEXT, inferior_pid, - addr + (count - 1) * sizeof (PTRACE_XFER_TYPE), 0); + (PTRACE_ARG3_TYPE) (addr + (count - 1) * sizeof (PTRACE_XFER_TYPE)), 0); } /* Copy data to be written over corresponding part of buffer */ @@ -732,7 +331,7 @@ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) { errno = 0; - ptrace (PTRACE_POKETEXT, inferior_pid, addr, buffer[i]); + ptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, buffer[i]); if (errno) return errno; } @@ -743,5 +342,5 @@ void initialize_low (void) { - initialize_arch (); + init_registers (); } diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-lynx.c gdb/gdbserver/low-lynx.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-lynx.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-lynx.c Sun Jan 20 00:50:28 2002 @@ -87,6 +87,13 @@ return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void @@ -521,7 +528,7 @@ else regoffset = REGISTER_BYTE (regno) - REGISTER_BYTE (I0_REGNUM) + FRAME_SAVED_I0; - target_xfer_memory (sp + regoffset, ®isters[REGISTER_BYTE (regno)], + target_xfer_memory (sp + regoffset, register_data (regno), REGISTER_RAW_SIZE (regno), 1); } } @@ -606,7 +613,7 @@ if (errno) perror_with_name ("fetch_inferior_registers(PTRACE_PEEKTHREAD)"); - *(unsigned long *) ®isters[REGISTER_BYTE (regno)] = reg; + *(unsigned long *) register_data (regno) = reg; } } @@ -631,7 +638,7 @@ ptrace_fun = regno == SP_REGNUM ? PTRACE_POKEUSP : PTRACE_POKEUSER; #endif - reg = *(unsigned long *) ®isters[REGISTER_BYTE (regno)]; + reg = *(unsigned long *) register_data (regno); errno = 0; ptrace (ptrace_fun, BUILDPID (inferior_pid, general_thread), diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-nbsd.c gdb/gdbserver/low-nbsd.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-nbsd.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-nbsd.c Sun Jan 20 00:50:28 2002 @@ -145,6 +145,13 @@ return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-sim.c gdb/gdbserver/low-sim.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-sim.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-sim.c Sun Jan 20 00:50:28 2002 @@ -139,6 +139,13 @@ return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void @@ -153,7 +160,7 @@ static void fetch_register (int regno) { - sim_fetch_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)], + sim_fetch_register (gdbsim_desc, regno, register_data (regno), REGISTER_RAW_SIZE (regno)); } @@ -182,7 +189,7 @@ store_inferior_registers (regno); } else - sim_store_register (gdbsim_desc, regno, ®isters[REGISTER_BYTE (regno)], + sim_store_register (gdbsim_desc, regno, register_data (regno), REGISTER_RAW_SIZE (regno)); } diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-sparc.c gdb/gdbserver/low-sparc.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-sparc.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-sparc.c Sun Jan 20 00:50:28 2002 @@ -75,6 +75,13 @@ return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/low-sun3.c gdb/gdbserver/low-sun3.c --- /opt/src/gdb/branch/src/gdb/gdbserver/low-sun3.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/low-sun3.c Sun Jan 20 00:50:28 2002 @@ -72,6 +72,13 @@ return pid; } +/* Attaching is not supported. */ +int +myattach (int pid) +{ + return -1; +} + /* Kill the inferior process. Make us have no inferior. */ void diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-arm.c gdb/gdbserver/reg-arm.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-arm.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-arm.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,20 @@ +#include "regdef.h" + +struct reg arm_regs[] = { + R4("r0"), R4("r1"), R4("r2"), R4("r3"), + R4("r4"), R4("r5"), R4("r6"), R4("r7"), + R4("r8"), R4("r9"), R4("r10"), R4("r11"), + R4("r12"), R4("sp"), R4("lr"), R4("pc"), + R12("f0"), R12("f1"), R12("f2"), R12("f3"), + R12("f4"), R12("f5"), R12("f6"), R12("f7"), + R4("fps"), R4("cpsr"), +}; + +const char *gdbserver_resume_regs[] = { "r11", "sp", "pc", 0 }; + +void +init_registers (void) +{ + set_register_cache (arm_regs, + sizeof (arm_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-i386.c gdb/gdbserver/reg-i386.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-i386.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-i386.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,24 @@ +#include "regdef.h" + +struct reg i386_regs[] = { + R4("eax"), R4("ecx"), R4("edx"), R4("ebx"), + R4("esp"), R4("ebp"), R4("esi"), R4("edi"), + R4("eip"), R4("eflags"), R4("cs"), R4("ss"), + R4("ds"), R4("es"), R4("fs"), R4("gs"), + R10("st0"), R10("st1"), R10("st2"), R10("st3"), + R10("st4"), R10("st5"), R10("st6"), R10("st7"), + R4("fctrl"), R4("fstat"), R4("ftag"), R4("fiseg"), + R4("fioff"), R4("foseg"), R4("fooff"), R4("fop"), + R16("xmm0"), R16("xmm1"), R16("xmm2"), R16("xmm3"), + R16("xmm4"), R16("xmm5"), R16("xmm6"), R16("xmm7"), + R4("mxcsr") +}; + +const char *gdbserver_resume_regs[] = { "ebp", "esp", "eip", 0 }; + +void +init_registers (void) +{ + set_register_cache (i386_regs, + sizeof (i386_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-ia64.c gdb/gdbserver/reg-ia64.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-ia64.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-ia64.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,169 @@ +#include "regdef.h" + +static struct ia64_regs[] = { + R8("r0"), R8("r1"), R8("r2"), R8("r3"), + R8("r4"), R8("r5"), R8("r6"), R8("r7"), + R8("r8"), R8("r9"), R8("r10"), R8("r11"), + R8("r12"), R8("r13"), R8("r14"), R8("r15"), + R8("r16"), R8("r17"), R8("r18"), R8("r19"), + R8("r20"), R8("r21"), R8("r22"), R8("r23"), + R8("r24"), R8("r25"), R8("r26"), R8("r27"), + R8("r28"), R8("r29"), R8("r30"), R8("r31"), + R8("r32"), R8("r33"), R8("r34"), R8("r35"), + R8("r36"), R8("r37"), R8("r38"), R8("r39"), + R8("r40"), R8("r41"), R8("r42"), R8("r43"), + R8("r44"), R8("r45"), R8("r46"), R8("r47"), + R8("r48"), R8("r49"), R8("r50"), R8("r51"), + R8("r52"), R8("r53"), R8("r54"), R8("r55"), + R8("r56"), R8("r57"), R8("r58"), R8("r59"), + R8("r60"), R8("r61"), R8("r62"), R8("r63"), + R8("r64"), R8("r65"), R8("r66"), R8("r67"), + R8("r68"), R8("r69"), R8("r70"), R8("r71"), + R8("r72"), R8("r73"), R8("r74"), R8("r75"), + R8("r76"), R8("r77"), R8("r78"), R8("r79"), + R8("r80"), R8("r81"), R8("r82"), R8("r83"), + R8("r84"), R8("r85"), R8("r86"), R8("r87"), + R8("r88"), R8("r89"), R8("r90"), R8("r91"), + R8("r92"), R8("r93"), R8("r94"), R8("r95"), + R8("r96"), R8("r97"), R8("r98"), R8("r99"), + R8("r100"), R8("r101"), R8("r102"), R8("r103"), + R8("r104"), R8("r105"), R8("r106"), R8("r107"), + R8("r108"), R8("r109"), R8("r110"), R8("r111"), + R8("r112"), R8("r113"), R8("r114"), R8("r115"), + R8("r116"), R8("r117"), R8("r118"), R8("r119"), + R8("r120"), R8("r121"), R8("r122"), R8("r123"), + R8("r124"), R8("r125"), R8("r126"), R8("r127"), + + R16("f0"), R16("f1"), R16("f2"), R16("f3"), + R16("f4"), R16("f5"), R16("f6"), R16("f7"), + R16("f8"), R16("f9"), R16("f10"), R16("f11"), + R16("f12"), R16("f13"), R16("f14"), R16("f15"), + R16("f16"), R16("f17"), R16("f18"), R16("f19"), + R16("f20"), R16("f21"), R16("f22"), R16("f23"), + R16("f24"), R16("f25"), R16("f26"), R16("f27"), + R16("f28"), R16("f29"), R16("f30"), R16("f31"), + R16("f32"), R16("f33"), R16("f34"), R16("f35"), + R16("f36"), R16("f37"), R16("f38"), R16("f39"), + R16("f40"), R16("f41"), R16("f42"), R16("f43"), + R16("f44"), R16("f45"), R16("f46"), R16("f47"), + R16("f48"), R16("f49"), R16("f50"), R16("f51"), + R16("f52"), R16("f53"), R16("f54"), R16("f55"), + R16("f56"), R16("f57"), R16("f58"), R16("f59"), + R16("f60"), R16("f61"), R16("f62"), R16("f63"), + R16("f64"), R16("f65"), R16("f66"), R16("f67"), + R16("f68"), R16("f69"), R16("f70"), R16("f71"), + R16("f72"), R16("f73"), R16("f74"), R16("f75"), + R16("f76"), R16("f77"), R16("f78"), R16("f79"), + R16("f80"), R16("f81"), R16("f82"), R16("f83"), + R16("f84"), R16("f85"), R16("f86"), R16("f87"), + R16("f88"), R16("f89"), R16("f90"), R16("f91"), + R16("f92"), R16("f93"), R16("f94"), R16("f95"), + R16("f96"), R16("f97"), R16("f98"), R16("f99"), + R16("f100"), R16("f101"), R16("f102"), R16("f103"), + R16("f104"), R16("f105"), R16("f106"), R16("f107"), + R16("f108"), R16("f109"), R16("f110"), R16("f111"), + R16("f112"), R16("f113"), R16("f114"), R16("f115"), + R16("f116"), R16("f117"), R16("f118"), R16("f119"), + R16("f120"), R16("f121"), R16("f122"), R16("f123"), + R16("f124"), R16("f125"), R16("f126"), R16("f127"), + + R8("p0"), R8("p1"), R8("p2"), R8("p3"), + R8("p4"), R8("p5"), R8("p6"), R8("p7"), + R8("p8"), R8("p9"), R8("p10"), R8("p11"), + R8("p12"), R8("p13"), R8("p14"), R8("p15"), + R8("p16"), R8("p17"), R8("p18"), R8("p19"), + R8("p20"), R8("p21"), R8("p22"), R8("p23"), + R8("p24"), R8("p25"), R8("p26"), R8("p27"), + R8("p28"), R8("p29"), R8("p30"), R8("p31"), + R8("p32"), R8("p33"), R8("p34"), R8("p35"), + R8("p36"), R8("p37"), R8("p38"), R8("p39"), + R8("p40"), R8("p41"), R8("p42"), R8("p43"), + R8("p44"), R8("p45"), R8("p46"), R8("p47"), + R8("p48"), R8("p49"), R8("p50"), R8("p51"), + R8("p52"), R8("p53"), R8("p54"), R8("p55"), + R8("p56"), R8("p57"), R8("p58"), R8("p59"), + R8("p60"), R8("p61"), R8("p62"), R8("p63"), + + R8("b0"), R8("b1"), R8("b2"), R8("b3"), + R8("b4"), R8("b5"), R8("b6"), R8("b7"), + + R8("vfp"), R8("vrap"), + + R8("pr"), R8("ip"), R8("psr"), R8("cfm"), + + R8("kr0"), R8("kr1"), R8("kr2"), R8("kr3"), + R8("kr4"), R8("kr5"), R8("kr6"), R8("kr7"), + + R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), + + R8("rsc"), R8("bsp"), R8("bspstore"), R8("rnat"), + + R8(""), R8("fcr"), R8(""), R8(""), + + R8("eflag"), R8("csd"), R8("ssd"), R8("cflg"), + R8("fsr"), R8("fir"), R8("fdr"), R8(""), + R8("ccv"), R8(""), R8(""), R8(""), + R8("unat"), R8(""), R8(""), R8(""), + R8("fpsr"), R8(""), R8(""), R8(""), + R8("itc"), + + R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), R8(""), + R8("pfs"), R8("lc"), R8("ec"), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), R8(""), R8(""), R8(""), R8(""), + R8(""), + R8("nat0"), R8("nat1"), R8("nat2"), R8("nat3"), + R8("nat4"), R8("nat5"), R8("nat6"), R8("nat7"), + R8("nat8"), R8("nat9"), R8("nat10"), R8("nat11"), + R8("nat12"), R8("nat13"), R8("nat14"), R8("nat15"), + R8("nat16"), R8("nat17"), R8("nat18"), R8("nat19"), + R8("nat20"), R8("nat21"), R8("nat22"), R8("nat23"), + R8("nat24"), R8("nat25"), R8("nat26"), R8("nat27"), + R8("nat28"), R8("nat29"), R8("nat30"), R8("nat31"), + R8("nat32"), R8("nat33"), R8("nat34"), R8("nat35"), + R8("nat36"), R8("nat37"), R8("nat38"), R8("nat39"), + R8("nat40"), R8("nat41"), R8("nat42"), R8("nat43"), + R8("nat44"), R8("nat45"), R8("nat46"), R8("nat47"), + R8("nat48"), R8("nat49"), R8("nat50"), R8("nat51"), + R8("nat52"), R8("nat53"), R8("nat54"), R8("nat55"), + R8("nat56"), R8("nat57"), R8("nat58"), R8("nat59"), + R8("nat60"), R8("nat61"), R8("nat62"), R8("nat63"), + R8("nat64"), R8("nat65"), R8("nat66"), R8("nat67"), + R8("nat68"), R8("nat69"), R8("nat70"), R8("nat71"), + R8("nat72"), R8("nat73"), R8("nat74"), R8("nat75"), + R8("nat76"), R8("nat77"), R8("nat78"), R8("nat79"), + R8("nat80"), R8("nat81"), R8("nat82"), R8("nat83"), + R8("nat84"), R8("nat85"), R8("nat86"), R8("nat87"), + R8("nat88"), R8("nat89"), R8("nat90"), R8("nat91"), + R8("nat92"), R8("nat93"), R8("nat94"), R8("nat95"), + R8("nat96"), R8("nat97"), R8("nat98"), R8("nat99"), + R8("nat100"), R8("nat101"), R8("nat102"), R8("nat103"), + R8("nat104"), R8("nat105"), R8("nat106"), R8("nat107"), + R8("nat108"), R8("nat109"), R8("nat110"), R8("nat111"), + R8("nat112"), R8("nat113"), R8("nat114"), R8("nat115"), + R8("nat116"), R8("nat117"), R8("nat118"), R8("nat119"), + R8("nat120"), R8("nat121"), R8("nat122"), R8("nat123"), + R8("nat124"), R8("nat125"), R8("nat126"), R8("nat127"), +}; + +const char *gdbserver_resume_regs[] = { "ip", "psr", "r12", "bsp", "cfm", 0 }; + +void +init_registers (void) +{ + set_register_cache (ia64_regs, + sizeof (ia64_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-m68k.c gdb/gdbserver/reg-m68k.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-m68k.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-m68k.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,24 @@ +#include "regdef.h" + +struct m68k_regs[] = { + R4("d0"), R4("d1"), R4("d2"), R4("d3"), + R4("d4"), R4("d5"), R4("d6"), R4("d7"), + R4("a0"), R4("a1"), R4("a2"), R4("a3"), + R4("a4"), R4("a5"), R4("fp"), R4("sp"), + R4("ps"), R4("pc"), + + R12("fp0"), R12("fp1"), R12("fp2"), R12("fp3"), + R12("fp4"), R12("fp5"), R12("fp6"), R12("fp7"), + + R4("fpcontrol"), R4("fpstatus"), R4("fpiaddr"), + R4("fpcode"), R4("fpflags") +}; + +const char *gdbserver_resume_regs[] = { "sp", "fp", "pc", 0 }; + +void +init_registers (void) +{ + set_register_cache (m68k_regs, + sizeof (m68k_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-mips.c gdb/gdbserver/reg-mips.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-mips.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-mips.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,48 @@ +#include "regdef.h" + +#define MIPS_GENERIC32_GPRS \ + R4("zero"), R4("at"), R4("v0"), R4("v1"), \ + R4("a0"), R4("a1"), R4("a2"), R4("a3"), \ + R4("t0"), R4("t1"), R4("t2"), R4("t3"), \ + R4("t4"), R4("t5"), R4("t6"), R4("t7"), \ + R4("s0"), R4("s1"), R4("s2"), R4("s3"), \ + R4("s4"), R4("s5"), R4("s6"), R4("s7"), \ + R4("t8"), R4("t9"), R4("k0"), R4("k1"), \ + R4("gp"), R4("sp"), R4("s8"), R4("ra") + +#define MIPS_GENERIC32_SPRS \ + R4("sr"), R4("lo"), R4("hi"), R4("bad"), \ + R4("cause"),R4("pc") + +#define MIPS_GENERIC32_FPU \ + R4("f0"), R4("f1"), R4("f2"), R4("f3"), \ + R4("f4"), R4("f5"), R4("f6"), R4("f7"), \ + R4("f8"), R4("f9"), R4("f10"), R4("f11"), \ + R4("f12"), R4("f13"), R4("f14"), R4("f15"), \ + R4("f16"), R4("f17"), R4("f18"), R4("f19"), \ + R4("f20"), R4("f21"), R4("f22"), R4("f23"), \ + R4("f24"), R4("f25"), R4("f26"), R4("f27"), \ + R4("f28"), R4("f29"), R4("f30"), R4("f31"), \ + R4("fsr"), R4("fir") + +struct reg mips_generic32_regs[] = { + MIPS_GENERIC32_GPRS, + MIPS_GENERIC32_SPRS, + MIPS_GENERIC32_FPU, + + R4("fp"), R4(""), + + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), +}; + +const char *gdbserver_resume_regs[] = { "pc", "sp", 0 }; + +void +init_registers (void) +{ + set_register_cache (mips_generic32_regs, + sizeof (mips_generic32_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-ppc.c gdb/gdbserver/reg-ppc.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-ppc.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-ppc.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,37 @@ +#include "regdef.h" + +#define COMMON_UISA_REGS \ + R4("r0"), R4("r1"), R4("r2"), R4("r3"), \ + R4("r4"), R4("r5"), R4("r6"), R4("r7"), \ + R4("r8"), R4("r9"), R4("r10"),R4("r11"), \ + R4("r12"),R4("r13"),R4("r14"),R4("r15"), \ + R4("r16"),R4("r17"),R4("r18"),R4("r19"), \ + R4("r20"),R4("r21"),R4("r22"),R4("r23"), \ + R4("r24"),R4("r25"),R4("r26"),R4("r27"), \ + R4("r28"),R4("r29"),R4("r30"),R4("r31"), \ + R8("f0"), R8("f1"), R8("f2"), R8("f3"), \ + R8("f4"), R8("f5"), R8("f6"), R8("f7"), \ + R8("f8"), R8("f9"), R8("f10"),R8("f11"), \ + R8("f12"),R8("f13"),R8("f14"),R8("f15"), \ + R8("f16"),R8("f17"),R8("f18"),R8("f19"), \ + R8("f20"),R8("f21"),R8("f22"),R8("f23"), \ + R8("f24"),R8("f25"),R8("f26"),R8("f27"), \ + R8("f28"),R8("f29"),R8("f30"),R8("f31"), \ + R4("pc"), R4("ps") + +#define COMMON_UISA_SPRS \ + R4("cr"), R4("lr"), R4("ctr"), R4("xer"), R0 + +struct reg powerpc_regs[] = { + COMMON_UISA_REGS, + COMMON_UISA_SPRS +}; + +const char *gdbserver_resume_regs[] = { "r1", "pc", 0 }; + +void +init_registers (void) +{ + set_register_cache (powerpc_regs, + sizeof (powerpc_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/reg-sh.c gdb/gdbserver/reg-sh.c --- /opt/src/gdb/branch/src/gdb/gdbserver/reg-sh.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/reg-sh.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,30 @@ +#include "regdef.h" + +struct reg sh_regs[] = { + R4("r0"), R4("r1"), R4("r2"), R4("r3"), + R4("r4"), R4("r5"), R4("r6"), R4("r7"), + R4("r8"), R4("r9"), R4("r10"), R4("r11"), + R4("r12"), R4("r13"), R4("r14"), R4("r15"), + R4("pc"), R4("pr"), R4("gbr"), R4("vbr"), + R4("mach"), R4("macl"), R4("sr"), + R4("fpul"), R4("fpscr"), + R4("fr0"), R4("fr1"), R4("fr2"), R4("fr3"), + R4("fr4"), R4("fr5"), R4("fr6"), R4("fr7"), + R4("fr8"), R4("fr9"), R4("fr10"), R4("fr11"), + R4("fr12"), R4("fr13"), R4("fr14"), R4("fr15"), + + R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), + R4(""), R4(""), R4(""), R4(""), +}; + +const char *gdbserver_resume_regs[] = { "pc", "r14", "r15", 0 }; + +void +init_registers (void) +{ + set_register_cache (sh_regs, + sizeof (sh_regs) / sizeof (struct reg)); +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/regdef.c gdb/gdbserver/regdef.c --- /opt/src/gdb/branch/src/gdb/gdbserver/regdef.c Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/regdef.c Sun Jan 20 00:50:28 2002 @@ -0,0 +1,99 @@ +#include "server.h" + +#include +#include + +static char *registers; +static int register_bytes; + +static struct reg *reg_defs; +static int num_registers; + +int +registers_length (void) +{ + return 2 * register_bytes; +} + +void +set_register_cache (struct reg *regs, int n) +{ + int offset, i; + + reg_defs = regs; + num_registers = n; + + offset = 0; + for (i = 0; i < n; i++) + { + regs[i].offset = offset; + offset += regs[i].size; + } + + register_bytes = offset; + registers = malloc (offset); + if (!registers) + fatal ("Could not allocate register cache."); +} + +void +registers_to_string (char *buf) +{ + convert_int_to_ascii (registers, buf, register_bytes); +} + +void +registers_from_string (char *buf) +{ + int len = strlen (buf); + + if (len != register_bytes * 2) + { + warning ("Wrong sized register packet (expected %d bytes, got %d)", 2*register_bytes, len); + if (len > register_bytes * 2) + len = register_bytes * 2; + } + convert_ascii_to_int (buf, registers, len / 2); +} + +struct reg * +find_register_by_name (const char *name) +{ + int i; + + for (i = 0; i < num_registers; i++) + if (!strcmp (name, reg_defs[i].name)) + return ®_defs[i]; + fatal ("Unknown register %s requested", name); + return 0; +} + +int +find_regno (const char *name) +{ + int i; + + for (i = 0; i < num_registers; i++) + if (!strcmp (name, reg_defs[i].name)) + return i; + fatal ("Unknown register %s requested", name); + return -1; +} + +struct reg * +find_register_by_number (int n) +{ + return ®_defs[n]; +} + +int +register_size (int n) +{ + return reg_defs[n].size; +} + +char * +register_data (int n) +{ + return registers + reg_defs[n].offset; +} diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/regdef.h gdb/gdbserver/regdef.h --- /opt/src/gdb/branch/src/gdb/gdbserver/regdef.h Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/regdef.h Sun Jan 20 00:50:28 2002 @@ -0,0 +1,44 @@ +struct reg +{ + const char *name; + int offset; + int size; +}; + +#define R0 {"", 0, 0} +#define R4(name) {(name), 0, 4} +#define R8(name) {(name), 0, 8} +#define R10(name) {(name), 0, 10} +#define R12(name) {(name), 0, 10} +#define R16(name) {(name), 0, 16} + +/* Convert all registers to a string in the currently specified remote + format. */ + +void registers_to_string (char *buf); + +/* Convert a string to register values and fill our register cache. */ + +void registers_from_string (char *buf); + +/* Return the size in bytes of a string-encoded register packet. */ + +int registers_length (void); + +/* Set the current remote protocol and register cache according to the array + ``regs'', with ``n'' elements. */ + +void set_register_cache (struct reg *regs, int n); + +/* Return a pointer to the description of register ``n''. */ + +struct reg *find_register_by_number (int n); + +char *register_data (int n); + +int register_size (int n); + +int find_regno (const char *name); + + +extern const char *gdbserver_resume_regs[]; diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/remote-utils.c gdb/gdbserver/remote-utils.c --- /opt/src/gdb/branch/src/gdb/gdbserver/remote-utils.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/remote-utils.c Sun Jan 20 00:50:28 2002 @@ -34,6 +34,7 @@ #include #include #include +#include int remote_debug = 0; struct ui_file *gdb_stdlog; @@ -183,6 +184,7 @@ return a - 'a' + 10; else error ("Reply contains invalid hex digit"); + return 0; } /* Convert number NIB to a hex digit. */ @@ -204,11 +206,13 @@ { int i; unsigned char csum = 0; - char buf2[PBUFSIZ]; + char *buf2; char buf3[1]; int cnt = strlen (buf); char *p; + buf2 = malloc(PBUFSIZ); + /* Copy the packet into buffer BUF2, encapsulating it and giving it a checksum. */ @@ -250,11 +254,13 @@ else perror ("putpkt(read)"); + free (buf2); return -1; } } while (buf3[0] != '+'); + free(buf2); return 1; /* Success! */ } @@ -440,7 +446,7 @@ static char * outreg (int regno, char *buf) { - int regsize = REGISTER_RAW_SIZE (regno); + int regsize = register_size (regno); if ((regno >> 12) != 0) *buf++ = tohex ((regno >> 12) & 0xf); @@ -449,7 +455,7 @@ *buf++ = tohex ((regno >> 4) & 0xf); *buf++ = tohex (regno & 0xf); *buf++ = ':'; - convert_int_to_ascii (®isters[REGISTER_BYTE (regno)], buf, regsize); + convert_int_to_ascii (register_data (regno), buf, regsize); buf += 2 * regsize; *buf++ = ';'; @@ -459,42 +465,26 @@ void prepare_resume_reply (char *buf, char status, unsigned char signo) { - int nib; + int nib, sig; *buf++ = status; - /* FIXME! Should be converting this signal number (numbered - according to the signal numbering of the system we are running on) - to the signal numbers used by the gdb protocol (see enum target_signal - in gdb/target.h). */ - nib = ((signo & 0xf0) >> 4); + sig = (int)target_signal_from_host (signo); + + nib = ((sig & 0xf0) >> 4); *buf++ = tohex (nib); - nib = signo & 0x0f; + nib = sig & 0x0f; *buf++ = tohex (nib); if (status == 'T') { -#ifdef GDBSERVER_RESUME_REGS - static int gdbserver_resume_regs[] = GDBSERVER_RESUME_REGS ; - int i; - for (i = 0; - i < sizeof (gdbserver_resume_regs) - / sizeof (gdbserver_resume_regs[0]); - i++) + char **regp = gdbserver_resume_regs; + + while (*regp) { - int regnum = gdbserver_resume_regs[i]; - buf = outreg (regnum, buf); + buf = outreg (find_regno (*regp), buf); + regp++; } -#else /* !defined(GDBSERVER_RESUME_REGS) */ - buf = outreg (PC_REGNUM, buf); - buf = outreg (FP_REGNUM, buf); - buf = outreg (SP_REGNUM, buf); - if (NPC_REGNUM >= 0) - buf = outreg (NPC_REGNUM, buf); -#ifdef O7_REGNUM - buf = outreg (O7_REGNUM, buf); -#endif -#endif /* GDBSERVER_RESUME_REGS */ /* If the debugger hasn't used any thread features, don't burden it with threads. If we didn't check this, GDB 4.13 and older would choke. */ diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/server.c gdb/gdbserver/server.c --- /opt/src/gdb/branch/src/gdb/gdbserver/server.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/server.c Sun Jan 20 00:50:28 2002 @@ -21,6 +21,8 @@ #include "server.h" +#include + int cont_thread; int general_thread; int thread_from_wait; @@ -39,16 +41,35 @@ return mywait (statusptr); } +static int +attach_inferior (int pid, char *statusptr, unsigned char *sigptr) +{ + /* myattach should return -1 if attaching is unsupported, + 0 if it succeeded, and call error() otherwise. */ + if (myattach (pid) != 0) + return -1; + + inferior_pid = pid; + + *sigptr = mywait (statusptr); + + return 0; +} + extern int remote_debug; int main (int argc, char *argv[]) { - char ch, status, own_buf[PBUFSIZ], mem_buf[2000]; + char ch, status, *own_buf, mem_buf[2000]; int i = 0; unsigned char signal; unsigned int len; CORE_ADDR mem_addr; + int bad_attach = 0; + int pid = 0; + int attached = 0; + char *arg_end; if (setjmp (toplevel)) { @@ -56,15 +77,46 @@ exit (1); } - if (argc < 3) - error ("Usage: gdbserver tty prog [args ...]"); + if (argc >= 3 && strcmp (argv[2], "--attach") == 0) + { + if (argc == 4 + && argv[3] != '\0' + && (pid = strtoul (argv[3], &arg_end, 10)) != 0 + && *arg_end == '\0') + { + ; + } + else + bad_attach = 1; + } + + if (argc < 3 || bad_attach) + error ("Usage:\tgdbserver tty prog [args ...]\n" + "\tgdbserver tty --attach pid"); initialize_low (); - /* Wait till we are at first instruction in program. */ - signal = start_inferior (&argv[2], &status); + own_buf = malloc (PBUFSIZ); - /* We are now stopped at the first instruction of the target process */ + if (pid == 0) + { + /* Wait till we are at first instruction in program. */ + signal = start_inferior (&argv[2], &status); + + /* We are now stopped at the first instruction of the target process */ + } + else + { + switch (attach_inferior (pid, &status, &signal)) + { + case -1: + error ("Attaching not supported on this target"); + break; + default: + attached = 1; + break; + } + } while (1) { @@ -83,8 +135,17 @@ remote_debug = !remote_debug; break; case '!': - extended_protocol = 1; - prepare_resume_reply (own_buf, status, signal); + if (attached == 0) + { + extended_protocol = 1; + prepare_resume_reply (own_buf, status, signal); + } + else + { + /* We can not use the extended protocol if we are + attached. */ + own_buf[0] = '\0'; + } break; case '?': prepare_resume_reply (own_buf, status, signal); @@ -109,10 +170,10 @@ } break; case 'g': - convert_int_to_ascii (registers, own_buf, REGISTER_BYTES); + registers_to_string (own_buf); break; case 'G': - convert_ascii_to_int (&own_buf[1], registers, REGISTER_BYTES); + registers_from_string (&own_buf[1]); store_inferior_registers (-1); write_ok (own_buf); break; @@ -130,13 +191,21 @@ break; case 'C': convert_ascii_to_int (own_buf + 1, &sig, 1); - myresume (0, sig); + if (target_signal_to_host_p (sig)) + signal = target_signal_to_host (sig); + else + signal = 0; + myresume (0, signal); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; case 'S': convert_ascii_to_int (own_buf + 1, &sig, 1); - myresume (1, sig); + if (target_signal_to_host_p (sig)) + signal = target_signal_to_host (sig); + else + signal = 0; + myresume (1, signal); signal = mywait (&status); prepare_resume_reply (own_buf, status, signal); break; @@ -199,6 +268,17 @@ own_buf[0] = '\0'; break; } +#if 0 + case 'q': + if (strcmp (own_buf, "qRegisters") == 0) + { + char *p = registers_format_name (); + strcpy (own_buf, "qRegisters:"); + convert_int_to_ascii (p, &own_buf[11], strlen(p)); + break; + } + /* FALL THROUGH */ +#endif default: /* It is a request we don't understand. Respond with an empty packet so that gdb knows that we don't support this @@ -250,8 +330,8 @@ } else { - fprintf (stderr, "Remote side has terminated connection. GDBserver will reopen the connection.\n"); - + fprintf (stderr, "Remote side has terminated connection. " + "GDBserver will reopen the connection.\n"); remote_close (); } } diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/server.h gdb/gdbserver/server.h --- /opt/src/gdb/branch/src/gdb/gdbserver/server.h Tue Mar 6 03:21:44 2001 +++ gdb/gdbserver/server.h Sun Jan 20 00:50:28 2002 @@ -19,8 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "defs.h" +#include "config.h" +#include "bfd.h" +typedef bfd_vma CORE_ADDR; +#include +#include #include +#include +#define NORETURN + +#include "regdef.h" +#include "signals.h" /* Target-specific functions */ @@ -69,11 +78,12 @@ void decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr, unsigned int *len_ptr, char *to); - /* Functions from utils.c */ void perror_with_name (char *string); - +void error (const char *string,...); +void fatal (const char *string,...); +void warning (const char *string,...); /* Maximum number of bytes to read/write at once. The value here is chosen to fill up a packet (the headers account for the 32). */ @@ -81,6 +91,6 @@ /* Buffer sizes for transferring memory, registers, etc. Round up PBUFSIZ to hold all the registers, at least. */ -#define PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (2000)) \ - ? (REGISTER_BYTES * 2 + 32) \ +#define PBUFSIZ ((registers_length () > MAXBUFBYTES (2000)) \ + ? (registers_length () * 2 + 32) \ : 2000) diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/signals.h gdb/gdbserver/signals.h --- /opt/src/gdb/branch/src/gdb/gdbserver/signals.h Wed Dec 31 19:00:00 1969 +++ gdb/gdbserver/signals.h Sun Jan 20 00:50:28 2002 @@ -0,0 +1,241 @@ +/* The numbering of these signals is chosen to match traditional unix + signals (insofar as various unices use the same numbers, anyway). + It is also the numbering of the GDB remote protocol. Other remote + protocols, if they use a different numbering, should make sure to + translate appropriately. + + Since these numbers have actually made it out into other software + (stubs, etc.), you mustn't disturb the assigned numbering. If you + need to add new signals here, add them to the end of the explicitly + numbered signals. + + This is based strongly on Unix/POSIX signals for several reasons: + (1) This set of signals represents a widely-accepted attempt to + represent events of this sort in a portable fashion, (2) we want a + signal to make it from wait to child_wait to the user intact, (3) many + remote protocols use a similar encoding. However, it is + recognized that this set of signals has limitations (such as not + distinguishing between various kinds of SIGSEGV, or not + distinguishing hitting a breakpoint from finishing a single step). + So in the future we may get around this either by adding additional + signals for breakpoint, single-step, etc., or by adding signal + codes; the latter seems more in the spirit of what BSD, System V, + etc. are doing to address these issues. */ + +/* For an explanation of what each signal means, see + target_signal_to_string. */ + +enum target_signal + { + /* Used some places (e.g. stop_signal) to record the concept that + there is no signal. */ + TARGET_SIGNAL_0 = 0, + TARGET_SIGNAL_FIRST = 0, + TARGET_SIGNAL_HUP = 1, + TARGET_SIGNAL_INT = 2, + TARGET_SIGNAL_QUIT = 3, + TARGET_SIGNAL_ILL = 4, + TARGET_SIGNAL_TRAP = 5, + TARGET_SIGNAL_ABRT = 6, + TARGET_SIGNAL_EMT = 7, + TARGET_SIGNAL_FPE = 8, + TARGET_SIGNAL_KILL = 9, + TARGET_SIGNAL_BUS = 10, + TARGET_SIGNAL_SEGV = 11, + TARGET_SIGNAL_SYS = 12, + TARGET_SIGNAL_PIPE = 13, + TARGET_SIGNAL_ALRM = 14, + TARGET_SIGNAL_TERM = 15, + TARGET_SIGNAL_URG = 16, + TARGET_SIGNAL_STOP = 17, + TARGET_SIGNAL_TSTP = 18, + TARGET_SIGNAL_CONT = 19, + TARGET_SIGNAL_CHLD = 20, + TARGET_SIGNAL_TTIN = 21, + TARGET_SIGNAL_TTOU = 22, + TARGET_SIGNAL_IO = 23, + TARGET_SIGNAL_XCPU = 24, + TARGET_SIGNAL_XFSZ = 25, + TARGET_SIGNAL_VTALRM = 26, + TARGET_SIGNAL_PROF = 27, + TARGET_SIGNAL_WINCH = 28, + TARGET_SIGNAL_LOST = 29, + TARGET_SIGNAL_USR1 = 30, + TARGET_SIGNAL_USR2 = 31, + TARGET_SIGNAL_PWR = 32, + /* Similar to SIGIO. Perhaps they should have the same number. */ + TARGET_SIGNAL_POLL = 33, + TARGET_SIGNAL_WIND = 34, + TARGET_SIGNAL_PHONE = 35, + TARGET_SIGNAL_WAITING = 36, + TARGET_SIGNAL_LWP = 37, + TARGET_SIGNAL_DANGER = 38, + TARGET_SIGNAL_GRANT = 39, + TARGET_SIGNAL_RETRACT = 40, + TARGET_SIGNAL_MSG = 41, + TARGET_SIGNAL_SOUND = 42, + TARGET_SIGNAL_SAK = 43, + TARGET_SIGNAL_PRIO = 44, + TARGET_SIGNAL_REALTIME_33 = 45, + TARGET_SIGNAL_REALTIME_34 = 46, + TARGET_SIGNAL_REALTIME_35 = 47, + TARGET_SIGNAL_REALTIME_36 = 48, + TARGET_SIGNAL_REALTIME_37 = 49, + TARGET_SIGNAL_REALTIME_38 = 50, + TARGET_SIGNAL_REALTIME_39 = 51, + TARGET_SIGNAL_REALTIME_40 = 52, + TARGET_SIGNAL_REALTIME_41 = 53, + TARGET_SIGNAL_REALTIME_42 = 54, + TARGET_SIGNAL_REALTIME_43 = 55, + TARGET_SIGNAL_REALTIME_44 = 56, + TARGET_SIGNAL_REALTIME_45 = 57, + TARGET_SIGNAL_REALTIME_46 = 58, + TARGET_SIGNAL_REALTIME_47 = 59, + TARGET_SIGNAL_REALTIME_48 = 60, + TARGET_SIGNAL_REALTIME_49 = 61, + TARGET_SIGNAL_REALTIME_50 = 62, + TARGET_SIGNAL_REALTIME_51 = 63, + TARGET_SIGNAL_REALTIME_52 = 64, + TARGET_SIGNAL_REALTIME_53 = 65, + TARGET_SIGNAL_REALTIME_54 = 66, + TARGET_SIGNAL_REALTIME_55 = 67, + TARGET_SIGNAL_REALTIME_56 = 68, + TARGET_SIGNAL_REALTIME_57 = 69, + TARGET_SIGNAL_REALTIME_58 = 70, + TARGET_SIGNAL_REALTIME_59 = 71, + TARGET_SIGNAL_REALTIME_60 = 72, + TARGET_SIGNAL_REALTIME_61 = 73, + TARGET_SIGNAL_REALTIME_62 = 74, + TARGET_SIGNAL_REALTIME_63 = 75, + + /* Used internally by Solaris threads. See signal(5) on Solaris. */ + TARGET_SIGNAL_CANCEL = 76, + + /* Yes, this pains me, too. But LynxOS didn't have SIG32, and now + Linux does, and we can't disturb the numbering, since it's part + of the remote protocol. Note that in some GDB's + TARGET_SIGNAL_REALTIME_32 is number 76. */ + TARGET_SIGNAL_REALTIME_32, + /* Yet another pain, IRIX 6 has SIG64. */ + TARGET_SIGNAL_REALTIME_64, + /* Yet another pain, Linux/MIPS might go up to 128. */ + TARGET_SIGNAL_REALTIME_65, + TARGET_SIGNAL_REALTIME_66, + TARGET_SIGNAL_REALTIME_67, + TARGET_SIGNAL_REALTIME_68, + TARGET_SIGNAL_REALTIME_69, + TARGET_SIGNAL_REALTIME_70, + TARGET_SIGNAL_REALTIME_71, + TARGET_SIGNAL_REALTIME_72, + TARGET_SIGNAL_REALTIME_73, + TARGET_SIGNAL_REALTIME_74, + TARGET_SIGNAL_REALTIME_75, + TARGET_SIGNAL_REALTIME_76, + TARGET_SIGNAL_REALTIME_77, + TARGET_SIGNAL_REALTIME_78, + TARGET_SIGNAL_REALTIME_79, + TARGET_SIGNAL_REALTIME_80, + TARGET_SIGNAL_REALTIME_81, + TARGET_SIGNAL_REALTIME_82, + TARGET_SIGNAL_REALTIME_83, + TARGET_SIGNAL_REALTIME_84, + TARGET_SIGNAL_REALTIME_85, + TARGET_SIGNAL_REALTIME_86, + TARGET_SIGNAL_REALTIME_87, + TARGET_SIGNAL_REALTIME_88, + TARGET_SIGNAL_REALTIME_89, + TARGET_SIGNAL_REALTIME_90, + TARGET_SIGNAL_REALTIME_91, + TARGET_SIGNAL_REALTIME_92, + TARGET_SIGNAL_REALTIME_93, + TARGET_SIGNAL_REALTIME_94, + TARGET_SIGNAL_REALTIME_95, + TARGET_SIGNAL_REALTIME_96, + TARGET_SIGNAL_REALTIME_97, + TARGET_SIGNAL_REALTIME_98, + TARGET_SIGNAL_REALTIME_99, + TARGET_SIGNAL_REALTIME_100, + TARGET_SIGNAL_REALTIME_101, + TARGET_SIGNAL_REALTIME_102, + TARGET_SIGNAL_REALTIME_103, + TARGET_SIGNAL_REALTIME_104, + TARGET_SIGNAL_REALTIME_105, + TARGET_SIGNAL_REALTIME_106, + TARGET_SIGNAL_REALTIME_107, + TARGET_SIGNAL_REALTIME_108, + TARGET_SIGNAL_REALTIME_109, + TARGET_SIGNAL_REALTIME_110, + TARGET_SIGNAL_REALTIME_111, + TARGET_SIGNAL_REALTIME_112, + TARGET_SIGNAL_REALTIME_113, + TARGET_SIGNAL_REALTIME_114, + TARGET_SIGNAL_REALTIME_115, + TARGET_SIGNAL_REALTIME_116, + TARGET_SIGNAL_REALTIME_117, + TARGET_SIGNAL_REALTIME_118, + TARGET_SIGNAL_REALTIME_119, + TARGET_SIGNAL_REALTIME_120, + TARGET_SIGNAL_REALTIME_121, + TARGET_SIGNAL_REALTIME_122, + TARGET_SIGNAL_REALTIME_123, + TARGET_SIGNAL_REALTIME_124, + TARGET_SIGNAL_REALTIME_125, + TARGET_SIGNAL_REALTIME_126, + TARGET_SIGNAL_REALTIME_127, + +#if defined(MACH) || defined(__MACH__) + /* Mach exceptions */ + TARGET_EXC_BAD_ACCESS, + TARGET_EXC_BAD_INSTRUCTION, + TARGET_EXC_ARITHMETIC, + TARGET_EXC_EMULATION, + TARGET_EXC_SOFTWARE, + TARGET_EXC_BREAKPOINT, +#endif + TARGET_SIGNAL_INFO, + + /* Some signal we don't know about. */ + TARGET_SIGNAL_UNKNOWN, + + /* Use whatever signal we use when one is not specifically specified + (for passing to proceed and so on). */ + TARGET_SIGNAL_DEFAULT, + + /* Last and unused enum value, for sizing arrays, etc. */ + TARGET_SIGNAL_LAST + }; + + +/* Return the string for a signal. */ +extern char *target_signal_to_string (enum target_signal); + +/* Return the name (SIGHUP, etc.) for a signal. */ +extern char *target_signal_to_name (enum target_signal); + +/* Given a name (SIGHUP, etc.), return its signal. */ +enum target_signal target_signal_from_name (char *); + +/* Predicate to target_signal_to_host(). Return non-zero if the enum + targ_signal SIGNO has an equivalent ``host'' representation. */ +/* FIXME: cagney/1999-11-22: The name below was chosen in preference + to the shorter target_signal_p() because it is far less ambigious. + In this context ``target_signal'' refers to GDB's internal + representation of the target's set of signals while ``host signal'' + refers to the target operating system's signal. Confused? */ + +extern int target_signal_to_host_p (enum target_signal signo); + +/* Convert between host signal numbers and enum target_signal's. + target_signal_to_host() returns 0 and prints a warning() on GDB's + console if SIGNO has no equivalent host representation. */ +/* FIXME: cagney/1999-11-22: Here ``host'' is used incorrectly, it is + refering to the target operating system's signal numbering. + Similarly, ``enum target_signal'' is named incorrectly, ``enum + gdb_signal'' would probably be better as it is refering to GDB's + internal representation of a target operating system's signal. */ + +extern enum target_signal target_signal_from_host (int); +extern int target_signal_to_host (enum target_signal); + +/* Convert from a number used in a GDB command to an enum target_signal. */ +extern enum target_signal target_signal_from_command (int); diff -x *~ -uNr -x CVS /opt/src/gdb/branch/src/gdb/gdbserver/utils.c gdb/gdbserver/utils.c --- /opt/src/gdb/branch/src/gdb/gdbserver/utils.c Wed Jul 25 22:17:38 2001 +++ gdb/gdbserver/utils.c Sun Jan 20 00:50:28 2002 @@ -22,6 +22,7 @@ #include "server.h" #include #include +#include /* Generally useful subroutines used throughout the program. */ @@ -53,6 +54,21 @@ error ("%s.", combined); } +/* Print a warning message. + The first argument STRING is the warning message, used as a fprintf string, + and the remaining args are passed as arguments to it. + The primary difference between warnings and errors is that a warning + does not force the return to command level. */ +void +warning (const char *string,...) +{ + va_list args; + va_start (args, string); + fflush (stdout); + vfprintf (stderr, string, args); + fprintf (stderr, "\n"); +} + /* Print an error message and return to command level. STRING is the error message, used as a fprintf string, and ARG is passed as an argument to it. */ @@ -75,7 +91,7 @@ /* VARARGS */ NORETURN void -fatal (char *string,...) +fatal (const char *string,...) { va_list args; va_start (args, string); @@ -84,4 +100,16 @@ fprintf (stderr, "\n"); va_end (args); exit (1); +} + +void +internal_error (const char *file, int line, const char *string, ...) +{ + va_list args; + va_start (args, string); + fprintf (stderr, "gdb internal error (%s:%d): ", file, line); + vfprintf (stderr, string, args); + fprintf (stderr, "\n"); + va_end (args); + exit (1); }