Commit | Line | Data |
---|---|---|
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 | * | |
1bd40720 | 31 | * $DragonFly: src/sys/i386/include/Attic/tls.h,v 1.8 2006/05/20 02:42:06 dillon Exp $ |
e81a976a DX |
32 | */ |
33 | ||
9e2ee207 JS |
34 | #ifndef _MACHINE_TLS_H_ |
35 | #define _MACHINE_TLS_H_ | |
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 |
52 | struct 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 | ||
60 | struct 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) | |
de1d74d2 | 69 | #define RTLD_STATIC_TLS_EXTRA 256 |
9e2ee207 JS |
70 | #define RTLD_STATIC_TLS_VARIANT_II |
71 | ||
1bd40720 MD |
72 | #ifndef _KERNEL |
73 | ||
9e2ee207 JS |
74 | /* Get the current TCB. */ |
75 | static __inline struct tls_tcb * | |
76 | tls_get_tcb(void) | |
77 | { | |
78 | void *self; | |
79 | ||
9e2ee207 JS |
80 | __asm __volatile ("movl %%gs:%1, %0" |
81 | : "=r" (self) | |
dfd2ec9b | 82 | : "m" (((struct tls_tcb *)0)->tcb_self)); |
9e2ee207 JS |
83 | |
84 | return(self); | |
85 | } | |
e81a976a | 86 | |
9e2ee207 JS |
87 | /* Get the current thread. */ |
88 | static __inline void * | |
89 | tls_get_curthread(void) | |
e81a976a | 90 | { |
9e2ee207 JS |
91 | void *self; |
92 | ||
9e2ee207 JS |
93 | __asm __volatile ("movl %%gs:%1, %0" |
94 | : "=r" (self) | |
aeffa6a1 | 95 | : "m" (((struct tls_tcb *)0)->tcb_pthread)); |
9e2ee207 JS |
96 | |
97 | return(self); | |
98 | } | |
99 | ||
100 | static __inline void | |
101 | tls_set_tcb(struct tls_tcb *tcb) | |
102 | { | |
103 | struct tls_info info; | |
e81a976a DX |
104 | int seg; |
105 | ||
9e2ee207 JS |
106 | info.base = tcb; |
107 | info.size = -1; | |
108 | seg = sys_set_tls_area(0, &info, sizeof(info)); | |
e81a976a DX |
109 | __asm __volatile("movl %0, %%gs" : : "r" (seg)); |
110 | } | |
9e2ee207 | 111 | |
a1eee96a MD |
112 | struct tls_tcb *_rtld_allocate_tls(void); |
113 | struct tls_tcb *_libc_allocate_tls(void); | |
f20fd431 | 114 | void _rtld_free_tls(struct tls_tcb *); |
a1eee96a MD |
115 | void _libc_free_tls(struct tls_tcb *); |
116 | void _rtld_call_init(void); | |
117 | struct tls_tcb *_libc_init_tls(void); | |
118 | struct tls_tcb *_init_tls(void); | |
9e2ee207 | 119 | |
1bd40720 MD |
120 | #endif |
121 | ||
9e2ee207 | 122 | #endif /* !_MACHINE_TLS_H_ */ |