diff mbox

NPTL/arc: notify kernel of the TP value

Message ID 1435666616-25444-1-git-send-email-vgupta@synopsys.com
State Accepted
Commit ca1c74d67dd115d059a875150e10b8560a9c35a8
Headers show

Commit Message

Vineet Gupta June 30, 2015, 12:16 p.m. UTC
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: Vineet Gupta <vgupta@synopsys.com>
---
 libpthread/nptl/sysdeps/arc/tls.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Bernhard Reutner-Fischer July 5, 2015, 8:33 p.m. UTC | #1
On Tue, Jun 30, 2015 at 05:46:56PM +0530, Vineet Gupta wrote:
> 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---------------

Applied, thanks!
diff mbox

Patch

diff --git a/libpthread/nptl/sysdeps/arc/tls.h b/libpthread/nptl/sysdeps/arc/tls.h
index 63dd11398522..4af415a1c30b 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.