From 2e077f5e67aeff78e096a250bd225cd4658a35dc Mon Sep 17 00:00:00 2001 From: Pedro Franco de Carvalho Date: Tue, 22 May 2018 11:09:05 -0300 Subject: [PowerPC] Consolidate wordsize getter between native and gdbserver This patch moves the native target wordsize getter for ppc linux to nat/ so that it can be used to simplify ppc_arch_setup in gdbserver. The ptrace call used to get MSR for this is ultimately the same as before, but it is no longer necessary to create a temporary regcache to call fetch_inferior_registers. gdb/ChangeLog: 2018-05-22 Pedro Franco de Carvalho * configure.nat : Add ppc-linux.o to NATDEPFILES. * ppc-linux-nat.c (ppc_linux_target_wordsize): Move to nat/ppc-linux.c. (ppc_linux_nat_target::auxv_parse): Get thread id tid. Call ppc_linux_target_wordsize with tid. (ppc_linux_nat_target::read_description): Call ppc_linux_target wordsize with tid. * nat/ppc-linux.c: Include nat/gdb_ptrace.h. (ppc64_64bit_inferior_p): Add static and inline specifiers. (ppc_linux_target_wordsize): Move here from ppc-linux-nat.c. Add tid parameter. Remove static specifier. * nat/ppc-linux.h (ppc64_64bit_inferior_p): Remove declaration. (ppc_linux_target_wordsize): New declaration. gdb/gdbserver/ChangeLog: 2018-05-22 Pedro Franco de Carvalho * linux-ppc-low.c (ppc_arch_setup): Remove code for getting the wordsize of the inferior. Call ppc_linux_target_wordsize. --- gdb/nat/ppc-linux.c | 22 +++++++++++++++++++++- gdb/nat/ppc-linux.h | 7 ++----- 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'gdb/nat') diff --git a/gdb/nat/ppc-linux.c b/gdb/nat/ppc-linux.c index 7ab6551..1796ceb 100644 --- a/gdb/nat/ppc-linux.c +++ b/gdb/nat/ppc-linux.c @@ -17,6 +17,7 @@ #include "common-defs.h" #include "ppc-linux.h" +#include "nat/gdb_ptrace.h" #include #ifdef HAVE_GETAUXVAL @@ -53,7 +54,7 @@ ppc64_host_hwcap (unsigned long *valp) #endif /* HAVE_GETAUXVAL */ } -int +static inline int ppc64_64bit_inferior_p (long msr) { unsigned long ppc_host_hwcap = 0; @@ -73,3 +74,22 @@ ppc64_64bit_inferior_p (long msr) } #endif + +int +ppc_linux_target_wordsize (int tid) +{ + int wordsize = 4; + + /* Check for 64-bit inferior process. This is the case when the host is + 64-bit, and in addition the top bit of the MSR register is set. */ +#ifdef __powerpc64__ + long msr; + + errno = 0; + msr = (long) ptrace (PTRACE_PEEKUSER, tid, PT_MSR * 8, 0); + if (errno == 0 && ppc64_64bit_inferior_p (msr)) + wordsize = 8; +#endif + + return wordsize; +} diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h index 76a5d18..3d4d4fd 100644 --- a/gdb/nat/ppc-linux.h +++ b/gdb/nat/ppc-linux.h @@ -82,10 +82,7 @@ #define PTRACE_SETEVRREGS 21 #endif -#ifdef __powerpc64__ -/* Return whether the inferior is 64bit or not by checking certain bit - in MSR. */ -int ppc64_64bit_inferior_p (long msr); -#endif +/* Return the wordsize of the target, either 4 or 8 bytes. */ +int ppc_linux_target_wordsize (int tid); #endif -- cgit v1.1