Browse Source
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.drow-reverse-20070409-branch
20 changed files with 698 additions and 10 deletions
@ -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 |
|||
@ -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> |
|||
@ -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 < 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> |
|||
@ -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 < $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> |
|||
@ -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> |
|||
@ -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> |
|||
@ -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 |
|||
@ -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; |
|||
} |
|||
@ -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" |
|||
} |
|||
Loading…
Reference in new issue