Index: src/trusted/service_runtime/arch/mips/nacl_tls.c |
diff --git a/src/trusted/service_runtime/arch/arm/nacl_tls.c b/src/trusted/service_runtime/arch/mips/nacl_tls.c |
similarity index 80% |
copy from src/trusted/service_runtime/arch/arm/nacl_tls.c |
copy to src/trusted/service_runtime/arch/mips/nacl_tls.c |
index 0475806eb2a312f5f37ef7b643e3f90ef7c7a3a1..f10206ce37f4928f35d835dd8c642b3246722337 100644 |
--- a/src/trusted/service_runtime/arch/arm/nacl_tls.c |
+++ b/src/trusted/service_runtime/arch/mips/nacl_tls.c |
@@ -9,7 +9,7 @@ |
#include "native_client/src/include/portability.h" |
#include "native_client/src/shared/platform/nacl_check.h" |
#include "native_client/src/shared/platform/nacl_sync_checked.h" |
-#include "native_client/src/trusted/service_runtime/arch/arm/sel_ldr_arm.h" |
+#include "native_client/src/trusted/service_runtime/arch/mips/sel_ldr_mips.h" |
#include "native_client/src/trusted/service_runtime/nacl_app_thread.h" |
#include "native_client/src/trusted/service_runtime/nacl_globals.h" |
#include "native_client/src/trusted/service_runtime/nacl_tls.h" |
@@ -18,7 +18,6 @@ |
static struct NaClMutex gNaClTlsMu; |
static int gNaClThreadIdxInUse[NACL_THREAD_MAX]; /* bool */ |
-static size_t const kNumThreads = NACL_ARRAY_SIZE_UNSAFE(gNaClThreadIdxInUse); |
/* |
* This holds the index of the current thread. |
@@ -44,7 +43,7 @@ int NaClTlsInit() { |
NaClLog(2, "NaClTlsInit\n"); |
- for (i = 0; i < kNumThreads; i++) { |
+ for (i = 0; i < NACL_ARRAY_SIZE(gNaClThreadIdxInUse); i++) { |
gNaClThreadIdxInUse[i] = 0; |
} |
if (!NaClMutexCtor(&gNaClTlsMu)) { |
@@ -62,11 +61,12 @@ void NaClTlsFini() { |
NaClMutexDtor(&gNaClTlsMu); |
} |
+ |
static int NaClThreadIdxAllocate() { |
- size_t i; |
+ int i; |
NaClXMutexLock(&gNaClTlsMu); |
- for (i = 1; i < kNumThreads; i++) { |
+ for (i = 0; i < NACL_THREAD_MAX; i++) { |
if (!gNaClThreadIdxInUse[i]) { |
gNaClThreadIdxInUse[i] = 1; |
break; |
@@ -74,12 +74,12 @@ static int NaClThreadIdxAllocate() { |
} |
NaClXMutexUnlock(&gNaClTlsMu); |
- if (kNumThreads != i) { |
+ if (NACL_THREAD_MAX != i) { |
return i; |
} |
NaClLog(LOG_ERROR, "NaClThreadIdxAllocate: no more slots for a thread\n"); |
- return NACL_TLS_INDEX_INVALID; |
+ return -1; |
} |
@@ -91,11 +91,18 @@ uint32_t NaClTlsAllocate(struct NaClAppThread *natp) { |
int idx = NaClThreadIdxAllocate(); |
NaClLog(2, "NaClTlsAllocate: $tp %x idx %d\n", natp->tls_values.tls1, idx); |
- if (NACL_TLS_INDEX_INVALID != idx) { |
- natp->user.r9 = natp->tls_values.tls1; |
+ if (-1 == idx) { |
+ NaClLog(LOG_FATAL, |
+ "NaClTlsAllocate: thread limit reached\n"); |
+ return NACL_TLS_INDEX_INVALID; |
} |
- return idx; |
+ natp->user.t8 = natp->tls_values.tls1; |
+ |
+ /* |
+ * Bias by 1: successful return value is never 0. |
+ */ |
+ return idx + 1; |
} |
@@ -103,18 +110,18 @@ void NaClTlsFree(struct NaClAppThread *natp) { |
uint32_t idx = NaClGetThreadIdx(natp); |
NaClLog(2, |
"NaClTlsFree: old idx %d $tp %x\n", |
- idx, natp->user.r9); |
+ idx, natp->user.t8); |
NaClXMutexLock(&gNaClTlsMu); |
- gNaClThreadIdxInUse[idx] = 0; |
+ gNaClThreadIdxInUse[idx - 1] = 0; |
NaClXMutexUnlock(&gNaClTlsMu); |
- natp->user.r9 = 0; |
+ natp->user.t8 = 0; |
} |
void NaClTlsChange(struct NaClAppThread *natp) { |
NaClLog(2, "NaClTlsChange: $tp %x\n", natp->tls_values.tls1); |
- natp->user.r9 = natp->tls_values.tls1; |
+ natp->user.t8 = natp->tls_values.tls1; |
} |