diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-02-08 21:39:04 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-02-08 21:39:04 +0000 |
commit | fb1e4ffce36db7b63b85bc3a64917bda0c8ac84b (patch) | |
tree | fa96d864ea40641c4172c0b4becebddf54f02806 /gdb/gdbserver | |
parent | f3cd89f49b5b3ac6dbf0b462e8643bc5d22aa04e (diff) | |
download | gdb-fb1e4ffce36db7b63b85bc3a64917bda0c8ac84b.zip gdb-fb1e4ffce36db7b63b85bc3a64917bda0c8ac84b.tar.gz gdb-fb1e4ffce36db7b63b85bc3a64917bda0c8ac84b.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 19 | ||||
-rw-r--r-- | gdb/gdbserver/Makefile.in | 25 | ||||
-rw-r--r-- | gdb/gdbserver/config.in | 3 | ||||
-rwxr-xr-x | gdb/gdbserver/configure | 63 | ||||
-rw-r--r-- | gdb/gdbserver/configure.ac | 33 | ||||
-rw-r--r-- | gdb/gdbserver/configure.srv | 14 | ||||
-rw-r--r-- | gdb/gdbserver/linux-arm-low.c | 71 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 37 |
8 files changed, 255 insertions, 10 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 60728cd..939d65e 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -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. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index d708958..279ae3f 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 16d013d..2b20b74 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 0aec983..52fdd3d 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -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 diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index ef4a423..c369067 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -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 diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index a1f6971..2cfb7fc 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 0234093..1267e1d 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 <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, diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 20d47c9..db2bfca 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; |