OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [uClibc/] [libpthread/] [linuxthreads_db/] [td_thr_tls_get_addr.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/* Get address of thread local variable.
2
   Copyright (C) 2002 Free Software Foundation, Inc.
3
   This file is part of the GNU C Library.
4
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 2002.
5
 
6
   The GNU C Library is free software; you can redistribute it and/or
7
   modify it under the terms of the GNU Lesser General Public
8
   License as published by the Free Software Foundation; either
9
   version 2.1 of the License, or (at your option) any later version.
10
 
11
   The GNU C Library is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
   Lesser General Public License for more details.
15
 
16
   You should have received a copy of the GNU Lesser General Public
17
   License along with the GNU C Library; if not, write to the Free
18
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19
   02111-1307 USA.  */
20
 
21
 
22
#include "link.h"
23
#include "thread_dbP.h"
24
 
25
/* Value used for dtv entries for which the allocation is delayed.  */
26
# define TLS_DTV_UNALLOCATED    ((void *) -1l)
27
 
28
 
29
td_err_e
30
td_thr_tls_get_addr (const td_thrhandle_t *th __attribute__ ((unused)),
31
                     void *map_address __attribute__ ((unused)),
32
                     size_t offset __attribute__ ((unused)),
33
                     void **address __attribute__ ((unused)))
34
{
35
#if USE_TLS
36
  size_t modid;
37
  union dtv pdtv, *dtvp;
38
 
39
  LOG ("td_thr_tls_get_addr");
40
 
41
  /* Get the DTV pointer from the thread descriptor.  */
42
  if (ps_pdread (th->th_ta_p->ph,
43
                 &((struct _pthread_descr_struct *) th->th_unique)->p_header.data.dtvp,
44
                 &dtvp, sizeof dtvp) != PS_OK)
45
    return TD_ERR;      /* XXX Other error value?  */
46
 
47
  /* Read the module ID from the link_map.  */
48
  if (ps_pdread (th->th_ta_p->ph,
49
                 &((struct link_map *) map_address)->l_tls_modid,
50
                 &modid, sizeof modid) != PS_OK)
51
    return TD_ERR;      /* XXX Other error value?  */
52
 
53
  /* Get the corresponding entry in the DTV.  */
54
  if (ps_pdread (th->th_ta_p->ph, dtvp + modid,
55
                 &pdtv, sizeof (union dtv)) != PS_OK)
56
    return TD_ERR;      /* XXX Other error value?  */
57
 
58
  /* It could be that the memory for this module is not allocated for
59
     the given thread.  */
60
  if (pdtv.pointer == TLS_DTV_UNALLOCATED)
61
    /* There is not much we can do.  */
62
    return TD_NOTALLOC;
63
 
64
  *address = (char *) pdtv.pointer + offset;
65
 
66
  return TD_OK;
67
#else
68
  return TD_ERR;
69
#endif
70
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.