* 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.
This commit is contained in:
Daniel Jacobowitz 2007-02-08 21:39:04 +00:00
parent f3cd89f49b
commit fb1e4ffce3
20 changed files with 698 additions and 10 deletions

View File

@ -1,3 +1,11 @@
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)

View File

@ -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

49
gdb/features/Makefile Normal file
View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

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

View 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

View File

@ -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

View File

@ -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

View 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

View 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
@ -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"

View File

@ -30,6 +30,11 @@
#define PTRACE_GET_THREAD_AREA 22
#endif
#ifndef PTRACE_GETWMMXREGS
# define PTRACE_GETWMMXREGS 18
# define PTRACE_SETWMMXREGS 19
#endif
#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
@ -55,6 +60,60 @@ arm_cannot_fetch_register (int regno)
return (regno >= arm_num_regs);
}
static void
arm_fill_gregset (void *buf)
{
int i;
for (i = 0; i < arm_num_regs; i++)
if (arm_regmap[i] != -1)
collect_register (i, ((char *) buf) + arm_regmap[i]);
}
static void
arm_store_gregset (const void *buf)
{
int i;
char zerobuf[8];
memset (zerobuf, 0, 8);
for (i = 0; i < arm_num_regs; i++)
if (arm_regmap[i] != -1)
supply_register (i, ((char *) buf) + arm_regmap[i]);
else
supply_register (i, zerobuf);
}
#ifdef __IWMMXT__
static void
arm_fill_wmmxregset (void *buf)
{
int i;
for (i = 0; i < 16; i++)
collect_register (arm_num_regs + i, (char *) buf + i * 8);
/* We only have access to wcssf, wcasf, and wcgr0-wcgr3. */
for (i = 0; i < 6; i++)
collect_register (arm_num_regs + i + 16, (char *) buf + 16 * 8 + i * 4);
}
static void
arm_store_wmmxregset (const void *buf)
{
int i;
for (i = 0; i < 16; i++)
supply_register (arm_num_regs + i, (char *) buf + i * 8);
/* We only have access to wcssf, wcasf, and wcgr0-wcgr3. */
for (i = 0; i < 6; i++)
supply_register (arm_num_regs + i + 16, (char *) buf + 16 * 8 + i * 4);
}
#endif /* __IWMMXT__ */
extern int debug_threads;
static CORE_ADDR
@ -130,6 +189,18 @@ ps_get_thread_area (const struct ps_prochandle *ph,
return PS_OK;
}
struct regset_info target_regsets[] = {
{ PTRACE_GETREGS, PTRACE_SETREGS, 18 * 4,
GENERAL_REGS,
arm_fill_gregset, arm_store_gregset },
#ifdef __IWMMXT__
{ PTRACE_GETWMMXREGS, PTRACE_SETWMMXREGS, 16 * 8 + 6 * 4,
EXTENDED_REGS,
arm_fill_wmmxregset, arm_store_wmmxregset },
#endif
{ 0, 0, -1, -1, NULL, NULL }
};
struct linux_target_ops the_low_target = {
arm_num_regs,
arm_regmap,

View 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;

View File

@ -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

View File

@ -1,3 +1,7 @@
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.

View File

@ -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;
}

View File

@ -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"
}