aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/thread-db.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2006-10-17 16:02:27 +0000
committerDaniel Jacobowitz <drow@false.org>2006-10-17 16:02:27 +0000
commitdae5f5cf4b47e0c8b81c090316093ecf5777f770 (patch)
tree7a7f4edbdd4892beda9c8424dc6445c998aeb2a4 /gdb/gdbserver/thread-db.c
parent5bd2f6e2a6179014300f75f86231e0e37736eb6b (diff)
downloadgdb-dae5f5cf4b47e0c8b81c090316093ecf5777f770.zip
gdb-dae5f5cf4b47e0c8b81c090316093ecf5777f770.tar.gz
gdb-dae5f5cf4b47e0c8b81c090316093ecf5777f770.tar.bz2
* acinclude.m4 (SRV_CHECK_TLS_GET_ADDR): New.
* configure.ac: Use it. Define HAVE_TD_THR_TLS_GET_ADDR. * config.in, configure: Regenerated. * inferiors.c (gdb_id_to_thread): New function. (gdb_id_to_thread_id): Use it. * linux-low.c (linux_target_ops): Use thread_db_get_tls_address. * linux-low.h (struct process_info): Add th member. (thread_db_get_tls_address): New prototype. * remote-utils.c (decode_address): Make non-static. * server.c (handle_query): Handle qGetTLSAddr. * server.h (gdb_id_to_thread, decode_address): New prototypes. * target.h (struct target_ops): Add get_tls_address. * thread-db.c (maybe_attach_thread): Save the thread handle. (thread_db_get_tls_address): New.
Diffstat (limited to 'gdb/gdbserver/thread-db.c')
-rw-r--r--gdb/gdbserver/thread-db.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c
index 24531bf..78bc6434 100644
--- a/gdb/gdbserver/thread-db.c
+++ b/gdb/gdbserver/thread-db.c
@@ -266,6 +266,7 @@ found:
process->lwpid = ti_p->ti_lid;
process->thread_known = 1;
+ process->th = *th_p;
err = td_thr_event_enable (th_p, 1);
if (err != TD_OK)
error ("Cannot enable thread event reporting for %d: %s",
@@ -320,6 +321,33 @@ thread_db_look_up_symbols (void)
}
int
+thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset,
+ CORE_ADDR load_module, CORE_ADDR *address)
+{
+#if HAVE_TD_THR_TLS_GET_ADDR
+ psaddr_t addr;
+ td_err_e err;
+ struct process_info *process;
+
+ process = get_thread_process (thread);
+ if (!process->thread_known)
+ return TD_NOTHR;
+
+ err = td_thr_tls_get_addr (&process->th, (psaddr_t) load_module, offset,
+ &addr);
+ if (err == TD_OK)
+ {
+ *address = (CORE_ADDR) addr;
+ return 0;
+ }
+ else
+ return err;
+#else
+ return -1;
+#endif
+}
+
+int
thread_db_init ()
{
int err;