diff options
author | Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> | 2018-05-22 11:09:05 -0300 |
---|---|---|
committer | Pedro Franco de Carvalho <pedromfc@linux.vnet.ibm.com> | 2018-05-22 11:52:02 -0300 |
commit | 2e077f5e67aeff78e096a250bd225cd4658a35dc (patch) | |
tree | c1930a2baaa879e8989c9a0d80548d640ef0b7b0 /gdb/nat | |
parent | bd64614eb737096f40b976fb505ddd42e7f1614c (diff) | |
download | fsf-binutils-gdb-2e077f5e67aeff78e096a250bd225cd4658a35dc.zip fsf-binutils-gdb-2e077f5e67aeff78e096a250bd225cd4658a35dc.tar.gz fsf-binutils-gdb-2e077f5e67aeff78e096a250bd225cd4658a35dc.tar.bz2 |
[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 <pedromfc@linux.vnet.ibm.com>
* configure.nat <linux powerpc>: 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 <pedromfc@linux.vnet.ibm.com>
* linux-ppc-low.c (ppc_arch_setup): Remove code for getting the
wordsize of the inferior. Call ppc_linux_target_wordsize.
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/ppc-linux.c | 22 | ||||
-rw-r--r-- | gdb/nat/ppc-linux.h | 7 |
2 files changed, 23 insertions, 6 deletions
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 <elf.h> #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 |