aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>1999-11-02 04:44:47 +0000
committerJason Molenda <jmolenda@apple.com>1999-11-02 04:44:47 +0000
commit5c44784c11ecc8febfff615b88496c56c9ad5274 (patch)
tree74f9079f5b0ddae1182abf087af8adc02103e149 /gdb/gdbserver
parent9503fd8735ec438fcb2fca34afa276e3e6ca94f5 (diff)
downloadfsf-binutils-gdb-5c44784c11ecc8febfff615b88496c56c9ad5274.zip
fsf-binutils-gdb-5c44784c11ecc8febfff615b88496c56c9ad5274.tar.gz
fsf-binutils-gdb-5c44784c11ecc8febfff615b88496c56c9ad5274.tar.bz2
import gdb-1999-11-01 snapshot
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r--gdb/gdbserver/Makefile.in5
-rw-r--r--gdb/gdbserver/gdbreplay.c6
-rw-r--r--gdb/gdbserver/low-hppabsd.c3
-rw-r--r--gdb/gdbserver/low-linux.c354
-rw-r--r--gdb/gdbserver/low-lynx.c3
-rw-r--r--gdb/gdbserver/low-sim.c3
-rw-r--r--gdb/gdbserver/low-sparc.c3
-rw-r--r--gdb/gdbserver/low-sun3.c3
-rw-r--r--gdb/gdbserver/remote-utils.c22
-rw-r--r--gdb/gdbserver/server.c2
-rw-r--r--gdb/gdbserver/server.h13
-rw-r--r--gdb/gdbserver/utils.c4
12 files changed, 378 insertions, 43 deletions
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index d55050f..e714e32 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -89,9 +89,10 @@ 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)
# -I${srcdir} possibly for regex.h also.
# -I${srcdir}/config for more generic config files.
-INCLUDE_CFLAGS = -I. -I${srcdir} -I${srcdir}/.. -I${srcdir}/../config -I$(INCLUDE_DIR)
+INCLUDE_CFLAGS = -I. -I.. -I${srcdir} -I${srcdir}/.. -I${srcdir}/../config -I$(INCLUDE_DIR)
# M{H,T}_CFLAGS, if defined, has host- and target-dependent CFLAGS
# from the config/ directory.
@@ -103,7 +104,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} \
- ${BFD_CFLAGS} ${INCLUDE_CFLAGS}
+ ${INCLUDE_CFLAGS} ${BFD_CFLAGS} -DGDBSERVER
# LDFLAGS is specifically reserved for setting from the command line
# when running make.
diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c
index 5773962..9e88a75 100644
--- a/gdb/gdbserver/gdbreplay.c
+++ b/gdb/gdbserver/gdbreplay.c
@@ -19,6 +19,7 @@
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include "config.h"
#include <stdio.h>
#include <sys/file.h>
#include <netinet/in.h>
@@ -28,6 +29,7 @@
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>
+#include <errno.h>
/* Sort of a hack... */
#define EOL (EOF - 1)
@@ -42,10 +44,12 @@ void
perror_with_name (string)
char *string;
{
+#ifndef STDC_HEADERS
extern int sys_nerr;
extern char *sys_errlist[];
extern int errno;
- char *err;
+#endif
+ const char *err;
char *combined;
err = (errno < sys_nerr) ? sys_errlist[errno] : "unknown error";
diff --git a/gdb/gdbserver/low-hppabsd.c b/gdb/gdbserver/low-hppabsd.c
index 3c28a38..7c1b660 100644
--- a/gdb/gdbserver/low-hppabsd.c
+++ b/gdb/gdbserver/low-hppabsd.c
@@ -34,7 +34,8 @@
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
diff --git a/gdb/gdbserver/low-linux.c b/gdb/gdbserver/low-linux.c
index 32f10a1..b17e755 100644
--- a/gdb/gdbserver/low-linux.c
+++ b/gdb/gdbserver/low-linux.c
@@ -26,17 +26,16 @@
#include <stdio.h>
#include <sys/param.h>
#include <sys/dir.h>
+#include <sys/ptrace.h>
#include <sys/user.h>
#include <signal.h>
#include <sys/ioctl.h>
-#if 0
-#include <sgtty.h>
-#endif
#include <fcntl.h>
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
@@ -45,12 +44,15 @@ char registers[REGISTER_BYTES];
char buf2[MAX_REGISTER_RAW_SIZE];
/***************End MY defs*********************/
-#include <sys/ptrace.h>
-
-#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
+#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_XFER_TYPE int
+#endif
+
extern char **environ;
extern int errno;
extern int inferior_pid;
@@ -167,7 +169,42 @@ myresume (step, signal)
- KERNEL_U_ADDR
#endif
-#ifndef TARGET_M68K
+#ifdef I386_GNULINUX_TARGET
+/* i386_register_raw_size[i] is the number of bytes of storage in the
+ actual machine representation for 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
+};
+
+int i386_register_byte[MAX_NUM_REGS];
+
+static void
+initialize_arch()
+{
+ /* 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 table must line up with REGISTER_NAMES in tm-i386v.h */
/* symbols like 'EAX' come from <sys/reg.h> */
static int regmap[] =
@@ -201,7 +238,13 @@ i386_register_u_addr (blockend, regnum)
return (blockend + 4 * regmap[regnum]);
}
-#else /* TARGET_M68K */
+#elif defined(TARGET_M68K)
+static void
+initialize_arch()
+{
+ return;
+}
+
/* This table must line up with REGISTER_NAMES in tm-m68k.h */
static int regmap[] =
{
@@ -231,6 +274,256 @@ m68k_linux_register_u_addr (blockend, regnum)
{
return (blockend + 4 * regmap[regnum]);
}
+/* start-sanitize-ia64 */
+#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,
+ /* branch registers */
+ PT_B0,
+ PT_B1,
+ PT_B2,
+ PT_B3,
+ PT_B4,
+ PT_B5,
+ PT_B6,
+ PT_B7,
+ /* other registers */
+ PT_PR,
+ PT_CR_IIP,
+ PT_CR_IPSR,
+ /* 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,
+ };
+
+int
+ia64_register_u_addr (int blockend, int regnum)
+{
+ int addr;
+
+ if (regnum < 0 || regnum >= NUM_REGS)
+ error ("Invalid register number %d.", regnum);
+
+ addr = u_offsets[regnum];
+ if (addr == -1)
+ addr = 0;
+
+ return addr;
+}
+
+initialize_arch()
+{
+ return;
+}
+/* end-sanitize-ia64 */
#endif
CORE_ADDR
@@ -254,7 +547,7 @@ static void
fetch_register (regno)
int regno;
{
- register unsigned int regaddr;
+ CORE_ADDR regaddr;
register int i;
/* Offset of registers within the u area. */
@@ -263,12 +556,12 @@ fetch_register (regno)
offset = U_REGS_OFFSET;
regaddr = register_addr (regno, offset);
- for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
+ for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
- *(int *) &registers[regno * 4 + i] = ptrace (PTRACE_PEEKUSR, inferior_pid,
- (PTRACE_ARG3_TYPE) regaddr, 0);
- regaddr += sizeof (int);
+ *(PTRACE_XFER_TYPE *) &registers[REGISTER_BYTE (regno) + i] =
+ ptrace (PTRACE_PEEKUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, 0);
+ regaddr += sizeof (PTRACE_XFER_TYPE);
if (errno != 0)
{
/* Warning, not error, in case we are attached; sometimes the
@@ -304,8 +597,8 @@ void
store_inferior_registers (regno)
int regno;
{
- register unsigned int regaddr;
- register int i;
+ CORE_ADDR regaddr;
+ int i;
unsigned int offset = U_REGS_OFFSET;
if (regno >= 0)
@@ -335,7 +628,7 @@ store_inferior_registers (regno)
for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
{
errno = 0;
- ptrace (PTRACE_POKEUSR, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
+ ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
*(int *) &registers[REGISTER_BYTE (regno) + i]);
if (errno != 0)
{
@@ -373,21 +666,23 @@ read_inferior_memory (memaddr, myaddr, len)
{
register int i;
/* Round starting address down to longword boundary. */
- register CORE_ADDR addr = memaddr & -sizeof (int);
+ register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
- register int count
- = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
+ register int count
+ = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
+ / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
- register int *buffer = (int *) alloca (count * sizeof (int));
+ register PTRACE_XFER_TYPE *buffer
+ = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
/* Read all the longwords */
- for (i = 0; i < count; i++, addr += sizeof (int))
+ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
{
buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0);
}
/* Copy appropriate bytes out of the buffer. */
- memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
+ memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
}
/* Copy LEN bytes of data from debugger memory at MYADDR
@@ -403,12 +698,12 @@ write_inferior_memory (memaddr, myaddr, len)
{
register int i;
/* Round starting address down to longword boundary. */
- register CORE_ADDR addr = memaddr & -sizeof (int);
+ register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
register int count
- = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
+ = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
- register int *buffer = (int *) alloca (count * sizeof (int));
+ register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
extern int errno;
/* Fill start and end extra bytes of buffer with existing memory data. */
@@ -419,16 +714,16 @@ write_inferior_memory (memaddr, myaddr, len)
{
buffer[count - 1]
= ptrace (PTRACE_PEEKTEXT, inferior_pid,
- addr + (count - 1) * sizeof (int), 0);
+ addr + (count - 1) * sizeof (PTRACE_XFER_TYPE), 0);
}
/* Copy data to be written over corresponding part of buffer */
- memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
+ memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);
/* Write the entire buffer. */
- for (i = 0; i < count; i++, addr += sizeof (int))
+ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
ptrace (PTRACE_POKETEXT, inferior_pid, addr, buffer[i]);
@@ -443,6 +738,7 @@ void
initialize ()
{
inferior_pid = 0;
+ initialize_arch();
}
int
diff --git a/gdb/gdbserver/low-lynx.c b/gdb/gdbserver/low-lynx.c
index ecc3318..75e11ba 100644
--- a/gdb/gdbserver/low-lynx.c
+++ b/gdb/gdbserver/low-lynx.c
@@ -44,7 +44,8 @@
#include <sys/wait.h>
#include <sys/fpp.h>
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
#include <sys/ptrace.h>
diff --git a/gdb/gdbserver/low-sim.c b/gdb/gdbserver/low-sim.c
index ebd5f7d..3f9dea2 100644
--- a/gdb/gdbserver/low-sim.c
+++ b/gdb/gdbserver/low-sim.c
@@ -28,7 +28,8 @@ extern int remote_debug;
extern host_callback default_callback; /* in sim/common/callback.c */
-char registers[REGISTER_BYTES] __attribute__ ((aligned));
+static char my_registers[REGISTER_BYTES] __attribute__ ((aligned));
+char * registers = my_registers;
int target_byte_order; /* used by simulator */
diff --git a/gdb/gdbserver/low-sparc.c b/gdb/gdbserver/low-sparc.c
index 9dd70a2..e0e635e 100644
--- a/gdb/gdbserver/low-sparc.c
+++ b/gdb/gdbserver/low-sparc.c
@@ -37,7 +37,8 @@
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
diff --git a/gdb/gdbserver/low-sun3.c b/gdb/gdbserver/low-sun3.c
index 11f1d8a..786770b 100644
--- a/gdb/gdbserver/low-sun3.c
+++ b/gdb/gdbserver/low-sun3.c
@@ -34,7 +34,8 @@
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 4dab2ab..cd078cc 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -201,7 +201,7 @@ putpkt (buf)
{
int i;
unsigned char csum = 0;
- char buf2[2000];
+ char buf2[PBUFSIZ];
char buf3[1];
int cnt = strlen (buf);
char *p;
@@ -435,10 +435,13 @@ outreg (regno, buf)
int regno;
char *buf;
{
- extern char registers[];
int regsize = REGISTER_RAW_SIZE (regno);
- *buf++ = tohex (regno >> 4);
+ if ((regno >> 12) != 0)
+ *buf++ = tohex ((regno >> 12) & 0xf);
+ if ((regno >> 8) != 0)
+ *buf++ = tohex ((regno >> 8) & 0xf);
+ *buf++ = tohex ((regno >> 4) & 0xf);
*buf++ = tohex (regno & 0xf);
*buf++ = ':';
convert_int_to_ascii (&registers[REGISTER_BYTE (regno)], buf, regsize);
@@ -469,6 +472,18 @@ prepare_resume_reply (buf, status, signo)
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++)
+ {
+ int regnum = gdbserver_resume_regs[i];
+ buf = outreg (regnum, buf);
+ }
+#else /* !defined(GDBSERVER_RESUME_REGS) */
buf = outreg (PC_REGNUM, buf);
buf = outreg (FP_REGNUM, buf);
buf = outreg (SP_REGNUM, buf);
@@ -478,6 +493,7 @@ prepare_resume_reply (buf, status, signo)
#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 --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 66afb88..8b18f53 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -47,7 +47,7 @@ main (argc, argv)
int argc;
char *argv[];
{
- char ch, status, own_buf[2000], mem_buf[2000];
+ char ch, status, own_buf[PBUFSIZ], mem_buf[2000];
int i = 0;
unsigned char signal;
unsigned int len;
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index bfc89c7..c42a65c 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -36,7 +36,7 @@ int create_inferior ();
/* Target-specific variables */
-extern char registers[];
+extern char *registers;
/* Public variables in server.c */
@@ -71,3 +71,14 @@ void decode_M_packet PARAMS ((char *from, CORE_ADDR * mem_addr_ptr,
/* Functions from utils.c */
void perror_with_name PARAMS ((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). */
+#define MAXBUFBYTES(N) (((N)-32)/2)
+
+/* 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) \
+ : 2000)
diff --git a/gdb/gdbserver/utils.c b/gdb/gdbserver/utils.c
index ecff057..2603beb 100644
--- a/gdb/gdbserver/utils.c
+++ b/gdb/gdbserver/utils.c
@@ -32,10 +32,12 @@ void
perror_with_name (string)
char *string;
{
+#ifndef STDC_HEADERS
extern int sys_nerr;
extern char *sys_errlist[];
extern int errno;
- char *err;
+#endif
+ const char *err;
char *combined;
if (errno < sys_nerr)