2002-11-07 Richard Henderson <rth@redhat.com>
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / alpha / tls.h
1 /* Definitions for thread-local data handling.  linuxthreads/Alpha version.
2    Copyright (C) 2002 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _TLS_H
21 #define _TLS_H
22
23 #ifndef __ASSEMBLER__
24
25 # include <pt-machine.h>
26 # include <stddef.h>
27
28 /* Type for the dtv.  */
29 typedef union dtv
30 {
31   size_t counter;
32   void *pointer;
33 } dtv_t;
34
35
36 typedef struct
37 {
38   dtv_t *dtv;
39
40   /* Reserved for the thread implementation.  In the case of LinuxThreads,
41      this is the thread descriptor.  */
42   void *tcb;
43 } tcbhead_t;
44 #endif
45
46
47 #ifdef HAVE_TLS_SUPPORT
48
49 /* Signal that TLS support is available.  */
50 # define USE_TLS        1
51
52 # ifndef __ASSEMBLER__
53 /* Get system call information.  */
54 #  include <sysdep.h>
55
56 /* Get the thread descriptor definition.  */
57 #  include <linuxthreads/descr.h>
58
59 /* This is the size of the initial TCB.  */
60 #  define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
61
62 /* Alignment requirements for the initial TCB.  */
63 #  define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
64
65 /* This is the size of the TCB.  */
66 #  define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
67
68 /* Alignment requirements for the TCB.  */
69 #  define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
70
71 /* The DTV is allocated at the TP; the TCB is placed elsewhere.  */
72 #  define TLS_DTV_AT_TP 1
73
74 /* Install the dtv pointer.  The pointer passed is to the element with
75    index -1 which contain the length.  */
76 #  define INSTALL_DTV(descr, dtvp) \
77   ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
78
79 /* Install new dtv for current thread.  */
80 #  define INSTALL_NEW_DTV(DTV) \
81   (((tcbhead_t *)__builtin_thread_pointer ())->dtv = (DTV))
82
83 /* Return dtv of given thread descriptor.  */
84 #  define GET_DTV(descr) \
85   (((tcbhead_t *) (descr))->dtv)
86
87 /* Code to initially initialize the thread pointer.  This might need
88    special attention since 'errno' is not yet available and if the
89    operation can cause a failure 'errno' must not be touched.  */
90 # define TLS_INIT_TP(descr, secondcall)                         \
91   ({                                                            \
92     register tcbhead_t *__self = (void *)(descr);               \
93     __self->tcb = __self;                                       \
94     __builtin_set_thread_pointer(__self);                       \
95   })
96
97 /* Return the address of the dtv for the current thread.  */
98 #  define THREAD_DTV() \
99   (((tcbhead_t *)__builtin_thread_pointer ())->dtv)
100
101 /* Return the thread descriptor for the current thread.  */
102 #undef THREAD_SELF
103 #define THREAD_SELF \
104   ((pthread_descr)(((tcbhead_t *)__builtin_thread_pointer ())->tcb))
105
106 #undef INIT_THREAD_SELF
107
108 # endif /* HAVE_TLS_SUPPORT */
109 #endif /* __ASSEMBLER__ */
110
111 #endif  /* tls.h */