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