* db_info.c [TLS_DTV_AT_TP && TLS_TP_OFFSET > 0]
authorRoland McGrath <roland@gnu.org>
Sat, 13 Mar 2004 07:59:29 +0000 (07:59 +0000)
committerRoland McGrath <roland@gnu.org>
Sat, 13 Mar 2004 07:59:29 +0000 (07:59 +0000)
(_thread_db_pthread_dtvp): Define differently for this case (PowerPC).

linuxthreads_db/ChangeLog
linuxthreads_db/td_thr_tlsbase.c
nptl_db/ChangeLog

index 4580537..b6c2a18 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-12  Roland McGrath  <roland@redhat.com>
+
+       * td_thr_tlsbase.c [TLS_DTV_AT_TP && TLS_TP_OFFSET > 0]: Handle this
+       case (PowerPC) differently.
+
 2003-11-25  Roland McGrath  <roland@redhat.com>
 
        * td_symbol_list.c (symbol_list_arr) [HAVE_ASM_GLOBAL_DOT_NAME]:
index bcf0653..d3e6d36 100644 (file)
@@ -1,5 +1,5 @@
 /* Locate TLS data for a thread.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -18,6 +18,7 @@
    02111-1307 USA.  */
 
 #include "thread_dbP.h"
+#include <dl-tls.h>
 
 /* Value used for dtv entries for which the allocation is delayed.  */
 # define TLS_DTV_UNALLOCATED   ((void *) -1l)
@@ -38,6 +39,13 @@ td_thr_tlsbase (const td_thrhandle_t *th,
   psaddr_t dtvpp = th->th_unique;
 #if TLS_TCB_AT_TP
   dtvpp += offsetof (struct _pthread_descr_struct, p_header.data.dtvp);
+#elif TLS_DTV_AT_TP && TLS_TP_OFFSET > 0
+/* Special case hack.  Really this #if should be TLS_TCB_SIZE == 0, but
+   when untrue it's a sizeof expression, and that wouldn't fly.  In this
+   flavor (PowerPC), there is no TCB containing the DTV at the TP, but
+   actually the TCB lies behind the TP, i.e. at the very end of the area
+   covered by TLS_PRE_TCB_SIZE.  */
+  dtvpp += TLS_PRE_TCB_SIZE - sizeof (tcbhead_t) + offsetof (tcbhead_t, dtv);
 #elif TLS_DTV_AT_TP
   dtvpp += TLS_PRE_TCB_SIZE + offsetof (tcbhead_t, dtv);
 #else
index 1d17a76..1331a10 100644 (file)
@@ -1,3 +1,8 @@
+2004-03-12  Roland McGrath  <roland@redhat.com>
+
+       * db_info.c [TLS_DTV_AT_TP && TLS_TP_OFFSET > 0]
+       (_thread_db_pthread_dtvp): Define differently for this case (PowerPC).
+
 2003-12-11  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * db_info.c (REGISTER): Add bit size of thread register as second