Switch AArch64 gdbserver ps_get_thread_area to PTRACE_GETREGSET.
authorMarcus Shawcroft <mshawcroft@sourceware.org>
Thu, 7 Feb 2013 10:47:40 +0000 (10:47 +0000)
committerMarcus Shawcroft <mshawcroft@sourceware.org>
Thu, 7 Feb 2013 10:47:40 +0000 (10:47 +0000)
2013-02-06  Marcus Shawcroft  <marcus.shawcroft@arm.com>

       * linux-aarch64-low.c (ps_get_thread_area): Replace
       PTRACE_GET_THREAD_AREA with PTRACE_GETREGSET.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-aarch64-low.c

index 4de39a2..f26620b 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-07  Marcus Shawcroft  <marcus.shawcroft@arm.com>
+
+       * linux-aarch64-low.c (ps_get_thread_area): Replace
+       PTRACE_GET_THREAD_AREA with PTRACE_GETREGSET.
+
 2013-02-04  Jim MacArthur  <jim.macarthur@arm.com>
            Marcus Shawcroft  <marcus.shawcroft@arm.com>
            Nigel Stephens  <nigel.stephens@arm.com>
index 7f99887..883277c 100644 (file)
@@ -1089,16 +1089,22 @@ aarch64_stopped_by_watchpoint (void)
 /* Fetch the thread-local storage pointer for libthread_db.  */
 
 ps_err_e
-ps_get_thread_area (const struct ps_prochandle * ph,
+ps_get_thread_area (const struct ps_prochandle *ph,
                    lwpid_t lwpid, int idx, void **base)
 {
-  if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
+  struct iovec iovec;
+  uint64_t reg;
+
+  iovec.iov_base = &reg;
+  iovec.iov_len = sizeof (reg);
+
+  if (ptrace (PTRACE_GETREGSET, lwpid, NT_ARM_TLS, &iovec) != 0)
     return PS_ERR;
 
   /* IDX is the bias from the thread pointer to the beginning of the
      thread descriptor.  It has to be subtracted due to implementation
      quirks in libthread_db.  */
-  *base = (void *) ((char *) *base - idx);
+  *base = (void *) (reg - idx);
 
   return PS_OK;
 }