* features/Makefile, features/arm-with-iwmmxt.xml,
authorDaniel Jacobowitz <drow@false.org>
Thu, 8 Feb 2007 21:39:04 +0000 (21:39 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 8 Feb 2007 21:39:04 +0000 (21:39 +0000)
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.

20 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/features/Makefile [new file with mode: 0644]
gdb/features/arm-with-iwmmxt.xml [new file with mode: 0644]
gdb/features/gdbserver-regs.xsl [new file with mode: 0644]
gdb/features/number-regs.xsl [new file with mode: 0644]
gdb/features/sort-regs.xsl [new file with mode: 0644]
gdb/features/xscale-iwmmxt.xml [new file with mode: 0644]
gdb/gdbserver/ChangeLog
gdb/gdbserver/Makefile.in
gdb/gdbserver/config.in
gdb/gdbserver/configure
gdb/gdbserver/configure.ac
gdb/gdbserver/configure.srv
gdb/gdbserver/linux-arm-low.c
gdb/gdbserver/server.c
gdb/regformats/arm-with-iwmmxt.dat [new file with mode: 0644]
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/iwmmxt-regs.c [new file with mode: 0644]
gdb/testsuite/gdb.arch/iwmmxt-regs.exp [new file with mode: 0644]

index de6f607..6ec59a4 100644 (file)
@@ -1,5 +1,13 @@
 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.
index 864f4d0..b81b3b6 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -22,6 +22,9 @@ a local file or over the remote serial protocol.
 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
diff --git a/gdb/features/Makefile b/gdb/features/Makefile
new file mode 100644 (file)
index 0000000..3442f8b
--- /dev/null
@@ -0,0 +1,49 @@
+# 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
diff --git a/gdb/features/arm-with-iwmmxt.xml b/gdb/features/arm-with-iwmmxt.xml
new file mode 100644 (file)
index 0000000..924b54c
--- /dev/null
@@ -0,0 +1,13 @@
+<?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>
diff --git a/gdb/features/gdbserver-regs.xsl b/gdb/features/gdbserver-regs.xsl
new file mode 100644 (file)
index 0000000..a1e8607
--- /dev/null
@@ -0,0 +1,47 @@
+<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 &lt; 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 &lt; $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>
diff --git a/gdb/features/number-regs.xsl b/gdb/features/number-regs.xsl
new file mode 100644 (file)
index 0000000..ab5d604
--- /dev/null
@@ -0,0 +1,47 @@
+<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 &lt; $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>
diff --git a/gdb/features/sort-regs.xsl b/gdb/features/sort-regs.xsl
new file mode 100644 (file)
index 0000000..c89fcce
--- /dev/null
@@ -0,0 +1,11 @@
+<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>
diff --git a/gdb/features/xscale-iwmmxt.xml b/gdb/features/xscale-iwmmxt.xml
new file mode 100644 (file)
index 0000000..46fbf41
--- /dev/null
@@ -0,0 +1,44 @@
+<?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>
index 60728cd..939d65e 100644 (file)
@@ -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.
index d708958..279ae3f 100644 (file)
@@ -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
index 16d013d..2b20b74 100644 (file)
    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
index 0aec983..52fdd3d 100755 (executable)
@@ -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
index ef4a423..c369067 100644 (file)
@@ -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
index a1f6971..2cfb7fc 100644 (file)
@@ -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
 # 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"
index 0234093..1267e1d 100644 (file)
 #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,
index 20d47c9..db2bfca 100644 (file)
@@ -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;
diff --git a/gdb/regformats/arm-with-iwmmxt.dat b/gdb/regformats/arm-with-iwmmxt.dat
new file mode 100644 (file)
index 0000000..9bfd4cc
--- /dev/null
@@ -0,0 +1,51 @@
+# 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
index affd9a0..1d5cbb8 100644 (file)
@@ -1,5 +1,9 @@
 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>
diff --git a/gdb/testsuite/gdb.arch/iwmmxt-regs.c b/gdb/testsuite/gdb.arch/iwmmxt-regs.c
new file mode 100644 (file)
index 0000000..9c30570
--- /dev/null
@@ -0,0 +1,88 @@
+/* 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;
+}
diff --git a/gdb/testsuite/gdb.arch/iwmmxt-regs.exp b/gdb/testsuite/gdb.arch/iwmmxt-regs.exp
new file mode 100644 (file)
index 0000000..c040157
--- /dev/null
@@ -0,0 +1,78 @@
+# 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"
+}