831b217ac9e5a8de845792a66a72d68bbed924d6
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / tls.c
1 #include <sys/tls.h>
2 #include <parlib/vcore.h>
3 #include <ldsodefs.h>
4
5 void set_tls_desc(void* addr)
6 {
7         __set_tls_desc(addr);
8 }
9
10 void *get_tls_desc(void)
11 {
12         return __get_tls_desc();
13 }
14
15 /* Get a TLS, returns 0 on failure.  Vcores have their own TLS, and any thread
16  * created by a user-level scheduler needs to create a TLS as well. */
17 void *allocate_tls(void)
18 {
19         void *tcb = _dl_allocate_tls(NULL);
20         if (!tcb)
21                 return 0;
22 #ifdef TLS_TCB_AT_TP
23         /* Make sure the TLS is set up properly - its tcb pointer points to itself.
24          * Keep this in sync with sysdeps/akaros/XXX/tls.h.  For whatever reason,
25          * dynamically linked programs do not need this to be redone, but statics
26          * do. */
27         tcbhead_t *head = (tcbhead_t*)tcb;
28         head->tcb = tcb;
29         head->self = tcb;
30 #endif
31         return tcb;
32 }
33
34 /* Free a previously allocated TLS region */
35 void free_tls(void *tcb)
36 {
37         _dl_deallocate_tls(tcb, TRUE);
38 }
39
40 /* Reinitialize / reset / refresh a TLS to its initial values.  This doesn't do
41  * it properly yet, it merely frees and re-allocates the TLS, which is why we're
42  * slightly ghetto and return the pointer you should use for the TCB. */
43 void *reinit_tls(void *tcb)
44 {
45         /* TODO: keep this in sync with the methods used in
46          * allocate_transition_tls() */
47         free_tls(tcb);
48         return allocate_tls();
49 }