| #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(); | 
 | } |