rtld: increase TLS storage space (bug 2566)
[dragonfly.git] / sys / cpu / i386 / include / tls.h
CommitLineData
9e2ee207 1/*
e81a976a 2 * Copyright (c) 2005 The DragonFly Project. All rights reserved.
9e2ee207 3 *
e81a976a
DX
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
9e2ee207 7 *
e81a976a
DX
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 * 3. Neither the name of The DragonFly Project nor the names of its
15 * contributors may be used to endorse or promote products derived
16 * from this software without specific, prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
e96f55de 31 * $DragonFly: src/sys/cpu/i386/include/tls.h,v 1.12 2007/04/13 12:12:27 corecode Exp $
e81a976a
DX
32 */
33
88181b08
MD
34#ifndef _CPU_TLS_H_
35#define _CPU_TLS_H_
9e2ee207 36
1bd40720 37#ifndef _SYS_TYPES_H_
9e2ee207 38#include <sys/types.h>
1bd40720
MD
39#endif
40#ifndef _SYS_TLS_H_
e81a976a 41#include <sys/tls.h>
1bd40720 42#endif
e81a976a 43
a1eee96a
MD
44/*
45 * NOTE: the tcb_{self,dtv,pthread,errno) fields must be declared
46 * in the structure in the specified order as assembly will access the
47 * fields with a hardwired offset.
48 *
49 * Outside of this file, the system call layer generation will hardwire
50 * the offset for tcb_errno.
51 */
9e2ee207
JS
52struct tls_tcb {
53 struct tls_tcb *tcb_self; /* pointer to self*/
54 void *tcb_dtv; /* Dynamic Thread Vector */
55 void *tcb_pthread; /* thread library's data*/
a1eee96a
MD
56 int *tcb_errno_p; /* pointer to per-thread errno */
57 void *tcb_unused[4];
9e2ee207
JS
58};
59
60struct tls_dtv {
61 uintptr_t dtv_generation;
62 uintptr_t dtv_max_index;
63 void *dtv_offset[__ARRAY_ZERO];
64};
65
66#define RTLD_TCB_HAS_SELF_POINTER
67#define RTLD_STATIC_TLS_ALIGN 16
68#define RTLD_STATIC_TLS_ALIGN_MASK (RTLD_STATIC_TLS_ALIGN - 1)
4b2454d1 69#define RTLD_STATIC_TLS_EXTRA 640
9e2ee207
JS
70#define RTLD_STATIC_TLS_VARIANT_II
71
72/* Get the current TCB. */
73static __inline struct tls_tcb *
74tls_get_tcb(void)
75{
76 void *self;
77
9e2ee207
JS
78 __asm __volatile ("movl %%gs:%1, %0"
79 : "=r" (self)
dfd2ec9b 80 : "m" (((struct tls_tcb *)0)->tcb_self));
9e2ee207
JS
81
82 return(self);
83}
e81a976a 84
9e2ee207
JS
85/* Get the current thread. */
86static __inline void *
87tls_get_curthread(void)
e81a976a 88{
9e2ee207
JS
89 void *self;
90
9e2ee207
JS
91 __asm __volatile ("movl %%gs:%1, %0"
92 : "=r" (self)
aeffa6a1 93 : "m" (((struct tls_tcb *)0)->tcb_pthread));
9e2ee207
JS
94
95 return(self);
96}
97
98static __inline void
99tls_set_tcb(struct tls_tcb *tcb)
100{
101 struct tls_info info;
e81a976a
DX
102 int seg;
103
9e2ee207
JS
104 info.base = tcb;
105 info.size = -1;
ba491dfb 106 seg = set_tls_area(0, &info, sizeof(info));
e96f55de 107 __asm __volatile("mov %0, %%gs" : : "g" (seg));
e81a976a 108}
9e2ee207 109
83090bc2
MD
110static __inline void
111tls_set_gs(void *base, size_t bytes)
112{
113 struct tls_info info;
114 int seg;
115
116 info.base = base;
117 info.size = bytes;
ba491dfb 118 seg = set_tls_area(0, &info, sizeof(info));
e96f55de 119 __asm __volatile("mov %0, %%gs" : : "g" (seg));
83090bc2
MD
120}
121
ba491dfb
MD
122static __inline void
123tls_set_fs(void *base, size_t bytes)
124{
125 struct tls_info info;
126 int seg;
127
128 info.base = base;
129 info.size = bytes;
130 seg = set_tls_area(1, &info, sizeof(info));
e96f55de 131 __asm __volatile("mov %0, %%fs" : : "g" (seg));
ba491dfb
MD
132}
133
83090bc2
MD
134#ifndef _KERNEL
135
a1eee96a
MD
136struct tls_tcb *_rtld_allocate_tls(void);
137struct tls_tcb *_libc_allocate_tls(void);
f20fd431 138void _rtld_free_tls(struct tls_tcb *);
a1eee96a
MD
139void _libc_free_tls(struct tls_tcb *);
140void _rtld_call_init(void);
141struct tls_tcb *_libc_init_tls(void);
142struct tls_tcb *_init_tls(void);
9e2ee207 143
1bd40720
MD
144#endif
145
88181b08 146#endif /* !_CPU_TLS_H_ */