source: mainline/uspace/lib/c/include/tls.h@ b1834a01

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b1834a01 was 40abf56a, checked in by Jiří Zárevúcky <jiri.zarevucky@…>, 7 years ago

Make sure that a thread with uninitialized TLS does not need to call malloc()
to initialize it.

For threads and tasks created by loader, we create TLS beforehand and pass
it to the child. For tasks spawned directly by the kernel, we require it is
a static executable and allocate the initial TLS using as_area_create() instead
of the libc allocator.

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/*
2 * Copyright (c) 2007 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/** @file
33 */
34
35#ifndef LIBC_TLS_H_
36#define LIBC_TLS_H_
37
38#include <libarch/tls.h>
39#include <stdbool.h>
40#include <stddef.h>
41#include <stdint.h>
42
43static inline void __tcb_reset(void)
44{
45 __tcb_raw_set(NULL);
46}
47
48static inline void __tcb_set(tcb_t *tcb)
49{
50 __tcb_raw_set((uint8_t *)tcb + ARCH_TP_OFFSET);
51}
52
53
54static inline tcb_t *__tcb_get(void)
55{
56 return (tcb_t *)((uint8_t *)__tcb_raw_get() - ARCH_TP_OFFSET);
57}
58
59/*
60 * The TP register is supposed to be zero when the thread is first created
61 * by the kernel. We use this for some debugging assertions.
62 */
63static inline bool __tcb_is_set(void)
64{
65 return __tcb_raw_get() != NULL;
66}
67
68/** DTV Generation number - equals vector length */
69#define DTV_GN(dtv) (((uintptr_t *)(dtv))[0])
70
71extern tcb_t *tls_make(const void *);
72extern tcb_t *tls_make_initial(const void *);
73extern tcb_t *tls_alloc_arch(size_t, size_t);
74extern void tls_free(tcb_t *);
75extern void tls_free_arch(tcb_t *, size_t, size_t);
76extern void *tls_get(void);
77
78#ifdef CONFIG_TLS_VARIANT_1
79extern tcb_t *tls_alloc_variant_1(size_t, size_t);
80extern void tls_free_variant_1(tcb_t *, size_t, size_t);
81#endif
82
83#ifdef CONFIG_TLS_VARIANT_2
84extern tcb_t *tls_alloc_variant_2(size_t, size_t);
85extern void tls_free_variant_2(tcb_t *, size_t, size_t);
86#endif
87
88#endif
89
90/** @}
91 */
Note: See TracBrowser for help on using the repository browser.