This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Determine target description for native aarch64


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6f67973b4280cfd045e632a3340becd16e43b4b1

commit 6f67973b4280cfd045e632a3340becd16e43b4b1
Author: Yao Qi <yao.qi@linaro.org>
Date:   Thu Aug 4 11:37:57 2016 +0100

    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.

Diff:
---
 gdb/ChangeLog           |  8 ++++++++
 gdb/aarch64-linux-nat.c | 50 +++++++++++--------------------------------------
 2 files changed, 19 insertions(+), 39 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 24a53a5..35a206e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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:
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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]