This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[rfa] gdbserver overhaul


I'd like to commit the attached.  It's just the first stage in what will
probably change a few more times; among other highlights it removes the
gdbserver dependency on "defs.h" (we still use a few other GDB headers, like
terminal.h, but those will be easy to deal with down the lines).  We lose
the xm-/tm-/nm- files at the same time, so to know what the target registers
are we have to hard-code them.  This also makes us independent (at last) of
the GDB register cache layout.  GDB does not yet have a corresponding
independence, but now that the protocols are clearly and compactly described
in gdbserver, that too can come soon.

I've added preprocessor gunk to make this compile on other non-Linux
gdbserver targets, since I only had the Linux ones available to test on.  I
tested on Linux/{ARM,i386,mips,ppc,sh}; the SH bits require some patches
available from the SH community but not yet in mainstream GDB, but I'm
including the gdbserver parts anyway.  I'm fairly sure that ia64 and m68k
will continue to work if they did beforehand.  Note that the "compile" at the
beginning of this paragraph is really "compile iff it already did".  I tried
to find a non-Linux target to test; I tried mips64vr5000-unknown-elf
(low-sim.c) and sparc-sun-solaris2.8 (low-solaris.c).  Neither built.  It
would be nice if someone tried, say, the NetBSD port before I committed
this, but I'm not really insisting on it.  I'd rather that every time
someone notices that such a port is broken, we convert it to the new scheme.

At the same time as committing this, I would like to become the maintainer
for gdbserver.  With threads code hopefully showing up soon, I'd like to
have someone actively caring for the server code, and right now nobody is.

Is this OK?  Comments?

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer

2001-10-11  Daniel Jacobowitz  <drow@mvista.com>

	* gdbserver/regdef.c: New file.
	* gdbserver/regdef.h: New file.

	* gdbserver/lnx-arm.c: New file.
	* gdbserver/lnx-i386.c: New file.
	* gdbserver/lnx-ia64.c: New file.
	* gdbserver/lnx-m68k.c: New file.
	* gdbserver/lnx-mips.c: New file.
	* gdbserver/lnx-ppc.c: New file.
	* gdbserver/lnx-sh.c: New file.
	* gdbserver/reg-arm.c: New file.
	* gdbserver/reg-i386.c: New file.
	* gdbserver/reg-ia64.c: New file.
	* gdbserver/reg-m68k.c: New file.
	* gdbserver/reg-mips.c: New file.
	* gdbserver/reg-ppc.c: New file.
	* gdbserver/reg-sh.c: New file.

	* gdbserver/Makefile.in: Update copyright date.
	Use $(GDBSERVER_CFLAGS).  Add regdef.o to $(OBS).  Add dependencies
	for regdef.o.
	* gdbserver/low-linux.c: Update to use target-specific modules and
	new register cache.  Remove dead code and incorrect comments.
	(read_inferior_memory): Cast argument to PTRACE_ARG3_TYPE.
	(write_inferior_memory): Likewise.
	* gdbserver/remote-utils.c (putpkt): Use malloc for buf2 as PBUFSIZ
	is no longer constant.
	(convert_ascii_to_int): Use register_size instead of
	REGISTER_RAW_SIZE.
	(outreg): Use register_data instead of REGISTER_BYTE and
	registers[].
	(prepare_resume_reply): Add GDBSERVER_NEW case using the new
	register protocol files.
	* gdbserver/server.c (main): Use malloc for own_buf as PBUFSIZ
	is no longer constant.  Use registers_to_string and
	registers_from_string.
	* gdbserver/server.h: If GDBSERVER_NEW, do not include "defs.h".
	Include "regdef.h".  Call registers_length () instead of checking
	REGISTER_BYTES.
	* gdbserver/utils.c (fatal): Constify argument.
	(warning): New function.

	* config/arm/linux.mt: Add GDBSERVER_CFLAGS; add reg-arm.o and
	lnx-arm.o to GDBSERVER_DEPFILES.
	* config/i386/linux.mt: Add GDBSERVER_CFLAGS; add reg-i386.o and
	lnx-i386.o to GDBSERVER_DEPFILES.
	* config/ia64/linux.mt: Add GDBSERVER_CFLAGS; add reg-ia64.o and
	lnx-ia64.o to GDBSERVER_DEPFILES.
	* config/m68k/linux.mh: Add GDBSERVER_CFLAGS; add reg-m68k.o and
	lnx-m68k.o to GDBSERVER_DEPFILES.
	* config/mips/linux.mt: Add GDBSERVER_CFLAGS; add reg-mips.o and
	lnx-mips.o to GDBSERVER_DEPFILES.
	* config/powerpc/linux.mt: Add GDBSERVER_CFLAGS; add reg-ppc.o and
	lnx-ppc.o to GDBSERVER_DEPFILES.
	* config/sh/linux.mt: Add GDBSERVER_CFLAGS and GDBSERVER_DEPFILES.

Index: gdb/gdbserver/lnx-arm.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-arm.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-arm.c	Thu Oct 11 15:58:55 2001
@@ -0,0 +1,46 @@
+/* Linux/ARM 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 <sys/reg.h>
+#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);
+}
+
Index: gdb/gdbserver/lnx-i386.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-i386.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-i386.c	Wed Oct 10 13:56:11 2001
@@ -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 <sys/reg.h>
+#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);
+}
Index: gdb/gdbserver/lnx-ia64.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-ia64.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-ia64.c	Thu Oct 11 15:58:51 2001
@@ -0,0 +1,296 @@
+/* Linux/IA64 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 <sys/reg.h>
+#endif
+
+int num_regs = 590;
+
+#include <asm/ptrace_offsets.h>
+
+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;
+}
+
Index: gdb/gdbserver/lnx-m68k.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-m68k.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-m68k.c	Thu Oct 11 15:58:42 2001
@@ -0,0 +1,64 @@
+/* Linux/m68k 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 <sys/reg.h>
+#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);
+}
Index: gdb/gdbserver/lnx-mips.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-mips.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-mips.c	Thu Oct 11 15:58:46 2001
@@ -0,0 +1,104 @@
+/* Linux/MIPS 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 <sys/reg.h>
+#endif
+
+int num_regs = 90;
+
+#include <asm/ptrace.h>
+
+/* 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;
+}
Index: gdb/gdbserver/lnx-ppc.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-ppc.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-ppc.c	Wed Oct 10 13:56:11 2001
@@ -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 <asm/ptrace.h>
+
+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;
+}
+
Index: gdb/gdbserver/lnx-sh.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/lnx-sh.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/lnx-sh.c	Wed Oct 10 13:56:11 2001
@@ -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 <sys/reg.h>
+#endif
+
+#include <asm/ptrace.h>
+
+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;
+}
+
Index: gdb/gdbserver/reg-arm.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-arm.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-arm.c	Thu Oct 11 10:00:15 2001
@@ -0,0 +1,41 @@
+/* Register protocol for ARM, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-i386.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-i386.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-i386.c	Thu Oct 11 10:00:30 2001
@@ -0,0 +1,45 @@
+/* Register protocol for i386, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-ia64.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-ia64.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-ia64.c	Thu Oct 11 10:00:53 2001
@@ -0,0 +1,190 @@
+/* Register protocol for IA64, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-m68k.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-m68k.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-m68k.c	Thu Oct 11 10:01:08 2001
@@ -0,0 +1,45 @@
+/* Register protocol for m68k, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-mips.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-mips.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-mips.c	Thu Oct 11 10:01:19 2001
@@ -0,0 +1,69 @@
+/* Register protocol for MIPS, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-ppc.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-ppc.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-ppc.c	Thu Oct 11 10:01:26 2001
@@ -0,0 +1,58 @@
+/* Register protocol for PPC, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/reg-sh.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/reg-sh.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/reg-sh.c	Thu Oct 11 10:00:06 2001
@@ -0,0 +1,51 @@
+/* Register protocol for SH, for the remote server for GDB.
+   Copyright 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 "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));
+}
Index: gdb/gdbserver/regdef.c
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/regdef.c
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/regdef.c	Thu Oct 11 09:58:44 2001
@@ -0,0 +1,140 @@
+/* Register support routines for the remote server for GDB.
+   Copyright 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 <stdlib.h>
+#include <string.h>
+
+#ifndef GDBSERVER_NEW
+int
+registers_length (void)
+{
+  return 2 * REGISTER_BYTES;
+}
+
+char *
+register_data (int regno)
+{
+  return &registers[REGISTER_BYTE (regno)];
+}
+
+int
+register_size (int regno)
+{
+  return REGISTER_RAW_SIZE (regno);
+}
+#else
+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 &reg_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 &reg_defs[n];
+}
+
+int
+register_size (int n)
+{
+  return reg_defs[n].size;
+}
+
+char *
+register_data (int n)
+{
+  return registers + reg_defs[n].offset;
+}
+#endif
Index: gdb/gdbserver/regdef.h
===================================================================
RCS file: N/A
diff -u /dev/null gdb/gdbserver/regdef.h
--- /dev/null	Wed Dec 31 19:00:00 1969
+++ gdb/gdbserver/regdef.h	Thu Oct 11 09:58:37 2001
@@ -0,0 +1,65 @@
+/* Register support routines for the remote server for GDB.
+   Copyright 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.  */
+
+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[];
Index: gdb/config/arm/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/arm/linux.mt,v
retrieving revision 1.4
diff -u -p -r1.4 linux.mt
--- gdb/config/arm/linux.mt	2001/03/10 06:17:21	1.4
+++ gdb/config/arm/linux.mt	2001/10/11 19:59:10
@@ -2,4 +2,5 @@
 TM_FILE= tm-linux.h
 TDEPFILES= arm-tdep.o arm-linux-tdep.o solib.o solib-svr4.o solib-legacy.o
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-arm.o reg-arm.o
Index: gdb/config/i386/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/linux.mt,v
retrieving revision 1.4
diff -u -p -r1.4 linux.mt
--- gdb/config/i386/linux.mt	2001/03/10 06:17:21	1.4
+++ gdb/config/i386/linux.mt	2001/10/11 19:59:10
@@ -3,4 +3,5 @@ TDEPFILES= i386-tdep.o i386-linux-tdep.o
 	solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-i386.o reg-i386.o
Index: gdb/config/ia64/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/ia64/linux.mt,v
retrieving revision 1.5
diff -u -p -r1.5 linux.mt
--- gdb/config/ia64/linux.mt	2001/03/10 06:17:22	1.5
+++ gdb/config/ia64/linux.mt	2001/10/11 19:59:10
@@ -3,5 +3,6 @@ TDEPFILES= ia64-tdep.o ia64-aix-tdep.o i
 	solib.o solib-svr4.o solib-legacy.o
 TM_FILE= tm-linux.h
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-ia64.o reg-ia64.o
 GDBSERVER_LIBS= -lc -lnss_dns -lnss_files -lresolv -lc
Index: gdb/config/m68k/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/m68k/linux.mh,v
retrieving revision 1.5
diff -u -p -r1.5 linux.mh
--- gdb/config/m68k/linux.mh	2001/07/11 18:39:12	1.5
+++ gdb/config/m68k/linux.mh	2001/10/11 19:59:10
@@ -7,4 +7,5 @@ NAT_FILE= nm-linux.h
 NATDEPFILES= infptrace.o inftarg.o fork-child.o \
 	corelow.o core-aout.o m68klinux-nat.o linux-thread.o
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-m68k.o reg-m68k.o
Index: gdb/config/mips/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/mips/linux.mt,v
retrieving revision 1.1
diff -u -p -r1.1 linux.mt
--- gdb/config/mips/linux.mt	2001/07/10 20:41:54	1.1
+++ gdb/config/mips/linux.mt	2001/10/11 19:59:10
@@ -3,7 +3,8 @@ TDEPFILES= mips-tdep.o mips-linux-tdep.o
 	solib.o solib-svr4.o
 TM_FILE= tm-linux.h
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-mips.o reg-mips.o
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/mips/libsim.a
Index: gdb/config/powerpc/linux.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/powerpc/linux.mh,v
retrieving revision 1.6
diff -u -p -r1.6 linux.mh
--- gdb/config/powerpc/linux.mh	2000/10/30 22:33:32	1.6
+++ gdb/config/powerpc/linux.mh	2001/10/11 19:59:10
@@ -10,4 +10,5 @@ core-aout.o core-regset.o ppc-linux-nat.
 
 LOADLIBES = -ldl -rdynamic
 
-GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_CFLAGS=-DGDBSERVER_NEW
+GDBSERVER_DEPFILES= low-linux.o lnx-ppc.o reg-ppc.o
Index: gdb/config/sh/linux.mt
===================================================================
RCS file: /cvs/src/src/gdb/config/sh/linux.mt,v
retrieving revision 1.2
diff -u -p -r1.2 linux.mt
--- gdb/config/sh/linux.mt	2001/03/10 06:17:23	1.2
+++ gdb/config/sh/linux.mt	2001/10/11 19:59:10
@@ -4,3 +4,6 @@ TM_FILE= tm-linux.h
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/sh/libsim.a
+
+GDBSERVER_CFLAGS = -DGDBSERVER_NEW
+GDBSERVER_DEPFILES = low-linux.o lnx-sh.o reg-sh.o
Index: gdb/gdbserver/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/Makefile.in,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile.in
--- gdb/gdbserver/Makefile.in	2001/03/06 08:21:43	1.3
+++ gdb/gdbserver/Makefile.in	2001/10/11 19:59:11
@@ -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.
@@ -108,7 +108,7 @@ GLOBAL_CFLAGS = ${MT_CFLAGS} ${MH_CFLAGS
 CFLAGS = -g
 # INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros.
 INTERNAL_CFLAGS = ${CFLAGS} ${GLOBAL_CFLAGS} ${PROFILE_CFLAGS} \
-	${INCLUDE_CFLAGS} ${BFD_CFLAGS} -DGDBSERVER
+	${INCLUDE_CFLAGS} ${BFD_CFLAGS} -DGDBSERVER ${GDBSERVER_CFLAGS}
 
 # LDFLAGS is specifically reserved for setting from the command line
 # when running make.
@@ -137,7 +137,7 @@ DEPFILES = $(GDBSERVER_DEPFILES)
 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 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 +247,6 @@ low-sparc.o : $(srcdir)/low-sparc.c $(sr
 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
 
 # This is the end of "Makefile.in".
Index: gdb/gdbserver/low-linux.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/low-linux.c,v
retrieving revision 1.11
diff -u -p -r1.11 low-linux.c
--- gdb/gdbserver/low-linux.c	2001/07/26 02:23:58	1.11
+++ gdb/gdbserver/low-linux.c	2001/10/11 19:59:11
@@ -21,8 +21,6 @@
 
 #include "server.h"
 #include <sys/wait.h>
-#include "frame.h"
-#include "inferior.h"
 
 #include <stdio.h>
 #include <sys/param.h>
@@ -32,25 +30,21 @@
 #include <signal.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
 
-/***************Begin MY defs*********************/
-static char my_registers[REGISTER_BYTES];
-char *registers = my_registers;
-/***************End MY defs*********************/
-
 #ifdef HAVE_SYS_REG_H
 #include <sys/reg.h>
 #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;
+extern int num_regs;
+extern int regmap[];
 
-static void initialize_arch (void);
-
 /* Start an inferior process and returns its pid.
    ALLARGS is a vector of program-name and args. */
 
@@ -70,7 +64,7 @@ create_inferior (char *program, char **a
       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);
     }
@@ -87,7 +81,6 @@ kill_inferior (void)
     return;
   ptrace (PTRACE_KILL, inferior_pid, 0, 0);
   wait (0);
-/*************inferior_died ();****VK**************/
 }
 
 /* Return nonzero if the given thread is still alive.  */
@@ -106,7 +99,7 @@ mywait (char *status)
   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");
@@ -143,419 +136,24 @@ myresume (int step, int signal)
     perror_with_name ("ptrace");
 }
 
-
-#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.  */
+#define REGISTER_RAW_SIZE(regno) register_size((regno))
 
 int
-m68k_linux_register_u_addr (int blockend, int regnum)
+register_addr (int regnum, CORE_ADDR blockend)
 {
-  return (blockend + 4 * regmap[regnum]);
-}
-#elif defined(IA64_GNULINUX_TARGET)
-#undef NUM_FREGS
-#define NUM_FREGS 0
-
-#include <asm/ptrace_offsets.h>
-
-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,
-  };
-
-int
-ia64_register_u_addr (int blockend, int regnum)
-{
   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 +162,19 @@ fetch_register (int regno)
   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 *) &registers[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 +197,7 @@ void
 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 +212,43 @@ store_inferior_registers (int regno)
 {
   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;
-#endif
-      regaddr = register_addr (regno, offset);
+
+      if (cannot_store_register (regno))
+	return;
+
+      regaddr = register_addr (regno, 0);
+      if (regaddr == -1)
+	return;
       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 *) &registers[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 *) &registers[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 +269,7 @@ read_inferior_memory (CORE_ADDR memaddr,
   /* 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 +296,13 @@ write_inferior_memory (CORE_ADDR memaddr
 
   /* 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 +314,7 @@ write_inferior_memory (CORE_ADDR memaddr
   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 +325,5 @@ write_inferior_memory (CORE_ADDR memaddr
 void
 initialize_low (void)
 {
-  initialize_arch ();
+  init_registers ();
 }
Index: gdb/gdbserver/remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/remote-utils.c,v
retrieving revision 1.7
diff -u -p -r1.7 remote-utils.c
--- gdb/gdbserver/remote-utils.c	2001/07/12 21:04:35	1.7
+++ gdb/gdbserver/remote-utils.c	2001/10/11 19:59:11
@@ -34,6 +34,7 @@
 #include <fcntl.h>
 #include <sys/time.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 int remote_debug = 0;
 struct ui_file *gdb_stdlog;
@@ -183,6 +184,7 @@ fromhex (int a)
     return a - 'a' + 10;
   else
     error ("Reply contains invalid hex digit");
+  return 0;
 }
 
 /* Convert number NIB to a hex digit.  */
@@ -204,7 +206,7 @@ putpkt (char *buf)
 {
   int i;
   unsigned char csum = 0;
-  char buf2[PBUFSIZ];
+  char *buf2;
   char buf3[1];
   int cnt = strlen (buf);
   char *p;
@@ -212,6 +214,7 @@ putpkt (char *buf)
   /* Copy the packet into buffer BUF2, encapsulating it
      and giving it a checksum.  */
 
+  buf2 = malloc (PBUFSIZ);
   p = buf2;
   *p++ = '$';
 
@@ -250,11 +253,13 @@ putpkt (char *buf)
 	  else
 	    perror ("putpkt(read)");
 
+	  free (buf2);
 	  return -1;
 	}
     }
   while (buf3[0] != '+');
 
+  free (buf2);
   return 1;			/* Success! */
 }
 
@@ -440,7 +445,7 @@ convert_ascii_to_int (char *from, char *
 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 +454,7 @@ outreg (int regno, char *buf)
   *buf++ = tohex ((regno >> 4) & 0xf);
   *buf++ = tohex (regno & 0xf);
   *buf++ = ':';
-  convert_int_to_ascii (&registers[REGISTER_BYTE (regno)], buf, regsize);
+  convert_int_to_ascii (register_data (regno), buf, regsize);
   buf += 2 * regsize;
   *buf++ = ';';
 
@@ -474,27 +479,37 @@ prepare_resume_reply (char *buf, char st
 
   if (status == 'T')
     {
-#ifdef GDBSERVER_RESUME_REGS
+#ifdef GDBSERVER_NEW
+      char **regp = gdbserver_resume_regs;
+
+      while (*regp)
+	{
+	  buf = outreg (find_regno (*regp), buf);
+	  regp++;
+	}
+#else
+# ifdef GDBSERVER_RESUME_REGS
       static int gdbserver_resume_regs[] = GDBSERVER_RESUME_REGS ;
       int i;
       for (i = 0; 
-           i < sizeof (gdbserver_resume_regs) 
+	    i < sizeof (gdbserver_resume_regs) 
 	        / sizeof (gdbserver_resume_regs[0]);
-	   i++)
+	    i++)
 	{
 	  int regnum = gdbserver_resume_regs[i];
 	  buf = outreg (regnum, buf);
 	}
-#else /* !defined(GDBSERVER_RESUME_REGS) */
+# 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
+#  ifdef O7_REGNUM
       buf = outreg (O7_REGNUM, buf);
-#endif
-#endif /* GDBSERVER_RESUME_REGS */
+#  endif
+# endif /* GDBSERVER_RESUME_REGS */
+#endif /* GDBSERVER_NEW */
 
       /* 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.  */
Index: gdb/gdbserver/server.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.c,v
retrieving revision 1.3
diff -u -p -r1.3 server.c
--- gdb/gdbserver/server.c	2001/03/06 08:21:44	1.3
+++ gdb/gdbserver/server.c	2001/10/11 19:59:11
@@ -44,12 +44,14 @@ 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;
 
+  own_buf = malloc (PBUFSIZ);
+
   if (setjmp (toplevel))
     {
       fprintf (stderr, "Exiting\n");
@@ -109,10 +111,10 @@ main (int argc, char *argv[])
 		}
 	      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;
Index: gdb/gdbserver/server.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.h,v
retrieving revision 1.3
diff -u -p -r1.3 server.h
--- gdb/gdbserver/server.h	2001/03/06 08:21:44	1.3
+++ gdb/gdbserver/server.h	2001/10/11 19:59:11
@@ -19,8 +19,24 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include "defs.h"
+#ifndef GDBSERVER_NEW
+# include "defs.h"
+#else
+# include "config.h"
+# include "bfd.h"
+# include <stdarg.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <errno.h>
+# define NORETURN
+ typedef bfd_vma CORE_ADDR;
+ void error (const char *string,...);
+ void fatal (const char *string,...);
+ void warning (const char *string,...);
+#endif
+
 #include <setjmp.h>
+#include "regdef.h"
 
 /* Target-specific functions */
 
@@ -81,6 +97,6 @@ void perror_with_name (char *string);
 
 /* 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 () + 32 > 2000) \
+		 ? (registers_length () + 32) \
 		 : 2000)
Index: gdb/gdbserver/utils.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/utils.c,v
retrieving revision 1.4
diff -u -p -r1.4 utils.c
--- gdb/gdbserver/utils.c	2001/03/06 08:21:44	1.4
+++ gdb/gdbserver/utils.c	2001/10/11 19:59:11
@@ -75,7 +75,7 @@ error (const char *string,...)
 
 /* VARARGS */
 NORETURN void
-fatal (char *string,...)
+fatal (const char *string,...)
 {
   va_list args;
   va_start (args, string);
@@ -84,4 +84,15 @@ fatal (char *string,...)
   fprintf (stderr, "\n");
   va_end (args);
   exit (1);
+}
+
+void
+warning (const char *string,...)
+{
+  va_list args;
+  va_start (args, string);
+  fprintf (stderr, "gdb: ");
+  vfprintf (stderr, string, args);
+  fprintf (stderr, "\n");
+  va_end (args);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]