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.
This commit is contained in:
parent
fcd4a73d7d
commit
6f67973b42
2 changed files with 19 additions and 39 deletions
|
@ -1,3 +1,11 @@
|
|||
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.
|
||||
|
||||
2016-08-03 Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR python/18565:
|
||||
|
|
|
@ -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;
|
||||
int ret, tid;
|
||||
gdb_byte regbuf[VFP_REGS_SIZE];
|
||||
struct iovec iovec;
|
||||
|
||||
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;
|
||||
tid = ptid_get_lwp (inferior_ptid);
|
||||
|
||||
if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
|
||||
return ops->beneath->to_read_description (ops->beneath);
|
||||
iovec.iov_base = regbuf;
|
||||
iovec.iov_len = VFP_REGS_SIZE;
|
||||
|
||||
#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;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue