From fb1e4ffce36db7b63b85bc3a64917bda0c8ac84b Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Thu, 8 Feb 2007 21:39:04 +0000 Subject: [PATCH] * 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/ChangeLog | 8 +++ 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/ChangeLog | 19 ++++++ 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/ChangeLog | 4 ++ gdb/testsuite/gdb.arch/iwmmxt-regs.c | 88 ++++++++++++++++++++++++++ gdb/testsuite/gdb.arch/iwmmxt-regs.exp | 78 +++++++++++++++++++++++ 20 files changed, 698 insertions(+), 10 deletions(-) create mode 100644 gdb/features/Makefile create mode 100644 gdb/features/arm-with-iwmmxt.xml create mode 100644 gdb/features/gdbserver-regs.xsl create mode 100644 gdb/features/number-regs.xsl create mode 100644 gdb/features/sort-regs.xsl create mode 100644 gdb/features/xscale-iwmmxt.xml create mode 100644 gdb/regformats/arm-with-iwmmxt.dat create mode 100644 gdb/testsuite/gdb.arch/iwmmxt-regs.c create mode 100644 gdb/testsuite/gdb.arch/iwmmxt-regs.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index de6f607024e..6ec59a485fd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2007-02-08 Daniel Jacobowitz + + * 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 * Makefile.in (arm-tdep.o, eval.o, target-descriptions.o) diff --git a/gdb/NEWS b/gdb/NEWS index 864f4d0c607..b81b3b69de4 100644 --- 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 index 00000000000..3442f8b602e --- /dev/null +++ b/gdb/features/Makefile @@ -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 index 00000000000..924b54c37b7 --- /dev/null +++ b/gdb/features/arm-with-iwmmxt.xml @@ -0,0 +1,13 @@ + + + + + + iwmmxt + + + diff --git a/gdb/features/gdbserver-regs.xsl b/gdb/features/gdbserver-regs.xsl new file mode 100644 index 00000000000..a1e86073edf --- /dev/null +++ b/gdb/features/gdbserver-regs.xsl @@ -0,0 +1,47 @@ + + + + + + + + 0: + + + + + + + + + + + + + + + + + + + : + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/number-regs.xsl b/gdb/features/number-regs.xsl new file mode 100644 index 00000000000..ab5d6040861 --- /dev/null +++ b/gdb/features/number-regs.xsl @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/features/sort-regs.xsl b/gdb/features/sort-regs.xsl new file mode 100644 index 00000000000..c89fcce6924 --- /dev/null +++ b/gdb/features/sort-regs.xsl @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/gdb/features/xscale-iwmmxt.xml b/gdb/features/xscale-iwmmxt.xml new file mode 100644 index 00000000000..46fbf4148b0 --- /dev/null +++ b/gdb/features/xscale-iwmmxt.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 60728cd61de..939d65ebdd8 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,22 @@ +2007-02-08 Daniel Jacobowitz + + * 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 * remote-utils.c [USE_WIN32API] (read, write): Define. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index d708958ab03..279ae3f7743 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -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 diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index 16d013d48f2..2b20b747f70 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -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 diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index 0aec9831788..52fdd3d559e 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -309,7 +309,7 @@ ac_includes_default="\ # include #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 diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index ef4a423750a..c3690674c38 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -48,6 +48,24 @@ AC_CHECK_TYPES(socklen_t, [], [], [#include #include ]) + +# 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 diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index a1f6971e2c1..2cfb7fcb83e 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -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" diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c index 02340938e7d..1267e1d8a00 100644 --- a/gdb/gdbserver/linux-arm-low.c +++ b/gdb/gdbserver/linux-arm-low.c @@ -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 #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, diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 20d47c92716..db2bfca8af3 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -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 index 00000000000..9bfd4cc868c --- /dev/null +++ b/gdb/regformats/arm-with-iwmmxt.dat @@ -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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index affd9a03dc7..1d5cbb8d381 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-02-08 Daniel Jacobowitz + + * gdb.arch/iwmmxt-regs.c, gdb.arch/iwmmxt-regs.exp: New. + 2007-02-08 Daniel Jacobowitz * tdesc-arch.exp (set_arch): Add KFAIL for missing OS ABI handlers. diff --git a/gdb/testsuite/gdb.arch/iwmmxt-regs.c b/gdb/testsuite/gdb.arch/iwmmxt-regs.c new file mode 100644 index 00000000000..9c305700d38 --- /dev/null +++ b/gdb/testsuite/gdb.arch/iwmmxt-regs.c @@ -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 index 00000000000..c04015706e4 --- /dev/null +++ b/gdb/testsuite/gdb.arch/iwmmxt-regs.exp @@ -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" +} -- 2.30.2