Index: src/trusted/service_runtime/arch/x86_64/nacl_tls_64.c |
diff --git a/src/trusted/service_runtime/arch/x86_64/nacl_tls_64.c b/src/trusted/service_runtime/arch/x86_64/nacl_tls_64.c |
index d6e322555cca449eae8a929c60271dca0f0938de..18ac1dc68e6462c6d9d5f3f7fa9c3e4378d67243 100644 |
--- a/src/trusted/service_runtime/arch/x86_64/nacl_tls_64.c |
+++ b/src/trusted/service_runtime/arch/x86_64/nacl_tls_64.c |
@@ -143,8 +143,8 @@ uint32_t NaClGetThreadIdx(struct NaClAppThread *natp) { |
#if NACL_OSX |
-pthread_key_t nacl_thread_info_key; |
-uint32_t nacl_thread_index_tls_offset; |
+static pthread_key_t nacl_thread_info_key; |
+uint32_t nacl_current_thread_tls_offset; |
int NaClTlsInit(void) { |
int errnum; |
@@ -197,7 +197,8 @@ int NaClTlsInit(void) { |
errnum); |
return 0; |
} |
- nacl_thread_index_tls_offset = pthread_tsd_offset + 8 * nacl_thread_info_key; |
+ nacl_current_thread_tls_offset = |
+ pthread_tsd_offset + 8 * nacl_thread_info_key; |
return 1; |
} |
@@ -213,8 +214,8 @@ void NaClTlsFini(void) { |
return; |
} |
-void NaClTlsSetIdx(uint32_t tls_idx) { |
- uint32_t tls_idx_check; |
+void NaClTlsSetCurrentThread(struct NaClAppThread *natp) { |
+ struct NaClThreadContext *ntcp_check; |
#if 1 /* PARANOIA */ |
if (NULL != pthread_getspecific(nacl_thread_info_key)) { |
@@ -222,18 +223,21 @@ void NaClTlsSetIdx(uint32_t tls_idx) { |
"NaClSetThreadInfo invoked twice for the same thread\n"); |
} |
#endif |
- pthread_setspecific(nacl_thread_info_key, (void *) (uintptr_t) tls_idx); |
+ if (pthread_setspecific(nacl_thread_info_key, &natp->user) != 0) { |
+ NaClLog(LOG_FATAL, "NaClTlsSetCurrentThread: " |
+ "pthread_setspecific() failed\n"); |
+ } |
/* |
* Sanity check: Make sure that reading back the value using our |
* knowledge of Mac OS X's TLS internals gives us the correct value. |
* This checks that we inferred _PTHREAD_TSD_OFFSET correctly earlier. |
*/ |
- __asm__("movl %%gs:(%1), %0" |
- : "=r"(tls_idx_check) |
- : "r"(nacl_thread_index_tls_offset)); |
- if (tls_idx_check != tls_idx) { |
- NaClLog(LOG_FATAL, "NaClTlsSetIdx: Sanity check failed: " |
+ __asm__("movq %%gs:(%1), %0" |
+ : "=r"(ntcp_check) |
+ : "r"(nacl_current_thread_tls_offset)); |
+ if (ntcp_check != &natp->user) { |
+ NaClLog(LOG_FATAL, "NaClTlsSetCurrentThread: Sanity check failed: " |
"TLS offset must be wrong\n"); |
} |
} |
@@ -247,17 +251,17 @@ void NaClTlsSetIdx(uint32_t tls_idx) { |
* this for x86-32 on OSX, since that's handled by NaCl "Classic" |
* where %gs gets swapped, and we use %gs >> 3 in the asm code.) |
*/ |
-uint32_t NaClTlsGetIdx(void) { |
- return (intptr_t) pthread_getspecific(nacl_thread_info_key); |
+struct NaClAppThread *NaClTlsGetCurrentThread(void) { |
+ struct NaClThreadContext *ntcp = pthread_getspecific(nacl_thread_info_key); |
+ return NaClAppThreadFromThreadContext(ntcp); |
} |
#elif NACL_LINUX || NACL_WINDOWS |
-THREAD uint32_t nacl_thread_index; |
-/* encoded index; 0 is used to indicate error */ |
+/* May be NULL if the current thread does not host a NaClAppThread. */ |
+THREAD struct NaClThreadContext *nacl_current_thread; |
int NaClTlsInit(void) { |
- |
NaClThreadStartupCheck(); |
if (!NaClThreadIdxInit()) { |
@@ -281,12 +285,12 @@ void NaClTlsFini(void) { |
* so, and on context switch we must access the TLS variable in order |
* to determine where to save the user register context. |
*/ |
-void NaClTlsSetIdx(uint32_t tls_idx) { |
- nacl_thread_index = tls_idx; |
+void NaClTlsSetCurrentThread(struct NaClAppThread *natp) { |
+ nacl_current_thread = &natp->user; |
} |
-uint32_t NaClTlsGetIdx(void) { |
- return nacl_thread_index; |
+struct NaClAppThread *NaClTlsGetCurrentThread(void) { |
+ return NaClAppThreadFromThreadContext(nacl_current_thread); |
} |
#else |