Fix typos.
[dragonfly.git] / sys / 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 *
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
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)
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. */
75static __inline struct tls_tcb *
76tls_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. */
88static __inline void *
89tls_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
100static __inline void
101tls_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
112struct tls_tcb *_rtld_allocate_tls(void);
113struct tls_tcb *_libc_allocate_tls(void);
f20fd431 114void _rtld_free_tls(struct tls_tcb *);
a1eee96a
MD
115void _libc_free_tls(struct tls_tcb *);
116void _rtld_call_init(void);
117struct tls_tcb *_libc_init_tls(void);
118struct tls_tcb *_init_tls(void);
9e2ee207 119
1bd40720
MD
120#endif
121
9e2ee207 122#endif /* !_MACHINE_TLS_H_ */