aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Vineet Gupta <vgupta@synopsys.com>2015-06-30 17:46:56 +0530
committerGravatar Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>2015-07-05 22:09:46 +0200
commitca1c74d67dd115d059a875150e10b8560a9c35a8 (patch)
tree4d0c97fe4cd5a6e98327bbe14e0846ce5b4d09d3
parent9930f8b92bb47b2dbea7679d948e3ecfbce23ca9 (diff)
downloaduClibc-ca1c74d67dd115d059a875150e10b8560a9c35a8.tar.gz
uClibc-ca1c74d67dd115d059a875150e10b8560a9c35a8.tar.bz2
NPTL/arc: notify kernel of the TP valueHEADmaster
Native gdb makes a ptrace (GET_THREAD_AREA) which needs to return the TP. however when libc sets up TP reg (for main thread), it doesn't call arc_settls syscall so kernel doesn't know of TP register details (moreso because clone doesnt have SETTLS flag) Note that kernel doesn't know about r25 being TP etc. This commit got lost in merge of NPTL tools into arc-mainline-dev and showed up again as STAR 9000919529 (native gdb can't debug threaded apps) ------->8--------------- [ARCLinux]# gdb ./pth Reading symbols from ./pth...(no debugging symbols found)...done. (gdb) b main Breakpoint 1 at 0x106f2 (gdb) r Starting program: /pth [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/libthread_db.so.1". thread_get_info_callback: cannot get thread info: generic error (gdb) q ------->8--------------- Debugged-by: Anton Kolesov <akolesov@synopsys.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
-rw-r--r--libpthread/nptl/sysdeps/arc/tls.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/libpthread/nptl/sysdeps/arc/tls.h b/libpthread/nptl/sysdeps/arc/tls.h
index 63dd11398..4af415a1c 100644
--- a/libpthread/nptl/sysdeps/arc/tls.h
+++ b/libpthread/nptl/sysdeps/arc/tls.h
@@ -104,8 +104,11 @@ typedef struct
operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \
({ \
- __builtin_set_thread_pointer(tcbp); \
- NULL; \
+ long result_var; \
+ __builtin_set_thread_pointer(tcbp); \
+ result_var = INTERNAL_SYSCALL (arc_settls, err, 1, (tcbp)); \
+ INTERNAL_SYSCALL_ERROR_P (result_var, err) \
+ ? "unknown error" : NULL; \
})
/* Return the address of the dtv for the current thread.