diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-08-04 11:37:57 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-08-04 11:39:19 +0100 |
commit | 6f67973b4280cfd045e632a3340becd16e43b4b1 (patch) | |
tree | e76f932c7273ea3102b62119c8fbd16baa676b17 /gdb/aarch64-linux-nat.c | |
parent | fcd4a73d7dc3505662b4d58489f4c1b8b003b8f3 (diff) | |
download | gdb-6f67973b4280cfd045e632a3340becd16e43b4b1.zip gdb-6f67973b4280cfd045e632a3340becd16e43b4b1.tar.gz gdb-6f67973b4280cfd045e632a3340becd16e43b4b1.tar.bz2 |
Determine target description for native aarch64
I find the following test fail when I test native aarch64 gdb with
arm program,
(gdb) PASS: gdb.base/attach-pie-noexec.exp: attach
set architecture arm^M
warning: Selected architecture arm is not compatible with reported target architecture aarch64^M
Architecture `arm' not recognized.^M
The target architecture is set automatically (currently aarch64)^M
(gdb) FAIL: gdb.base/attach-pie-noexec.exp: set architecture arm
GDB thinks the target is aarch64, but it isn't. Nowadays, we are
using some entries AT_PHENT and AT_HWCAP in auxv to determine whether
the process is a 32-bit arm one or 64-bit aarch64 one, and get the
right gdbarch. However, in the process of parsing auxv (in
inf_ptrace_auxv_parse), the size of int and data pointer of
target_gdbarch is used. If debug program exists (in most of cases),
target_gdbarch is already set according to the debug program, which
is arm in my case. Then, GDB can parse auxv successfully. However,
in gdb.base/attach-pie-noexec.exp, the debug program is removed,
target_gdbarch is aarch64 when GDB parse auxv, so GDB can't parse
it successfully.
Instead of using auxv, we check the return value of ptrace NT_ARM_VFP.
If the program is an arm process, NT_ARM_VFP is OK, otherwise, error
is returned.
Additionally, we only return tdesc_arm_with_neon for arm process,
because neon is mandatory on ARMv8.
gdb:
2016-08-04 Yao Qi <yao.qi@linaro.org>
* aarch64-linux-nat.c (tdesc_arm_with_vfpv3): Remove the
declaration.
(aarch64_linux_read_description): Remove code on getting
auxv and select target description on it. Select target
description by the result of NT_ARM_VFP ptrace request.
Diffstat (limited to 'gdb/aarch64-linux-nat.c')
-rw-r--r-- | gdb/aarch64-linux-nat.c | 50 |
1 files changed, 11 insertions, 39 deletions
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index fe1631d..e431637 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -481,7 +481,6 @@ aarch64_linux_child_post_startup_inferior (struct target_ops *self, super_post_startup_inferior (self, ptid); } -extern struct target_desc *tdesc_arm_with_vfpv3; extern struct target_desc *tdesc_arm_with_neon; /* Implement the "to_read_description" target_ops method. */ @@ -489,47 +488,20 @@ extern struct target_desc *tdesc_arm_with_neon; static const struct target_desc * aarch64_linux_read_description (struct target_ops *ops) { - CORE_ADDR at_phent; - - if (target_auxv_search (ops, AT_PHENT, &at_phent) == 1) - { - if (at_phent == sizeof (Elf64_External_Phdr)) - return tdesc_aarch64; - else - { - CORE_ADDR arm_hwcap = 0; - - if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1) - return ops->beneath->to_read_description (ops->beneath); - -#ifndef COMPAT_HWCAP_VFP -#define COMPAT_HWCAP_VFP (1 << 6) -#endif -#ifndef COMPAT_HWCAP_NEON -#define COMPAT_HWCAP_NEON (1 << 12) -#endif -#ifndef COMPAT_HWCAP_VFPv3 -#define COMPAT_HWCAP_VFPv3 (1 << 13) -#endif - - if (arm_hwcap & COMPAT_HWCAP_VFP) - { - char *buf; - const struct target_desc *result = NULL; - - if (arm_hwcap & COMPAT_HWCAP_NEON) - result = tdesc_arm_with_neon; - else if (arm_hwcap & COMPAT_HWCAP_VFPv3) - result = tdesc_arm_with_vfpv3; + int ret, tid; + gdb_byte regbuf[VFP_REGS_SIZE]; + struct iovec iovec; - return result; - } + tid = ptid_get_lwp (inferior_ptid); - return NULL; - } - } + iovec.iov_base = regbuf; + iovec.iov_len = VFP_REGS_SIZE; - return tdesc_aarch64; + ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec); + if (ret == 0) + return tdesc_arm_with_neon; + else + return tdesc_aarch64; } /* Convert a native/host siginfo object, into/from the siginfo in the |