This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] ARM iWMMXt support for gdbserver


As mentioned in my last message, this patch adds iWMMXt coprocessor
support to gdbserver.  It does several things:

  - Adds XSLT stylesheets which convert the XML register description
    language to gdbserver's data file format.  I plan to keep the
    generated files checked in since xsltproc would be a silly new
    build dependency.

    This is a kind of silly use of XSLT and I do not claim to be proud
    of my XSLT skills.  It works well though.

  - Adds support for compiled-in XML files to gdbserver.

  - Adds PTRACE_GETWMMXREGS support to ARM gdbserver.

I've tested this on arm-none-linux-gnueabi - with iWMMXt support,
obviously.  It works as well as vanilla arm-none-linux-gnueabi,
and the new register-specific tests pass.  I'll plan to apply this
after the preceeding patch, which is the keystone of this series.


I have one question.  Obviously this only works if you compile GDB with
Expat support (GDB does appropriate checks to ensure that you get a
warning if you lose some functionality because you compiled without
Expat).  Does anyone think it would be a bad choice to treat native
arm-linux GDB differently than an arm-linux cross GDB talking to this
new gdbserver?

I ask because I have a patch which adds support for these same
registers to arm-linux-nat.c.  It works the same way - it doesn't
define a new arm_linux_register_type, but instead it offers a compiled
in XML description.  This saved me having to duplicate the information
in yet another place.  I think that's an advantage, since it makes
things much easier - especially when I get to VFP v2 versus VFP v3,
which are about the same for GDB's purposes except that v3 has twice as
many double precision registers.

I'd like to do it via XML and impose the expat recommendation on GDB
users on that platform, and other similar platforms.  You'll lose some
functionality without expat (GDB will warn you and ignore some
registers).

If that's unacceptable, I can work around it the same way I handled
gdbserver regformats files, by an excessively clever XSLT stylesheet.
But that one would require yet more support code in GDB and I don't
really want to have three ways to do this.

-- 
Daniel Jacobowitz
CodeSourcery

2007-01-29  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.

	* 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.

---
 gdb/NEWS                               |    3 +
 gdb/features/Makefile                  |   49 ++++++++++++++++++
 gdb/features/arm-with-iwmmxt.xml       |   13 ++++
 gdb/features/gdbserver-regs.xsl        |   47 +++++++++++++++++
 gdb/features/number-regs.xsl           |   47 +++++++++++++++++
 gdb/features/sort-regs.xsl             |   11 ++++
 gdb/features/xscale-iwmmxt.xml         |   44 ++++++++++++++++
 gdb/gdbserver/Makefile.in              |   25 +++++++++
 gdb/gdbserver/config.in                |    3 +
 gdb/gdbserver/configure                |   63 +++++++++++++++++++++++
 gdb/gdbserver/configure.ac             |   33 ++++++++++++
 gdb/gdbserver/configure.srv            |   14 ++++-
 gdb/gdbserver/linux-arm-low.c          |   71 ++++++++++++++++++++++++++
 gdb/gdbserver/server.c                 |   37 +++++++++++--
 gdb/regformats/arm-with-iwmmxt.dat     |   51 +++++++++++++++++++
 gdb/testsuite/gdb.arch/iwmmxt-regs.c   |   88 +++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.arch/iwmmxt-regs.exp |   78 +++++++++++++++++++++++++++++
 17 files changed, 667 insertions(+), 10 deletions(-)

Index: src/gdb/features/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/Makefile	2007-01-29 16:07:35.000000000 -0500
@@ -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
Index: src/gdb/features/arm-with-iwmmxt.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/arm-with-iwmmxt.xml	2007-01-29 16:07:35.000000000 -0500
@@ -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>
Index: src/gdb/features/gdbserver-regs.xsl
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/gdbserver-regs.xsl	2007-01-29 16:07:35.000000000 -0500
@@ -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>
Index: src/gdb/features/number-regs.xsl
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/number-regs.xsl	2007-01-29 16:07:35.000000000 -0500
@@ -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>
Index: src/gdb/features/sort-regs.xsl
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/sort-regs.xsl	2007-01-29 16:07:35.000000000 -0500
@@ -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>
Index: src/gdb/features/xscale-iwmmxt.xml
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/features/xscale-iwmmxt.xml	2007-01-29 16:07:35.000000000 -0500
@@ -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: src/gdb/testsuite/gdb.arch/iwmmxt-regs.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/testsuite/gdb.arch/iwmmxt-regs.c	2007-01-29 16:07:35.000000000 -0500
@@ -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;
+}
Index: src/gdb/testsuite/gdb.arch/iwmmxt-regs.exp
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/testsuite/gdb.arch/iwmmxt-regs.exp	2007-01-29 16:07:35.000000000 -0500
@@ -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"
+}
Index: src/gdb/regformats/arm-with-iwmmxt.dat
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ src/gdb/regformats/arm-with-iwmmxt.dat	2007-01-29 16:07:35.000000000 -0500
@@ -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: src/gdb/gdbserver/Makefile.in
===================================================================
--- src.orig/gdb/gdbserver/Makefile.in	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/Makefile.in	2007-01-29 16:07:35.000000000 -0500
@@ -137,10 +137,17 @@ TAGFILES = $(SOURCES) ${HFILES} ${ALLPAR
 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
 	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: src/gdb/gdbserver/config.in
===================================================================
--- src.orig/gdb/gdbserver/config.in	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/config.in	2007-01-29 16:07:35.000000000 -0500
@@ -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
Index: src/gdb/gdbserver/configure
===================================================================
--- src.orig/gdb/gdbserver/configure	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/configure	2007-01-29 16:07:35.000000000 -0500
@@ -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: src/gdb/gdbserver/configure.ac
===================================================================
--- src.orig/gdb/gdbserver/configure.ac	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/configure.ac	2007-01-29 16:07:35.000000000 -0500
@@ -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"; 
   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: src/gdb/gdbserver/configure.srv
===================================================================
--- src.orig/gdb/gdbserver/configure.srv	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/configure.srv	2007-01-29 16:07:35.000000000 -0500
@@ -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"
Index: src/gdb/gdbserver/linux-arm-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-arm-low.c	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/linux-arm-low.c	2007-01-29 16:07:35.000000000 -0500
@@ -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_proc
   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: src/gdb/gdbserver/server.c
===================================================================
--- src.orig/gdb/gdbserver/server.c	2007-01-29 15:43:18.000000000 -0500
+++ src/gdb/gdbserver/server.c	2007-01-29 16:13:27.000000000 -0500
@@ -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_pa
       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_pa
       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;
Index: src/gdb/NEWS
===================================================================
--- src.orig/gdb/NEWS	2007-01-29 17:10:43.000000000 -0500
+++ src/gdb/NEWS	2007-01-29 17:11:21.000000000 -0500
@@ -22,6 +22,9 @@ a local file or over the remote serial p
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]