From cdf436294f7e0e3bd7668a81dfd5922fdd1aec14 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Fri, 28 Nov 2014 09:18:26 +0800 Subject: Detect 64-bit-ness in PowerPC Book III-E This patch is to teach both GDB and GDBServer to detect 64-bit inferior correctly. We find a problem that GDBServer is unable to detect on a e5500 core processor. Current GDBServer assumes that MSR is a 64-bit register, but MSR is a 32-bit register in Book III-E. This patch is to fix this problem by checking the right bit in MSR, in order to handle both Book III-S and Book III-E. In order to detect Book III-S and Book III-E, we check the PPC_FEATURE_BOOKE from the host's HWCAP (by getauxval on glibc >= 2.16. If getauxval doesn't exist, we implement the fallback by parsing /proc/self/auxv), because it should an invariant on the same machine cross different processes. In order to share code, I add nat/ppc-linux.c for both GDB and GDBserver side. gdb: 2015-01-14 Yao Qi * Makefile.in (ppc-linux.o): New rule. * config/powerpc/ppc64-linux.mh (NATDEPFILES): Add ppc-linux.o. * configure.ac: AC_CHECK_FUNCS(getauxval). * config.in: Re-generated. * configure: Re-generated. * nat/ppc-linux.h [__powerpc64__] (ppc64_64bit_inferior_p): Declare. * nat/ppc-linux.c: New file. * ppc-linux-nat.c (ppc_linux_target_wordsize) [__powerpc64__]: Call ppc64_64bit_inferior_p. gdb/gdbserver: 2015-01-14 Yao Qi * Makefile.in (SFILES): Add nat/ppc-linux.c. (ppc-linux.o): New rule. * configure.srv (powerpc*-*-linux*): Add ppc-linux.o. * configure.ac: AC_CHECK_FUNCS(getauxval). * config.in: Re-generated. * configure: Re-generated. * linux-ppc-low.c (ppc_arch_setup) [__powerpc64__]: Call ppc64_64bit_inferior_p --- gdb/gdbserver/ChangeLog | 11 +++++++++++ gdb/gdbserver/Makefile.in | 5 ++++- gdb/gdbserver/config.in | 3 +++ gdb/gdbserver/configure | 2 +- gdb/gdbserver/configure.ac | 2 +- gdb/gdbserver/configure.srv | 2 +- gdb/gdbserver/linux-ppc-low.c | 4 +--- 7 files changed, 22 insertions(+), 7 deletions(-) (limited to 'gdb/gdbserver') diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 2b844a0..f762daf 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,16 @@ 2015-01-14 Yao Qi + * Makefile.in (SFILES): Add nat/ppc-linux.c. + (ppc-linux.o): New rule. + * configure.srv (powerpc*-*-linux*): Add ppc-linux.o. + * configure.ac: AC_CHECK_FUNCS(getauxval). + * config.in: Re-generated. + * configure: Re-generated. + * linux-ppc-low.c (ppc_arch_setup) [__powerpc64__]: Call + ppc64_64bit_inferior_p + +2015-01-14 Yao Qi + * linux-ppc-low.c: Include "nat/ppc-linux.h". (PPC_FEATURE_HAS_VSX): Move to nat/ppc-linux.h. (PPC_FEATURE_HAS_ALTIVEC, PPC_FEATURE_HAS_SPE): Likewise. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 1ed2ec8..0e442fc 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -155,7 +155,7 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \ $(srcdir)/linux-m32r-low.c \ $(srcdir)/linux-m68k-low.c $(srcdir)/linux-mips-low.c \ $(srcdir)/linux-nios2-low.c \ - $(srcdir)/linux-ppc-low.c \ + $(srcdir)/linux-ppc-low.c $(srcdir)/nat/ppc-linux.c \ $(srcdir)/linux-s390-low.c \ $(srcdir)/linux-sh-low.c $(srcdir)/linux-sparc-low.c \ $(srcdir)/linux-x86-low.c \ @@ -581,6 +581,9 @@ linux-waitpid.o: ../nat/linux-waitpid.c mips-linux-watch.o: ../nat/mips-linux-watch.c $(COMPILE) $< $(POSTCOMPILE) +ppc-linux.o: ../nat/ppc-linux.c + $(COMPILE) $< + $(POSTCOMPILE) aarch64.c : $(srcdir)/../regformats/aarch64.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/aarch64.dat aarch64.c diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index fd80adc..8f68ed2 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -60,6 +60,9 @@ /* Define to 1 if you have the `fdwalk' function. */ #undef HAVE_FDWALK +/* Define to 1 if you have the `getauxval' function. */ +#undef HAVE_GETAUXVAL + /* Define to 1 if you have the `getrlimit' function. */ #undef HAVE_GETRLIMIT diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index 45efc51..55bd2c5 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -4745,7 +4745,7 @@ fi done -for ac_func in pread pwrite pread64 +for ac_func in getauxval pread pwrite pread64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index 02082cc..39e3a06 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -90,7 +90,7 @@ AC_CHECK_HEADERS(sgtty.h termio.h termios.h sys/reg.h string.h dnl fcntl.h signal.h sys/file.h dnl sys/ioctl.h netinet/in.h sys/socket.h netdb.h dnl netinet/tcp.h arpa/inet.h) -AC_CHECK_FUNCS(pread pwrite pread64) +AC_CHECK_FUNCS(getauxval pread pwrite pread64) GDB_AC_COMMON diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 679fc9f..f52aee2 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -217,7 +217,7 @@ case "${target}" in srv_regobj="${srv_regobj} powerpc-isa205-64l.o" srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o" srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o" - srv_tgtobj="$srv_linux_obj linux-ppc-low.o" + srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o" srv_xmlfiles="rs6000/powerpc-32l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec32l.xml" srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-cell32l.xml" diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index 6e880c1..188fac0 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -398,13 +398,11 @@ ppc_arch_setup (void) current_process ()->tdesc = tdesc; ppc_hwcap = 0; - /* Only if the high bit of the MSR is set, we actually have - a 64-bit inferior. */ regcache = new_register_cache (tdesc); fetch_inferior_registers (regcache, find_regno (tdesc, "msr")); collect_register_by_name (regcache, "msr", &msr); free_register_cache (regcache); - if (msr < 0) + if (ppc64_64bit_inferior_p (msr)) { ppc_get_hwcap (&ppc_hwcap); if (ppc_hwcap & PPC_FEATURE_CELL) -- cgit v1.1