This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
s390 gdbserver; Was: gdb & gdbserver for s390 31 & 64 bit
- To: Denis Joseph Barrow <DJBARROW at de dot ibm dot com>
- Subject: s390 gdbserver; Was: gdb & gdbserver for s390 31 & 64 bit
- From: Andrew Cagney <ac131313 at cygnus dot com>
- Date: Sat, 13 Oct 2001 18:26:26 -0400
- Cc: gdb-patches at sourceware dot cygnus dot com
- References: <OFD4FE49C1.46611C31-ONC1256AC3.0067B337@de.ibm.com>
Denis,
The attached support for s390 gdbserver hasn't been committed to either
the 5.1 branch or the trunk. I don't think it should go into the 5.1
branch since it is more intrusive than the s390 target code. As for the
trunk, I need to look at it more carefully.
Andrew
2001-07-09 D.J. Barrow <djbarrow@de.ibm.com>:
* signals.c: Fixed so that the gdbserver could build it to use
target_signal_to_host & target_signal_from_host gdbserver was very
broken & had a severe fixme wrt signals.
* gdbserver/Makefile.in: Made makefile go to parent directory for
source files (so as to build signal.c).
* gdbserver/low-linux.c: Added s390 32/64 bit support Fixed
assumption that PTRACE_XFER_TYPE was an int added
CANNOT_FETCH_REGISTER & CANNOT_STORE_REGISTER macros. Fixed
fetch_inferior_registers etc. to work with s390 floating point
regs.
* gdbserver/server.c: Added target signal remapping FIXME.
* gdbserver/remote-utils: Likewise.
And also:
* defs.h: When GDBSERVER undef GDB_MULTI_ARCH.
Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.60.2.1
retrieving revision 1.60.2.1.2.1
diff -p -r1.60.2.1 -r1.60.2.1.2.1
*** defs.h 2001/08/02 21:36:51 1.60.2.1
--- defs.h 2001/09/27 00:13:29 1.60.2.1.2.1
***************
*** 1,4 ****
! /* *INDENT-OFF* */ /* ATTR_FORMAT confuses indent, avoid running it for now */
/* Basic, host-specific, and target-specific definitions for GDB.
Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001
--- 1,4 ----
! /* *INDENT-OFF* *//* ATTR_FORMAT confuses indent, avoid running it for now */
/* Basic, host-specific, and target-specific definitions for GDB.
Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001
***************
*** 25,30 ****
--- 25,33 ----
#define DEFS_H
#include "config.h" /* Generated by configure */
+ #if GDBSERVER
+ #undef GDB_MULTI_ARCH
+ #endif /* GDBSERVER */
#include <stdio.h>
#include <errno.h> /* System call error return status */
#include <limits.h>
Index: signals.c
===================================================================
RCS file: /cvs/src/src/gdb/signals.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -p -r1.1 -r1.1.4.1
*** signals.c 2001/07/19 18:09:11 1.1
--- signals.c 2001/09/27 00:13:30 1.1.4.1
***************
*** 24,29 ****
--- 24,30 ----
#include "target.h"
#include <signal.h>
+ #ifndef GDBSERVER
/* This table must match in order and size the signals in enum target_signal
in target.h. */
/* *INDENT-OFF* */
*************** target_signal_from_name (char *name)
*** 230,242 ****
/* This ugly cast brought to you by the native VAX compiler. */
for (sig = TARGET_SIGNAL_HUP;
! signals[sig].name != NULL;
! sig = (enum target_signal) ((int) sig + 1))
if (STREQ (name, signals[sig].name))
return sig;
return TARGET_SIGNAL_UNKNOWN;
}
!
/* The following functions are to help certain targets deal
with the signal/waitstatus stuff. They could just as well be in
a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
--- 231,243 ----
/* This ugly cast brought to you by the native VAX compiler. */
for (sig = TARGET_SIGNAL_HUP;
! signals[sig].name != NULL; sig = (enum target_signal) ((int) sig + 1))
if (STREQ (name, signals[sig].name))
return sig;
return TARGET_SIGNAL_UNKNOWN;
}
! #endif /* GDBSERVER */
!
/* The following functions are to help certain targets deal
with the signal/waitstatus stuff. They could just as well be in
a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
*************** target_signal_from_host (int hostsig)
*** 480,486 ****
return (enum target_signal)
(hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64);
else
! error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
}
#endif
--- 481,488 ----
return (enum target_signal)
(hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64);
else
! error
! ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
}
#endif
*************** target_signal_from_host (int hostsig)
*** 494,500 ****
else if (hostsig == 64)
return TARGET_SIGNAL_REALTIME_64;
else
! error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
}
#endif
return TARGET_SIGNAL_UNKNOWN;
--- 496,503 ----
else if (hostsig == 64)
return TARGET_SIGNAL_REALTIME_64;
else
! error
! ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
}
#endif
return TARGET_SIGNAL_UNKNOWN;
*************** target_signal_from_host (int hostsig)
*** 506,513 ****
accordingly. */
static int
! do_target_signal_to_host (enum target_signal oursig,
! int *oursig_ok)
{
*oursig_ok = 1;
switch (oursig)
--- 509,515 ----
accordingly. */
static int
! do_target_signal_to_host (enum target_signal oursig, int *oursig_ok)
{
*oursig_ok = 1;
switch (oursig)
*************** do_target_signal_to_host (enum target_si
*** 737,745 ****
&& oursig <= TARGET_SIGNAL_REALTIME_63)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
! int retsig =
! (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
return retsig;
}
--- 739,746 ----
&& oursig <= TARGET_SIGNAL_REALTIME_63)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
! int retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
return retsig;
}
*************** do_target_signal_to_host (enum target_si
*** 747,753 ****
else if (oursig == TARGET_SIGNAL_REALTIME_32)
{
/* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
! TARGET_SIGNAL_REALTIME_33. It is 32 by definition. */
return 32;
}
#endif
--- 748,754 ----
else if (oursig == TARGET_SIGNAL_REALTIME_32)
{
/* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
! TARGET_SIGNAL_REALTIME_33. It is 32 by definition. */
return 32;
}
#endif
*************** do_target_signal_to_host (enum target_si
*** 756,768 ****
&& oursig <= TARGET_SIGNAL_REALTIME_127)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_64 is 64 by definition. */
! int retsig =
! (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64;
if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
return retsig;
}
!
#endif
#endif
--- 757,768 ----
&& oursig <= TARGET_SIGNAL_REALTIME_127)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_64 is 64 by definition. */
! int retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64;
if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
return retsig;
}
!
#endif
#endif
*************** do_target_signal_to_host (enum target_si
*** 771,779 ****
&& oursig <= TARGET_SIGNAL_REALTIME_63)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
! int retsig =
! (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
if (retsig >= SIGRTMIN && retsig <= SIGRTMAX)
return retsig;
}
--- 771,778 ----
&& oursig <= TARGET_SIGNAL_REALTIME_63)
{
/* This block of signals is continuous, and
! TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
! int retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
if (retsig >= SIGRTMIN && retsig <= SIGRTMAX)
return retsig;
}
*************** do_target_signal_to_host (enum target_si
*** 785,790 ****
--- 784,790 ----
}
}
+ #ifndef GDBSERVER
int
target_signal_to_host_p (enum target_signal oursig)
{
*************** target_signal_to_host_p (enum target_sig
*** 792,797 ****
--- 792,798 ----
do_target_signal_to_host (oursig, &oursig_ok);
return oursig_ok;
}
+ #endif /* GDBSERVER */
int
target_signal_to_host (enum target_signal oursig)
*************** target_signal_to_host (enum target_signa
*** 802,815 ****
--- 803,823 ----
{
/* The user might be trying to do "signal SIGSAK" where this system
doesn't have SIGSAK. */
+ #ifdef GDBSERVER
+ fprintf (stderr, "Target signal %d does not exist on this system.\n",
+ oursig);
+ #else
warning ("Signal %s does not exist on this system.\n",
target_signal_to_name (oursig));
+ #endif
+
return 0;
}
else
return targ_signo;
}
+ #ifndef GDBSERVER
/* In some circumstances we allow a command to specify a numeric
signal. The idea is to keep these circumstances limited so that
users (and scripts) develop portable habits. For comparison,
*************** _initialize_signals (void)
*** 833,835 ****
--- 841,844 ----
if (!STREQ (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC"))
internal_error (__FILE__, __LINE__, "failed internal consistency check");
}
+ #endif /* GDBSERVER */
Index: gdbserver/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/Makefile.in,v
retrieving revision 1.3
retrieving revision 1.3.6.1
diff -p -r1.3 -r1.3.6.1
*** Makefile.in 2001/03/06 08:21:43 1.3
--- Makefile.in 2001/09/27 00:13:30 1.3.6.1
*************** LINTFLAGS= $(BFD_CFLAGS)
*** 130,148 ****
SFILES = $(srcdir)/low-hppabsd.c $(srcdir)/low-linux.c $(srcdir)/low-lynx.c \
$(srcdir)/low-nbsd.c $(srcdir)/low-sim.c $(srcdir)/low-sparc.c \
$(srcdir)/low-sun3.c $(srcdir)/utils.c $(srcdir)/server.c \
! $(srcdir)/remote-utils.c
DEPFILES = $(GDBSERVER_DEPFILES)
SOURCES = $(SFILES) $(ALLDEPFILES)
TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
! OBS = utils.o $(GDBSERVER_DEPFILES) server.o remote-utils.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.
! .c.o:
${CC} -c ${INTERNAL_CFLAGS} $<
all: gdbserver gdbreplay
--- 130,150 ----
SFILES = $(srcdir)/low-hppabsd.c $(srcdir)/low-linux.c $(srcdir)/low-lynx.c \
$(srcdir)/low-nbsd.c $(srcdir)/low-sim.c $(srcdir)/low-sparc.c \
$(srcdir)/low-sun3.c $(srcdir)/utils.c $(srcdir)/server.c \
! $(srcdir)/remote-utils.c ../signals.c
DEPFILES = $(GDBSERVER_DEPFILES)
SOURCES = $(SFILES) $(ALLDEPFILES)
TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
! OBS = $(srcdir)/utils.o $(GDBSERVER_DEPFILES) server.o remote-utils.o signals.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.
! %.o: %.c
${CC} -c ${INTERNAL_CFLAGS} $<
+ %.o: ../%.c
+ ${CC} -c ${INTERNAL_CFLAGS} $<
all: gdbserver gdbreplay
*************** low-sim.o : ${srcdir}/low-sim.c ${srcdir
*** 246,251 ****
low-sparc.o : $(srcdir)/low-sparc.c $(srcdir)/server.h
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
# This is the end of "Makefile.in".
--- 248,254 ----
low-sparc.o : $(srcdir)/low-sparc.c $(srcdir)/server.h
low-sun3.o : $(srcdir)/low-sun3.c $(srcdir)/server.h
low-hppabsd.o : $(srcdir)/low-hppabsd.c $(srcdir)/server.h
! $(srcdir)/utils.o : ${srcdir}/utils.c ${srcdir}/server.h
! signals.o : ../signals.c ../target.h
# This is the end of "Makefile.in".
Index: gdbserver/low-linux.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/low-linux.c,v
retrieving revision 1.11
retrieving revision 1.11.4.1
diff -p -r1.11 -r1.11.4.1
*** low-linux.c 2001/07/26 02:23:58 1.11
--- low-linux.c 2001/09/27 00:13:30 1.11.4.1
*************** char *registers = my_registers;
*** 49,56 ****
extern int errno;
static void initialize_arch (void);
!
/* Start an inferior process and returns its pid.
ALLARGS is a vector of program-name and args. */
--- 49,57 ----
extern int errno;
+ #ifndef S390_GNULINUX_TARGET
static void initialize_arch (void);
! #endif
/* Start an inferior process and returns its pid.
ALLARGS is a vector of program-name and args. */
*************** mywait (char *status)
*** 113,125 ****
if (WIFEXITED (w))
{
! fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w));
*status = 'W';
return ((unsigned char) WEXITSTATUS (w));
}
else if (!WIFSTOPPED (w))
{
! fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w));
*status = 'X';
return ((unsigned char) WTERMSIG (w));
}
--- 114,128 ----
if (WIFEXITED (w))
{
! fprintf (stderr, "\nChild exited with retcode = %x \n",
! WEXITSTATUS (w));
*status = 'W';
return ((unsigned char) WEXITSTATUS (w));
}
else if (!WIFSTOPPED (w))
{
! fprintf (stderr, "\nChild terminated with signal = %x \n",
! WTERMSIG (w));
*status = 'X';
return ((unsigned char) WTERMSIG (w));
}
*************** int i386_register_byte[MAX_NUM_REGS];
*** 178,194 ****
/* 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
--- 181,197 ----
/* 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)
*** 212,219 ****
/* 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,
--- 215,221 ----
/* 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,
*************** initialize_arch (void)
*** 236,243 ****
}
/* 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,
--- 238,244 ----
}
/* 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,
*************** m68k_linux_register_u_addr (int blockend
*** 268,525 ****
#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)
--- 269,525 ----
#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)
*************** fetch_register (int regno)
*** 569,590 ****
offset = U_REGS_OFFSET;
! regaddr = register_addr (regno, offset);
! for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
{
! errno = 0;
! *(PTRACE_XFER_TYPE *) ®isters[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
! kernel doesn't let us at the registers. */
! char *err = strerror (errno);
! char *msg = alloca (strlen (err) + 128);
! sprintf (msg, "reading register %d: %s", regno, err);
! error (msg);
! goto error_exit;
}
}
error_exit:;
--- 569,599 ----
offset = U_REGS_OFFSET;
! #ifdef S390_GNULINUX_TARGET /* intel has CANNOT_FETCH_REGISTER defined but not linked */
! if (CANNOT_FETCH_REGISTER (regno))
! memset (®isters[REGISTER_BYTE (regno)], 0, REGISTER_RAW_SIZE (regno));
! else
! #endif
{
! regaddr = register_addr (regno, offset);
! for (i = 0; i < REGISTER_RAW_SIZE (regno);
! i += sizeof (PTRACE_XFER_TYPE))
{
! errno = 0;
! *(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
! kernel doesn't let us at the registers. */
! char *err = strerror (errno);
! char *msg = alloca (strlen (err) + 128);
! sprintf (msg, "reading register %d: %s", regno, err);
! error (msg);
! goto error_exit;
! }
}
}
error_exit:;
*************** void
*** 596,602 ****
fetch_inferior_registers (int regno)
{
if (regno == -1 || regno == 0)
! for (regno = 0; regno < NUM_REGS - NUM_FREGS; regno++)
fetch_register (regno);
else
fetch_register (regno);
--- 605,615 ----
fetch_inferior_registers (int regno)
{
if (regno == -1 || regno == 0)
! for (regno = 0; regno < NUM_REGS
! #ifndef S390_GNULINUX_TARGET
! - NUM_FREGS
! #endif
! ; regno++)
fetch_register (regno);
else
fetch_register (regno);
*************** store_inferior_registers (int regno)
*** 615,621 ****
if (regno >= 0)
{
! #if 0
if (CANNOT_STORE_REGISTER (regno))
return;
#endif
--- 628,634 ----
if (regno >= 0)
{
! #ifdef S390_GNULINUX_TARGET /* intel has CANNOT_STORE_REGISTER defined but not implemented */
if (CANNOT_STORE_REGISTER (regno))
return;
#endif
*************** store_inferior_registers (int regno)
*** 637,655 ****
}
else
#endif
! for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
{
errno = 0;
ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
! *(int *) ®isters[REGISTER_BYTE (regno) + i]);
if (errno != 0)
{
/* Warning, not error, in case we are attached; sometimes the
kernel doesn't let us at the registers. */
char *err = strerror (errno);
char *msg = alloca (strlen (err) + 128);
! sprintf (msg, "writing register %d: %s",
! regno, err);
error (msg);
return;
}
--- 650,669 ----
}
else
#endif
! for (i = 0; i < REGISTER_RAW_SIZE (regno);
! i += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
! *(PTRACE_XFER_TYPE *) & 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;
}
*************** store_inferior_registers (int regno)
*** 657,663 ****
}
}
else
! for (regno = 0; regno < NUM_REGS - NUM_FREGS; regno++)
store_inferior_registers (regno);
}
--- 671,681 ----
}
}
else
! for (regno = 0; regno < NUM_REGS
! #ifndef S390_GNULINUX_TARGET
! - NUM_FREGS
! #endif
! ; regno++)
store_inferior_registers (regno);
}
*************** read_inferior_memory (CORE_ADDR memaddr,
*** 677,687 ****
/* Round starting address down to longword boundary. */
register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
! register int count
! = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
! / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
! register PTRACE_XFER_TYPE *buffer
= (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
/* Read all the longwords */
--- 695,705 ----
/* Round starting address down to longword boundary. */
register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
! register int count
! = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
! / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
! register PTRACE_XFER_TYPE *buffer
= (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
/* Read all the longwords */
*************** read_inferior_memory (CORE_ADDR memaddr,
*** 691,697 ****
}
/* Copy appropriate bytes out of the buffer. */
! memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
}
/* Copy LEN bytes of data from debugger memory at MYADDR
--- 709,716 ----
}
/* Copy appropriate bytes out of the buffer. */
! memcpy (myaddr,
! (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
}
/* Copy LEN bytes of data from debugger memory at MYADDR
*************** write_inferior_memory (CORE_ADDR memaddr
*** 707,715 ****
register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
register int count
! = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
! 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. */
--- 726,737 ----
register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
register int count
! =
! (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) -
! 1) / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
! 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. */
*************** write_inferior_memory (CORE_ADDR memaddr
*** 725,731 ****
/* Copy data to be written over corresponding part of buffer */
! memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);
/* Write the entire buffer. */
--- 747,754 ----
/* Copy data to be written over corresponding part of buffer */
! memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
! myaddr, len);
/* Write the entire buffer. */
*************** write_inferior_memory (CORE_ADDR memaddr
*** 743,747 ****
--- 766,772 ----
void
initialize_low (void)
{
+ #ifndef S390_GNULINUX_TARGET
initialize_arch ();
+ #endif
}
Index: gdbserver/remote-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/remote-utils.c,v
retrieving revision 1.7
retrieving revision 1.7.4.1
diff -p -r1.7 -r1.7.4.1
*** remote-utils.c 2001/07/12 21:04:35 1.7
--- remote-utils.c 2001/09/27 00:13:30 1.7.4.1
***************
*** 34,39 ****
--- 34,40 ----
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
+ #include <target.h>
int remote_debug = 0;
struct ui_file *gdb_stdlog;
*************** remote_open (char *name)
*** 141,147 ****
/* Enable TCP keep alive process. */
tmp = 1;
! setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
/* Tell TCP not to delay small packets. This greatly speeds up
interactive response. */
--- 142,149 ----
/* Enable TCP keep alive process. */
tmp = 1;
! setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp,
! sizeof (tmp));
/* Tell TCP not to delay small packets. This greatly speeds up
interactive response. */
*************** input_interrupt (void)
*** 278,284 ****
{
int cc;
char c;
!
cc = read (remote_desc, &c, 1);
if (cc != 1 || c != '\003')
--- 280,286 ----
{
int cc;
char c;
!
cc = read (remote_desc, &c, 1);
if (cc != 1 || c != '\003')
*************** input_interrupt (void)
*** 286,292 ****
fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
return;
}
!
kill (inferior_pid, SIGINT);
}
}
--- 288,294 ----
fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
return;
}
!
kill (inferior_pid, SIGINT);
}
}
*************** prepare_resume_reply (char *buf, char st
*** 463,472 ****
*buf++ = status;
! /* FIXME! Should be converting this signal number (numbered
! according to the signal numbering of the system we are running on)
! to the signal numbers used by the gdb protocol (see enum target_signal
! in gdb/target.h). */
nib = ((signo & 0xf0) >> 4);
*buf++ = tohex (nib);
nib = signo & 0x0f;
--- 465,471 ----
*buf++ = status;
! signo = target_signal_from_host (signo);
nib = ((signo & 0xf0) >> 4);
*buf++ = tohex (nib);
nib = signo & 0x0f;
*************** prepare_resume_reply (char *buf, char st
*** 475,486 ****
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);
--- 474,484 ----
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);
Index: gdbserver/server.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/server.c,v
retrieving revision 1.3
retrieving revision 1.3.6.1
diff -p -r1.3 -r1.3.6.1
*** server.c 2001/03/06 08:21:44 1.3
--- server.c 2001/09/27 00:13:30 1.3.6.1
***************
*** 20,25 ****
--- 20,26 ----
Boston, MA 02111-1307, USA. */
#include "server.h"
+ #include "target.h"
int cont_thread;
int general_thread;
*************** main (int argc, char *argv[])
*** 60,66 ****
error ("Usage: gdbserver tty prog [args ...]");
initialize_low ();
-
/* Wait till we are at first instruction in program. */
signal = start_inferior (&argv[2], &status);
--- 61,66 ----
*************** main (int argc, char *argv[])
*** 130,141 ****
--- 130,143 ----
break;
case 'C':
convert_ascii_to_int (own_buf + 1, &sig, 1);
+ sig = target_signal_to_host (sig);
myresume (0, sig);
signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
break;
case 'S':
convert_ascii_to_int (own_buf + 1, &sig, 1);
+ sig = target_signal_to_host (sig);
myresume (1, sig);
signal = mywait (&status);
prepare_resume_reply (own_buf, status, signal);
*************** main (int argc, char *argv[])
*** 210,217 ****
putpkt (own_buf);
if (status == 'W')
! fprintf (stderr,
! "\nChild exited with status %d\n", sig);
if (status == 'X')
fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
if (status == 'W' || status == 'X')
--- 212,218 ----
putpkt (own_buf);
if (status == 'W')
! fprintf (stderr, "\nChild exited with status %d\n", sig);
if (status == 'X')
fprintf (stderr, "\nChild terminated with signal = 0x%x\n", sig);
if (status == 'W' || status == 'X')
*************** main (int argc, char *argv[])
*** 250,256 ****
}
else
{
! fprintf (stderr, "Remote side has terminated connection. GDBserver will reopen the connection.\n");
remote_close ();
}
--- 251,258 ----
}
else
{
! fprintf (stderr,
! "Remote side has terminated connection. GDBserver will reopen the connection.\n");
remote_close ();
}