blob: 3fc3e5cffc1034618ad92ef33b5e87f332e8d036 [file] [log] [blame]
#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();
}