2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
+ * 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.
+
+2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
+
* Makefile.in (arm-tdep.o, eval.o, target-descriptions.o)
(xml-tdesc.o): Update.
* xml-support.c: Add a comment.
for architectures which have implemented the support (currently
only ARM).
+* The GDB remote stub, gdbserver, now supports the XScale iWMMXt
+coprocessor.
+
* New commands
set mem inaccessible-by-default
--- /dev/null
+# Copyright (C) 2007 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# This file requires GNU make!
+
+# This Makefile updates files in ../regformats from their XML master
+# copies. Because this relies on xsltproc, it is not normally run
+# during the build process; it should be run by hand when one of the
+# affected XML files is changed, and the results should be kept in the
+# GDB repository.
+
+WHICH = arm-with-iwmmxt
+
+# Record which registers should be sent to GDB by default after stop.
+arm-with-iwmmxt-expedite = r11,sp,pc
+
+XSLTPROC = xsltproc
+outdir = ../regformats
+OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH))
+
+all: $(OUTPUTS)
+
+$(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
+ echo "# DO NOT EDIT: generated from $<" > $(outdir)/$*.tmp
+ echo "name:`echo $* | sed 's/-/_/g'`" >> $(outdir)/$*.tmp
+ echo "expedite:$($*-expedite)" >> $(outdir)/$*.tmp
+ $(XSLTPROC) --xinclude number-regs.xsl $< | \
+ $(XSLTPROC) sort-regs.xsl - | \
+ $(XSLTPROC) gdbserver-regs.xsl - >> $(outdir)/$*.tmp
+ sh ../../move-if-change $(outdir)/$*.tmp $(outdir)/$*.dat
+
+# Other dependencies.
+$(outdir)/arm-with-iwmmxt.dat: arm-core.xml xscale-iwmmxt.xml
--- /dev/null
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved. -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+ <architecture>iwmmxt</architecture>
+ <xi:include href="arm-core.xml"/>
+ <xi:include href="xscale-iwmmxt.xml"/>
+</target>
--- /dev/null
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="text"/>
+
+ <xsl:variable name="total" select="count(//reg)"/>
+
+ <xsl:template name="pad">
+ <xsl:param name="count" select="0"/>
+ <xsl:text>0:
+</xsl:text>
+ <xsl:if test="$count > 1">
+ <xsl:call-template name="pad">
+ <xsl:with-param name="count" select="$count - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="reg">
+ <xsl:param name="which" select="1"/>
+ <xsl:param name="nextnum" select="0"/>
+ <xsl:variable name="thisnum" select="@regnum"/>
+ <xsl:if test="$nextnum < number(@regnum)">
+ <xsl:call-template name="pad">
+ <xsl:with-param name="count" select="@regnum - $nextnum"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:value-of select="@bitsize"/>
+ <xsl:text>:</xsl:text>
+ <xsl:value-of select="@name"/>
+ <xsl:text>
+</xsl:text>
+ <xsl:if test="$which < $total">
+ <xsl:for-each select="/descendant::reg[$which + 1]">
+ <xsl:call-template name="reg">
+ <xsl:with-param name="which" select="$which + 1"/>
+ <xsl:with-param name="nextnum" select="$thisnum + 1"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="/">
+ <xsl:for-each select="/descendant::reg[1]">
+ <xsl:call-template name="reg"/>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:variable name="total" select="count(//reg)"/>
+ <xsl:template name="reg">
+ <xsl:param name="which" select="1"/>
+ <xsl:param name="nextnum" select="0"/>
+ <xsl:variable name="thisnum" select="@regnum"/>
+ <xsl:element name="reg">
+ <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:attribute name="bitsize"><xsl:value-of select="@bitsize"/></xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="not(@regnum)">
+ <xsl:attribute name="regnum"><xsl:value-of select="$nextnum"/></xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="regnum"><xsl:value-of select="@regnum"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ <xsl:if test="$which < $total">
+ <xsl:for-each select="/descendant::reg[$which + 1]">
+ <xsl:choose>
+ <xsl:when test="not($thisnum)">
+ <xsl:call-template name="reg">
+ <xsl:with-param name="which" select="$which + 1"/>
+ <xsl:with-param name="nextnum" select="$nextnum + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="reg">
+ <xsl:with-param name="which" select="$which + 1"/>
+ <xsl:with-param name="nextnum" select="$thisnum + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="/">
+ <target>
+ <xsl:for-each select="/descendant::reg[1]">
+ <xsl:call-template name="reg"/>
+ </xsl:for-each>
+ </target>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:template match="/">
+ <target>
+ <xsl:for-each select="//reg">
+ <xsl:sort select="regnum" data-type="number"/>
+ <xsl:copy-of select="."/>
+ </xsl:for-each>
+ </target>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+ are permitted in any medium without royalty provided the copyright
+ notice and this notice are preserved. -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.xscale.iwmmxt">
+ <vector id="iwmmxt_v8u8" type="uint8" count="8"/>
+ <vector id="iwmmxt_v4u16" type="uint16" count="4"/>
+ <vector id="iwmmxt_v2u32" type="uint32" count="2"/>
+ <union id="iwmmxt_vec64i">
+ <field name="u8" type="iwmmxt_v8u8"/>
+ <field name="u16" type="iwmmxt_v4u16"/>
+ <field name="u32" type="iwmmxt_v2u32"/>
+ <field name="u64" type="uint64"/>
+ </union>
+
+ <reg name="wr0" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr1" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr2" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr3" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr4" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr5" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr6" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr7" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr8" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr9" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr10" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr11" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr12" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr13" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr14" bitsize="64" type="iwmmxt_vec64i"/>
+ <reg name="wr15" bitsize="64" type="iwmmxt_vec64i"/>
+
+ <reg name="wcssf" bitsize="32" type="int" group="vector"/>
+ <reg name="wcasf" bitsize="32" type="int" group="vector"/>
+
+ <reg name="wcgr0" bitsize="32" type="int" group="vector"/>
+ <reg name="wcgr1" bitsize="32" type="int" group="vector"/>
+ <reg name="wcgr2" bitsize="32" type="int" group="vector"/>
+ <reg name="wcgr3" bitsize="32" type="int" group="vector"/>
+</feature>
+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.
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:
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
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)
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
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
# 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.
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
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"
+
+
+
ac_config_files="$ac_config_files Makefile"
ac_config_commands="$ac_config_commands default"
cat >confcache <<\_ACEOF
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
[#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
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
# 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
# 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"
#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
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
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,
}
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) ();
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;
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;
--- /dev/null
+# DO NOT EDIT: generated from arm-with-iwmmxt.xml
+name:arm_with_iwmmxt
+expedite:r11,sp,pc
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:sp
+32:lr
+32:pc
+0:
+0:
+0:
+0:
+0:
+0:
+0:
+0:
+0:
+32:cpsr
+64:wr0
+64:wr1
+64:wr2
+64:wr3
+64:wr4
+64:wr5
+64:wr6
+64:wr7
+64:wr8
+64:wr9
+64:wr10
+64:wr11
+64:wr12
+64:wr13
+64:wr14
+64:wr15
+32:wcssf
+32:wcasf
+32:wcgr0
+32:wcgr1
+32:wcgr2
+32:wcgr3
2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
+ * gdb.arch/iwmmxt-regs.c, gdb.arch/iwmmxt-regs.exp: New.
+
+2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
+
* tdesc-arch.exp (set_arch): Add KFAIL for missing OS ABI handlers.
2007-02-08 Daniel Jacobowitz <dan@codesourcery.com>
--- /dev/null
+/* Register test program.
+
+ Copyright 2007 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. */
+
+void
+read_regs (unsigned long long regs[16], unsigned long control_regs[6])
+{
+ asm volatile ("wstrd wr0, %0" : "=m" (regs[0]));
+ asm volatile ("wstrd wr1, %0" : "=m" (regs[1]));
+ asm volatile ("wstrd wr2, %0" : "=m" (regs[2]));
+ asm volatile ("wstrd wr3, %0" : "=m" (regs[3]));
+ asm volatile ("wstrd wr4, %0" : "=m" (regs[4]));
+ asm volatile ("wstrd wr5, %0" : "=m" (regs[5]));
+ asm volatile ("wstrd wr6, %0" : "=m" (regs[6]));
+ asm volatile ("wstrd wr7, %0" : "=m" (regs[7]));
+ asm volatile ("wstrd wr8, %0" : "=m" (regs[8]));
+ asm volatile ("wstrd wr9, %0" : "=m" (regs[9]));
+ asm volatile ("wstrd wr10, %0" : "=m" (regs[10]));
+ asm volatile ("wstrd wr11, %0" : "=m" (regs[11]));
+ asm volatile ("wstrd wr12, %0" : "=m" (regs[12]));
+ asm volatile ("wstrd wr13, %0" : "=m" (regs[13]));
+ asm volatile ("wstrd wr14, %0" : "=m" (regs[14]));
+ asm volatile ("wstrd wr15, %0" : "=m" (regs[15]));
+
+ asm volatile ("wstrw wcssf, %0" : "=m" (control_regs[0]));
+ asm volatile ("wstrw wcasf, %0" : "=m" (control_regs[1]));
+ asm volatile ("wstrw wcgr0, %0" : "=m" (control_regs[2]));
+ asm volatile ("wstrw wcgr1, %0" : "=m" (control_regs[3]));
+ asm volatile ("wstrw wcgr2, %0" : "=m" (control_regs[4]));
+ asm volatile ("wstrw wcgr3, %0" : "=m" (control_regs[5]));
+}
+
+void
+write_regs (unsigned long long regs[16], unsigned long control_regs[6])
+{
+ asm volatile ("wldrd wr0, %0" : : "m" (regs[0]));
+ asm volatile ("wldrd wr1, %0" : : "m" (regs[1]));
+ asm volatile ("wldrd wr2, %0" : : "m" (regs[2]));
+ asm volatile ("wldrd wr3, %0" : : "m" (regs[3]));
+ asm volatile ("wldrd wr4, %0" : : "m" (regs[4]));
+ asm volatile ("wldrd wr5, %0" : : "m" (regs[5]));
+ asm volatile ("wldrd wr6, %0" : : "m" (regs[6]));
+ asm volatile ("wldrd wr7, %0" : : "m" (regs[7]));
+ asm volatile ("wldrd wr8, %0" : : "m" (regs[8]));
+ asm volatile ("wldrd wr9, %0" : : "m" (regs[9]));
+ asm volatile ("wldrd wr10, %0" : : "m" (regs[10]));
+ asm volatile ("wldrd wr11, %0" : : "m" (regs[11]));
+ asm volatile ("wldrd wr12, %0" : : "m" (regs[12]));
+ asm volatile ("wldrd wr13, %0" : : "m" (regs[13]));
+ asm volatile ("wldrd wr14, %0" : : "m" (regs[14]));
+ asm volatile ("wldrd wr15, %0" : : "m" (regs[15]));
+
+ asm volatile ("wldrw wcssf, %0" : : "m" (control_regs[0]));
+ asm volatile ("wldrw wcasf, %0" : : "m" (control_regs[1]));
+ asm volatile ("wldrw wcgr0, %0" : : "m" (control_regs[2]));
+ asm volatile ("wldrw wcgr1, %0" : : "m" (control_regs[3]));
+ asm volatile ("wldrw wcgr2, %0" : : "m" (control_regs[4]));
+ asm volatile ("wldrw wcgr3, %0" : : "m" (control_regs[5]));
+}
+
+int
+main ()
+{
+ unsigned long long regs[16];
+ unsigned long control_regs[6];
+
+ read_regs (regs, control_regs);
+ write_regs (regs, control_regs);
+
+ return 0;
+}
--- /dev/null
+# Copyright 2007 Free Software Foundation, Inc.
+#
+# 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.
+#
+
+# Tests for ARM iWMMXt register setting and fetching.
+
+if ![istarget "arm*-*-*"] then {
+ verbose "Skipping iWMMXt register tests."
+ return
+}
+
+set testfile "iwmmxt-regs"
+set binfile ${objdir}/${subdir}/${testfile}
+set src1 ${srcdir}/${subdir}/${testfile}.c
+
+# Try to compile the test case. If we can't, assume this is not an
+# iWMMXt toolchain and bail out.
+if { [gdb_compile ${src1} ${binfile} executable {quiet debug}] != "" } {
+ verbose "Skipping iWMMXt register tests."
+ return
+}
+
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+#
+# Run to `main' where we begin our tests.
+#
+
+if ![runto_main] then {
+ gdb_suppress_tests
+}
+
+# Set all the registers to arbitrary values.
+for {set i 0} {$i < 16} {incr i 1} {
+ gdb_test "set \$wr$i.u64 = ((${i}LL << 32) | ${i})" "" "set reg wr$i"
+}
+gdb_test "set \$wcssf = 300" "" "set reg wcssf"
+gdb_test "set \$wcasf = 200" "" "set reg wcasf"
+for {set i 0} {$i < 4} {incr i 1} {
+ gdb_test "set \$wcgr$i = 100 + $i" "" "set reg wcgr$i"
+}
+
+# See if the sets stuck.
+gdb_test "next" ".*write_regs.*" "next over read_regs"
+
+for {set i 0} {$i < 16} {incr i 1} {
+ gdb_test "p \$wr$i.u64 == ((${i}LL << 32) | ${i})" "\\\$$decimal = 1" "test reg wr$i"
+}
+# Don't test wcssf.
+gdb_test "p \$wcasf" "\\\$$decimal = 200" "test reg wcasf"
+for {set i 0} {$i < 4} {incr i 1} {
+ gdb_test "p \$wcgr$i == 100 + $i" "\\\$$decimal = 1" "test reg wcgr$i"
+}
+
+# Also verify the copies read by the target.
+for {set i 0} {$i < 16} {incr i 1} {
+ gdb_test "p regs\[$i\] == ((${i}LL << 32) | ${i})" "\\\$$decimal = 1" "test stored wr$i"
+}
+# Don't test wcssf.
+gdb_test "p control_regs\[1\]" "\\\$$decimal = 200" "test stored wcasf"
+for {set i 0} {$i < 4} {incr i 1} {
+ gdb_test "p control_regs\[$i + 2\] == 100 + $i" "\\\$$decimal = 1" "test stored wcgr$i"
+}