summaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorDaniel Jacobowitz <dan@debian.org>2007-02-08 21:39:04 +0000
committerDaniel Jacobowitz <dan@debian.org>2007-02-08 21:39:04 +0000
commit189fa7349c0a18b67c620a73cbd56343d94abb7b (patch)
treed13e93d77cbe50d100315ea937048f39a12db4e9 /gdb/gdbserver
parentb155bb99d698705d0542044d7421f89880627c22 (diff)
downloadgdb-189fa7349c0a18b67c620a73cbd56343d94abb7b.tar.gz
* features/Makefile, features/arm-with-iwmmxt.xml,
features/gdbserver-regs.xsl, features/number-regs.xsl, features/sort-regs.xsl, features/xscale-iwmmxt.xml: New files. * regformats/arm-with-iwmmxt.dat: Generate. * NEWS: Mention iWMMXt. * gdb.arch/iwmmxt-regs.c, gdb.arch/iwmmxt-regs.exp: New. * Makefile.in (OBS): Add $(XML_BUILTIN). (XML_DIR, XML_TARGET, XML_FILES, XML_BUILTIN): New. (clean): Update. (target.xml, xml-builtin.c, stamp-xml, arm-with-iwmmxt.o) (arm-with-iwmmxt.c): New. * config.in, configure: Regenerate. * configure.ac: Check for iWMMXt. Handle srv_xmltarget, srv_xmlbuiltin, and srv_xmlfiles. Define USE_XML. * configure.srv: Mention srv_xmltarget and srv_xmlfiles. (arm*-*-linux*): Add iWMMXt and regset support. * linux-arm-low.c (PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS): Define. (arm_fill_gregset, arm_store_gregset, arm_fill_wmmxregset) (arm_store_wmmxregset, target_regsets): New. * server.c (get_features_xml): Take annex argument. Check builtin XML documents. (handle_query): Handle multiple annexes.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r--gdb/gdbserver/ChangeLog19
-rw-r--r--gdb/gdbserver/Makefile.in25
-rw-r--r--gdb/gdbserver/config.in3
-rwxr-xr-xgdb/gdbserver/configure63
-rw-r--r--gdb/gdbserver/configure.ac33
-rw-r--r--gdb/gdbserver/configure.srv14
-rw-r--r--gdb/gdbserver/linux-arm-low.c71
-rw-r--r--gdb/gdbserver/server.c37
8 files changed, 255 insertions, 10 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 60728cd61de..939d65ebdd8 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,22 @@
+2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * Makefile.in (OBS): Add $(XML_BUILTIN).
+ (XML_DIR, XML_TARGET, XML_FILES, XML_BUILTIN): New.
+ (clean): Update.
+ (target.xml, xml-builtin.c, stamp-xml, arm-with-iwmmxt.o)
+ (arm-with-iwmmxt.c): New.
+ * config.in, configure: Regenerate.
+ * configure.ac: Check for iWMMXt. Handle srv_xmltarget,
+ srv_xmlbuiltin, and srv_xmlfiles. Define USE_XML.
+ * configure.srv: Mention srv_xmltarget and srv_xmlfiles.
+ (arm*-*-linux*): Add iWMMXt and regset support.
+ * linux-arm-low.c (PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS): Define.
+ (arm_fill_gregset, arm_store_gregset, arm_fill_wmmxregset)
+ (arm_store_wmmxregset, target_regsets): New.
+ * server.c (get_features_xml): Take annex argument. Check builtin
+ XML documents.
+ (handle_query): Handle multiple annexes.
+
2007-01-29 Daniel Jacobowitz <dan@codesourcery.com>
* remote-utils.c [USE_WIN32API] (read, write): Define.
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index d708958ab03..279ae3f7743 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -137,10 +137,17 @@ TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
OBS = inferiors.o regcache.o remote-utils.o server.o signals.o target.o \
utils.o version.o \
mem-break.o \
+ $(XML_BUILTIN) \
$(DEPFILES)
GDBSERVER_LIBS = @GDBSERVER_LIBS@
XM_CLIBS = @LIBS@
+# XML files to compile in to gdbserver, if any.
+XML_DIR = $(srcdir)/../features
+XML_TARGET = @srv_xmltarget@
+XML_FILES = @srv_xmlfiles@
+XML_BUILTIN = @srv_xmlbuiltin@
+
# 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:
@@ -207,6 +214,8 @@ clean:
rm -f reg-arm.c reg-i386.c reg-ia64.c reg-m32r.c reg-m68k.c reg-mips.c
rm -f reg-ppc.c reg-sh.c reg-spu.c reg-x86-64.c reg-i386-linux.c
rm -f reg-cris.c reg-crisv32.c reg-x86-64-linux.c reg-mips64.c
+ rm -f arm-with-iwmmxt.c
+ rm -f xml-builtin.c stamp-xml target.xml
maintainer-clean realclean distclean: clean
rm -f nm.h tm.h xm.h config.status config.h stamp-h config.log
@@ -232,6 +241,19 @@ version.c: Makefile $(srcdir)/../version.in
mv version.c-tmp version.c
version.o: version.c $(server_h)
+target.xml: $(XML_TARGET)
+ rm -f target.xml
+ cp $(XML_TARGET) target.xml
+
+xml-builtin.c: stamp-xml; @true
+stamp-xml: $(XML_DIR)/feature_to_c.sh Makefile $(XML_FILES)
+ rm -f xml-builtin.tmp
+ $(SHELL) $(XML_DIR)/feature_to_c.sh xml-builtin.tmp $(XML_FILES)
+ $(SHELL) $(srcdir)/../../move-if-change xml-builtin.tmp xml-builtin.c
+ echo stamp > stamp-xml
+
+.PRECIOUS: target.xml xml-builtin.c
+
# GNU Make has an annoying habit of putting *all* the Makefile variables
# into the environment, unless you include this target as a circumvention.
# Rumor is that this will be fixed (and this target can be removed)
@@ -294,6 +316,9 @@ spu-low.o: spu-low.c $(server_h)
reg-arm.o : reg-arm.c $(regdef_h)
reg-arm.c : $(srcdir)/../regformats/reg-arm.dat $(regdat_sh)
sh $(regdat_sh) $(srcdir)/../regformats/reg-arm.dat reg-arm.c
+arm-with-iwmmxt.o : arm-with-iwmmxt.c $(regdef_h)
+arm-with-iwmmxt.c : $(srcdir)/../regformats/arm-with-iwmmxt.dat $(regdat_sh)
+ sh $(regdat_sh) $(srcdir)/../regformats/arm-with-iwmmxt.dat arm-with-iwmmxt.c
reg-cris.o : reg-cris.c $(regdef_h)
reg-cris.c : $(srcdir)/../regformats/reg-cris.dat $(regdat_sh)
sh $(regdat_sh) $(srcdir)/../regformats/reg-cris.dat reg-cris.c
diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in
index 16d013d48f2..2b20b747f70 100644
--- a/gdb/gdbserver/config.in
+++ b/gdb/gdbserver/config.in
@@ -135,3 +135,6 @@
Windows, we use the Windows API when building for MinGW, but the POSIX API
when building for Cygwin. */
#undef USE_WIN32API
+
+/* Define if an XML target description is available. */
+#undef USE_XML
diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure
index 0aec9831788..52fdd3d559e 100755
--- a/gdb/gdbserver/configure
+++ b/gdb/gdbserver/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CPP EGREP RDYNAMIC GDBSERVER_DEPFILES GDBSERVER_LIBS USE_THREAD_DB LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CPP EGREP RDYNAMIC GDBSERVER_DEPFILES GDBSERVER_LIBS USE_THREAD_DB srv_xmlbuiltin srv_xmlfiles srv_xmltarget LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -3230,6 +3230,45 @@ _ACEOF
fi
+
+# Check for various supplementary target information (beyond the
+# triplet) which might affect the choices in configure.srv.
+case "${target}" in
+ arm*-*-linux*)
+ echo "$as_me:$LINENO: checking if iWMMXt is selected" >&5
+echo $ECHO_N "checking if iWMMXt is selected... $ECHO_C" >&6
+if test "${gdb_cv_arm_iwmmxt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef __IWMMXT__
+got it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "got it" >/dev/null 2>&1; then
+ gdb_cv_arm_iwmmxt=yes
+else
+ gdb_cv_arm_iwmmxt=no
+fi
+rm -f conftest*
+
+ CPPFLAGS="$save_CPPFLAGS"
+fi
+echo "$as_me:$LINENO: result: $gdb_cv_arm_iwmmxt" >&5
+echo "${ECHO_T}$gdb_cv_arm_iwmmxt" >&6
+ ;;
+esac
+
. ${srcdir}/configure.srv
if test "${srv_mingw}" = "yes"; then
@@ -3977,6 +4016,22 @@ _ACEOF
fi
fi
+if test "$srv_xmltarget" != ""; then
+ srv_xmltarget="\$(XML_DIR)/$srv_xmltarget"
+ srv_xmlbuiltin="xml-builtin.o"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_XML 1
+_ACEOF
+
+
+ tmp_xmlfiles=$srv_xmlfiles
+ srv_xmlfiles="target.xml"
+ for f in $tmp_xmlfiles; do
+ srv_xmlfiles="$srv_xmlfiles \$(XML_DIR)/$f"
+ done
+fi
+
GDBSERVER_DEPFILES="$srv_regobj $srv_tgtobj $srv_thread_depfiles"
GDBSERVER_LIBS="$srv_libs"
@@ -3984,6 +4039,9 @@ GDBSERVER_LIBS="$srv_libs"
+
+
+
ac_config_files="$ac_config_files Makefile"
ac_config_commands="$ac_config_commands default"
cat >confcache <<\_ACEOF
@@ -4630,6 +4688,9 @@ s,@RDYNAMIC@,$RDYNAMIC,;t t
s,@GDBSERVER_DEPFILES@,$GDBSERVER_DEPFILES,;t t
s,@GDBSERVER_LIBS@,$GDBSERVER_LIBS,;t t
s,@USE_THREAD_DB@,$USE_THREAD_DB,;t t
+s,@srv_xmlbuiltin@,$srv_xmlbuiltin,;t t
+s,@srv_xmlfiles@,$srv_xmlfiles,;t t
+s,@srv_xmltarget@,$srv_xmltarget,;t t
s,@LIBOBJS@,$LIBOBJS,;t t
s,@LTLIBOBJS@,$LTLIBOBJS,;t t
CEOF
diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac
index ef4a423750a..c3690674c38 100644
--- a/gdb/gdbserver/configure.ac
+++ b/gdb/gdbserver/configure.ac
@@ -48,6 +48,24 @@ AC_CHECK_TYPES(socklen_t, [], [],
[#include <sys/types.h>
#include <sys/socket.h>
])
+
+# Check for various supplementary target information (beyond the
+# triplet) which might affect the choices in configure.srv.
+case "${target}" in
+ arm*-*-linux*)
+ AC_CACHE_CHECK([if iWMMXt is selected], [gdb_cv_arm_iwmmxt],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $CFLAGS"
+ AC_EGREP_CPP([got it], [
+#ifdef __IWMMXT__
+got it
+#endif
+ ], [gdb_cv_arm_iwmmxt=yes],
+ [gdb_cv_arm_iwmmxt=no])
+ CPPFLAGS="$save_CPPFLAGS"])
+ ;;
+esac
+
. ${srcdir}/configure.srv
if test "${srv_mingw}" = "yes"; then
@@ -140,12 +158,27 @@ if test "$srv_linux_thread_db" = "yes"; then
fi
fi
+if test "$srv_xmltarget" != ""; then
+ srv_xmltarget="\$(XML_DIR)/$srv_xmltarget"
+ srv_xmlbuiltin="xml-builtin.o"
+ AC_DEFINE(USE_XML, 1, [Define if an XML target description is available.])
+
+ tmp_xmlfiles=$srv_xmlfiles
+ srv_xmlfiles="target.xml"
+ for f in $tmp_xmlfiles; do
+ srv_xmlfiles="$srv_xmlfiles \$(XML_DIR)/$f"
+ done
+fi
+
GDBSERVER_DEPFILES="$srv_regobj $srv_tgtobj $srv_thread_depfiles"
GDBSERVER_LIBS="$srv_libs"
AC_SUBST(GDBSERVER_DEPFILES)
AC_SUBST(GDBSERVER_LIBS)
AC_SUBST(USE_THREAD_DB)
+AC_SUBST(srv_xmlbuiltin)
+AC_SUBST(srv_xmlfiles)
+AC_SUBST(srv_xmltarget)
AC_OUTPUT(Makefile,
[case x$CONFIG_HEADERS in
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index a1f6971e2c1..2cfb7fcb83e 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -6,6 +6,9 @@
# srv_regobj The register protocol appropriate for this target.
# srv_tgtobj Any other target-specific modules appropriate
# for this target.
+# srv_xmltarget The XML source file to use for target.xml, if any.
+# srv_xmlfiles Any other XML files which should be available for
+# gdbserver in this configuration.
#
# In addition, on GNU/Linux the following shell variables will be set:
# srv_linux_regsets Set to "yes" if ptrace(PTRACE_GETREGS) and friends
@@ -18,10 +21,17 @@
# Input is taken from the "${target}" variable.
case "${target}" in
- arm*-*-linux*) srv_regobj=reg-arm.o
- srv_tgtobj="linux-low.o linux-arm-low.o"
+ arm*-*-linux*) srv_tgtobj="linux-low.o linux-arm-low.o"
srv_linux_usrregs=yes
+ srv_linux_regsets=yes
srv_linux_thread_db=yes
+ if test $gdb_cv_arm_iwmmxt = yes; then
+ srv_regobj=arm-with-iwmmxt.o
+ srv_xmltarget=arm-with-iwmmxt.xml
+ srv_xmlfiles="arm-core.xml xscale-iwmmxt.xml"
+ else
+ srv_regobj=reg-arm.o
+ fi
;;
crisv32-*-linux*) srv_regobj=reg-crisv32.o
srv_tgtobj="linux-low.o linux-crisv32-low.o"
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index 02340938e7d..1267e1d8a00 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -30,6 +30,11 @@
#define PTRACE_GET_THREAD_AREA 22
#endif
+#ifndef PTRACE_GETWMMXREGS
+# define PTRACE_GETWMMXREGS 18
+# define PTRACE_SETWMMXREGS 19
+#endif
+
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
@@ -55,6 +60,60 @@ arm_cannot_fetch_register (int regno)
return (regno >= arm_num_regs);
}
+static void
+arm_fill_gregset (void *buf)
+{
+ int i;
+
+ for (i = 0; i < arm_num_regs; i++)
+ if (arm_regmap[i] != -1)
+ collect_register (i, ((char *) buf) + arm_regmap[i]);
+}
+
+static void
+arm_store_gregset (const void *buf)
+{
+ int i;
+ char zerobuf[8];
+
+ memset (zerobuf, 0, 8);
+ for (i = 0; i < arm_num_regs; i++)
+ if (arm_regmap[i] != -1)
+ supply_register (i, ((char *) buf) + arm_regmap[i]);
+ else
+ supply_register (i, zerobuf);
+}
+
+#ifdef __IWMMXT__
+
+static void
+arm_fill_wmmxregset (void *buf)
+{
+ int i;
+
+ for (i = 0; i < 16; i++)
+ collect_register (arm_num_regs + i, (char *) buf + i * 8);
+
+ /* We only have access to wcssf, wcasf, and wcgr0-wcgr3. */
+ for (i = 0; i < 6; i++)
+ collect_register (arm_num_regs + i + 16, (char *) buf + 16 * 8 + i * 4);
+}
+
+static void
+arm_store_wmmxregset (const void *buf)
+{
+ int i;
+
+ for (i = 0; i < 16; i++)
+ supply_register (arm_num_regs + i, (char *) buf + i * 8);
+
+ /* We only have access to wcssf, wcasf, and wcgr0-wcgr3. */
+ for (i = 0; i < 6; i++)
+ supply_register (arm_num_regs + i + 16, (char *) buf + 16 * 8 + i * 4);
+}
+
+#endif /* __IWMMXT__ */
+
extern int debug_threads;
static CORE_ADDR
@@ -130,6 +189,18 @@ ps_get_thread_area (const struct ps_prochandle *ph,
return PS_OK;
}
+struct regset_info target_regsets[] = {
+ { PTRACE_GETREGS, PTRACE_SETREGS, 18 * 4,
+ GENERAL_REGS,
+ arm_fill_gregset, arm_store_gregset },
+#ifdef __IWMMXT__
+ { PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS, 16 * 8 + 6 * 4,
+ EXTENDED_REGS,
+ arm_fill_wmmxregset, arm_store_wmmxregset },
+#endif
+ { 0, 0, -1, -1, NULL, NULL }
+};
+
struct linux_target_ops the_low_target = {
arm_num_regs,
arm_regmap,
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 20d47c92716..db2bfca8af3 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -193,11 +193,27 @@ handle_general_set (char *own_buf)
}
static const char *
-get_features_xml (void)
+get_features_xml (const char *annex)
{
static int features_supported = -1;
static char *document;
+#ifdef USE_XML
+ extern const char *const xml_builtin[][2];
+ int i;
+
+ /* Look for the annex. */
+ for (i = 0; xml_builtin[i][0] != NULL; i++)
+ if (strcmp (annex, xml_builtin[i][0]) == 0)
+ break;
+
+ if (xml_builtin[i][0] != NULL)
+ return xml_builtin[i][1];
+#endif
+
+ if (strcmp (annex, "target.xml") != 0)
+ return NULL;
+
if (features_supported == -1)
{
const char *arch = (*the_target->arch_string) ();
@@ -311,17 +327,24 @@ handle_query (char *own_buf, int *new_packet_len_p)
const char *document;
char *annex;
- document = get_features_xml ();
+ /* Check for support. */
+ document = get_features_xml ("target.xml");
if (document == NULL)
{
own_buf[0] = '\0';
return;
}
- /* Reject any annex other than target.xml; grab the offset and
- length. */
- if (decode_xfer_read (own_buf + 20, &annex, &ofs, &len) < 0
- || strcmp (annex, "target.xml") != 0)
+ /* Grab the annex, offset, and length. */
+ if (decode_xfer_read (own_buf + 20, &annex, &ofs, &len) < 0)
+ {
+ strcpy (own_buf, "E00");
+ return;
+ }
+
+ /* Now grab the correct annex. */
+ document = get_features_xml (annex);
+ if (document == NULL)
{
strcpy (own_buf, "E00");
return;
@@ -352,7 +375,7 @@ handle_query (char *own_buf, int *new_packet_len_p)
if (the_target->read_auxv != NULL)
strcat (own_buf, ";qXfer:auxv:read+");
- if (get_features_xml () != NULL)
+ if (get_features_xml ("target.xml") != NULL)
strcat (own_buf, ";qXfer:features:read+");
return;