1 .\" Copyright (C) 2003 Free Software Foundation, Inc.
2 .\" Copyright (C) 2015 Andrew Lutomirski
5 .\" SPDX-License-Identifier: GPL-1.0-or-later
7 .TH SET_THREAD_AREA 2 2022-09-09 "Linux man-pages (unreleased)"
9 get_thread_area, set_thread_area \- manipulate thread-local storage information
12 .RI ( libc ", " \-lc )
15 .BR "#include <sys/syscall.h>" " /* Definition of " SYS_* " constants */"
16 .B #include <unistd.h>
18 .B #if defined __i386__ || defined __x86_64__
19 .BR "# include <asm/ldt.h>" " /* Definition of " "struct user_desc" " */"
21 .BI "int syscall(SYS_get_thread_area, struct user_desc *" u_info );
22 .BI "int syscall(SYS_set_thread_area, struct user_desc *" u_info );
24 .B #elif defined __m68k__
26 .B "int syscall(SYS_get_thread_area);"
27 .BI "int syscall(SYS_set_thread_area, unsigned long " tp );
29 .B #elif defined __mips__
31 .BI "int syscall(SYS_set_thread_area, unsigned long " addr );
37 glibc provides no wrappers for these system calls,
38 necessitating the use of
41 These calls provide architecture-specific support for a thread-local storage
44 .BR set_thread_area ()
45 is available on m68k, MIPS, and x86 (both 32-bit and 64-bit variants);
46 .BR get_thread_area ()
47 is available on m68k and x86.
50 .BR set_thread_area ()
51 allows storing an arbitrary pointer (provided in the
53 argument on m68k and in the
56 in the kernel data structure associated with the calling thread;
57 this pointer can later be retrieved using
58 .BR get_thread_area ()
60 for information regarding obtaining the thread pointer on MIPS).
62 On x86, Linux dedicates three global descriptor table (GDT) entries for
64 For more information about the GDT, see the
65 Intel Software Developer's Manual or the AMD Architecture Programming Manual.
67 Both of these system calls take an argument that is a pointer
68 to a structure of the following type:
73 unsigned int entry_number;
74 unsigned int base_addr;
76 unsigned int seg_32bit:1;
77 unsigned int contents:2;
78 unsigned int read_exec_only:1;
79 unsigned int limit_in_pages:1;
80 unsigned int seg_not_present:1;
81 unsigned int useable:1;
89 .BR get_thread_area ()
90 reads the GDT entry indicated by
91 .I u_info\->entry_number
92 and fills in the rest of the fields in
95 .BR set_thread_area ()
96 sets a TLS entry in the GDT.
98 The TLS array entry set by
99 .BR set_thread_area ()
100 corresponds to the value of
101 .I u_info\->entry_number
102 passed in by the user.
103 If this value is in bounds,
104 .BR set_thread_area ()
105 writes the TLS descriptor pointed to by
107 into the thread's TLS array.
110 .BR set_thread_area ()
113 of \-1, it searches for a free TLS entry.
115 .BR set_thread_area ()
116 finds a free TLS entry, the value of
117 .I u_info\->entry_number
118 is set upon return to show which entry was changed.
122 is considered "empty" if
126 are set to 1 and all of the other fields are 0.
127 If an "empty" descriptor is passed to
128 .BR set_thread_area (),
129 the corresponding TLS entry will be cleared.
130 See BUGS for additional details.
133 .BR set_thread_area ()
134 cannot be used to write non-present segments, 16-bit segments, or code
135 segments, although clearing a segment is still acceptable.
137 On x86, these system calls
138 return 0 on success, and \-1 on failure, with
140 set to indicate the error.
143 .BR set_thread_area ()
146 .BR get_thread_area ()
147 returns the thread area pointer value
149 .BR set_thread_area ()).
153 \fIu_info\fP is an invalid pointer.
156 \fIu_info\->entry_number\fP is out of bounds.
159 .BR get_thread_area ()
161 .BR set_thread_area ()
162 was invoked as a 64-bit system call.
165 .RB ( set_thread_area ())
166 A free TLS entry could not be located.
168 .BR set_thread_area ()
169 first appeared in Linux 2.5.29.
170 .BR get_thread_area ()
171 first appeared in Linux 2.5.32.
173 .BR set_thread_area ()
175 .BR get_thread_area ()
176 are Linux-specific and should not be used in programs that are intended
179 These system calls are generally intended for use only by threading libraries.
183 .BR set_thread_area ()
188 This is not normally a problem, as
190 is normally used only by 64-bit programs.
192 On MIPS, the current value of the thread area pointer can be obtained
193 using the instruction:
201 This instruction traps and is handled by kernel.
203 On 64-bit kernels before Linux 3.19,
204 .\" commit e30ab185c490e9a9381385529e0fd32f0a399495
205 one of the padding bits in
207 if set, would prevent the descriptor from being considered empty (see
209 As a result, the only reliable way to clear a TLS entry is to use
213 structure, including padding bits, and then to set the
220 consisting entirely of zeros except for
222 will also be interpreted as a request to clear a TLS entry, but this
223 behaved differently on older kernels.
225 Prior to Linux 3.19, the DS and ES segment registers must not reference
231 .RB ( PTRACE_GET_THREAD_AREA " and " PTRACE_SET_THREAD_AREA )