1 /* Thread-local storage descriptor handling in the ELF dynamic linker.
2    x86_64 version.
3    Copyright (C) 2005-2021 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5 
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10 
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15 
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, see
18    <https://www.gnu.org/licenses/>.  */
19 
20 #include <stdint.h>
21 
22 #ifndef _X86_64_DL_TLSDESC_H
23 # define _X86_64_DL_TLSDESC_H 1
24 
25 /* Type used to represent a TLS descriptor in the GOT.  */
26 struct tlsdesc
27 {
28   /* Anonymous union is used here to ensure that GOT entry slot is always
29      8 bytes for both x32 and x86-64.  */
30   union
31     {
32       ptrdiff_t (*entry) (struct tlsdesc *on_rax);
33       uint64_t entry_slot;
34     };
35   union
36     {
37       void *arg;
38       uint64_t arg_slot;
39     };
40 };
41 
42 typedef struct dl_tls_index
43 {
44   uint64_t ti_module;
45   uint64_t ti_offset;
46 } tls_index;
47 
48 /* Type used as the argument in a TLS descriptor for a symbol that
49    needs dynamic TLS offsets.  */
50 struct tlsdesc_dynamic_arg
51 {
52   tls_index tlsinfo;
53   size_t gen_count;
54 };
55 
56 extern ptrdiff_t attribute_hidden
57   _dl_tlsdesc_return(struct tlsdesc *on_rax),
58   _dl_tlsdesc_undefweak(struct tlsdesc *on_rax);
59 
60 # ifdef SHARED
61 extern void *_dl_make_tlsdesc_dynamic (struct link_map *map,
62 				       size_t ti_offset)
63   attribute_hidden;
64 
65 extern ptrdiff_t attribute_hidden _dl_tlsdesc_dynamic(struct tlsdesc *);
66 # endif
67 
68 #endif
69