| #include <stdlib.h> |
| #include <sys/tls.h> |
| #include <parlib/vcore.h> |
| #include <ldsodefs.h> |
| |
| void set_tls_desc(void* addr) |
| { |
| __set_tls_desc(addr); |
| } |
| |
| void *get_tls_desc(void) |
| { |
| return __get_tls_desc(); |
| } |
| |
| /* Get a TLS, returns 0 on failure. Vcores have their own TLS, and any thread |
| * created by a user-level scheduler needs to create a TLS as well. */ |
| void *allocate_tls(void) |
| { |
| void *tcb = _dl_allocate_tls(NULL); |
| if (!tcb) |
| return 0; |
| #ifdef TLS_TCB_AT_TP |
| /* Make sure the TLS is set up properly - its tcb pointer points to |
| * itself. Keep this in sync with sysdeps/akaros/XXX/tls.h. For |
| * whatever reason, dynamically linked programs do not need this to be |
| * redone, but statics do. */ |
| tcbhead_t *head = (tcbhead_t*)tcb; |
| head->tcb = tcb; |
| head->self = tcb; |
| head->pointer_guard = THREAD_SELF->header.pointer_guard; |
| head->stack_guard = THREAD_SELF->header.stack_guard; |
| #endif |
| return tcb; |
| } |
| |
| /* Free a previously allocated TLS region */ |
| void free_tls(void *tcb) |
| { |
| _dl_deallocate_tls(tcb, TRUE); |
| } |
| |
| /* Reinitialize / reset / refresh a TLS to its initial values. This doesn't do |
| * it properly yet, it merely frees and re-allocates the TLS, which is why we're |
| * slightly ghetto and return the pointer you should use for the TCB. */ |
| void *reinit_tls(void *tcb) |
| { |
| /* TODO: keep this in sync with the methods used in |
| * allocate_transition_tls() */ |
| free_tls(tcb); |
| return allocate_tls(); |
| } |