Back to index

glibc  2.9
Defines | Functions
td_thr_tlsbase.c File Reference
#include "thread_dbP.h"

Go to the source code of this file.


#define TLS_DTV_UNALLOCATED   ((void *) -1l)


td_err_e td_thr_tlsbase (const td_thrhandle_t *th, unsigned long int modid, psaddr_t *base)

Define Documentation

#define TLS_DTV_UNALLOCATED   ((void *) -1l)

Definition at line 23 of file td_thr_tlsbase.c.

Function Documentation

td_err_e td_thr_tlsbase ( const td_thrhandle_t th,
unsigned long int  modid,
psaddr_t base 

Definition at line 26 of file td_thr_tlsbase.c.

  if (modid < 1)
    return TD_NOTLS;

  union dtv pdtv, *dtvp;

  LOG ("td_thr_tlsbase");

  psaddr_t dtvpp = th->th_unique;
  dtvpp += offsetof (struct _pthread_descr_struct,;
/* Special case hack.  If TLS_TCB_SIZE == 0 (on 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 + offsetof (tcbhead_t, dtv)
          - (TLS_TCB_SIZE == 0 ? sizeof (tcbhead_t) : 0);
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined."

  /* Get the DTV pointer from the thread descriptor.  */
  if (ps_pdread (th->th_ta_p->ph, dtvpp, &dtvp, sizeof dtvp) != PS_OK)
    return TD_ERR;   /* XXX Other error value?  */

  /* Get the corresponding entry in the DTV.  */
  if (ps_pdread (th->th_ta_p->ph, dtvp + modid,
               &pdtv, sizeof (union dtv)) != PS_OK)
    return TD_ERR;   /* XXX Other error value?  */

  /* It could be that the memory for this module is not allocated for
     the given thread.  */
  if (pdtv.pointer.val == TLS_DTV_UNALLOCATED)
    return TD_TLSDEFER;

  *base = (char *) pdtv.pointer.val;

  return TD_OK;
  return TD_ERR;

Here is the caller graph for this function: