OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 /* | 7 /* |
8 * NaCl Secure Runtime | 8 * NaCl Secure Runtime |
9 */ | 9 */ |
10 #include "native_client/src/include/portability_string.h" | 10 #include "native_client/src/include/portability_string.h" |
| 11 #include "native_client/src/shared/platform/nacl_global_secure_random.h" |
11 #include "native_client/src/trusted/service_runtime/nacl_app_thread.h" | 12 #include "native_client/src/trusted/service_runtime/nacl_app_thread.h" |
12 #include "native_client/src/trusted/service_runtime/nacl_signal.h" | 13 #include "native_client/src/trusted/service_runtime/nacl_signal.h" |
13 #include "native_client/src/trusted/service_runtime/nacl_tls.h" | 14 #include "native_client/src/trusted/service_runtime/nacl_tls.h" |
14 #include "native_client/src/trusted/service_runtime/sel_ldr.h" | 15 #include "native_client/src/trusted/service_runtime/sel_ldr.h" |
15 #include "native_client/src/trusted/service_runtime/sel_rt.h" | 16 #include "native_client/src/trusted/service_runtime/sel_rt.h" |
16 #include "native_client/src/trusted/service_runtime/arch/mips/sel_ldr_mips.h" | 17 #include "native_client/src/trusted/service_runtime/arch/mips/sel_ldr_mips.h" |
17 | 18 |
| 19 uint32_t nacl_guard_token; |
| 20 |
18 void NaClInitGlobals(void) { | 21 void NaClInitGlobals(void) { |
19 NaClLog(2, "NaClInitGlobals\n"); | 22 NaClLog(2, "NaClInitGlobals\n"); |
20 /* intentionally left empty */ | 23 nacl_guard_token = NaClGlobalSecureRngUint32(); |
21 } | 24 } |
22 | 25 |
23 | 26 |
24 int NaClAppThreadInitArchSpecific(struct NaClAppThread *natp, | 27 int NaClAppThreadInitArchSpecific(struct NaClAppThread *natp, |
25 nacl_reg_t prog_ctr, | 28 nacl_reg_t prog_ctr, |
26 nacl_reg_t stack_ptr) { | 29 nacl_reg_t stack_ptr) { |
27 struct NaClThreadContext *ntcp = &natp->user; | 30 struct NaClThreadContext *ntcp = &natp->user; |
28 | 31 |
29 /* | 32 /* |
30 * We call this function so that it does not appear to be dead code, | 33 * We call this function so that it does not appear to be dead code, |
31 * although it only contains compile-time assertions. | 34 * although it only contains compile-time assertions. |
32 */ | 35 */ |
33 NaClThreadContextOffsetCheck(); | 36 NaClThreadContextOffsetCheck(); |
34 | 37 |
35 memset((void *)ntcp, 0, sizeof(*ntcp)); | 38 memset((void *)ntcp, 0, sizeof(*ntcp)); |
36 ntcp->stack_ptr = stack_ptr; | 39 ntcp->stack_ptr = stack_ptr; |
37 ntcp->prog_ctr = prog_ctr; | 40 ntcp->prog_ctr = prog_ctr; |
38 ntcp->tls_idx = NaClTlsAllocate(natp); | 41 ntcp->tls_idx = NaClTlsAllocate(natp); |
39 if (ntcp->tls_idx == NACL_TLS_INDEX_INVALID) | 42 if (ntcp->tls_idx == NACL_TLS_INDEX_INVALID) |
40 return 0; | 43 return 0; |
| 44 ntcp->t8 = (uintptr_t) &ntcp->tls_value1; |
| 45 ntcp->guard_token = nacl_guard_token; |
41 | 46 |
42 NaClLog(4, "user.tls_idx: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->tls_idx); | 47 NaClLog(4, "user.tls_idx: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->tls_idx); |
43 NaClLog(4, "user.stack_ptr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->stack_ptr); | 48 NaClLog(4, "user.stack_ptr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->stack_ptr); |
44 NaClLog(4, "user.prog_ctr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->prog_ctr); | 49 NaClLog(4, "user.prog_ctr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->prog_ctr); |
45 | 50 |
46 return 1; | 51 return 1; |
47 } | 52 } |
48 | 53 |
49 | 54 |
50 void NaClThreadContextToSignalContext(const struct NaClThreadContext *th_ctx, | 55 void NaClThreadContextToSignalContext(const struct NaClThreadContext *th_ctx, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 sig_ctx->t2 = 0; | 105 sig_ctx->t2 = 0; |
101 sig_ctx->t3 = 0; | 106 sig_ctx->t3 = 0; |
102 sig_ctx->t4 = 0; | 107 sig_ctx->t4 = 0; |
103 sig_ctx->t5 = 0; | 108 sig_ctx->t5 = 0; |
104 sig_ctx->t9 = 0; | 109 sig_ctx->t9 = 0; |
105 sig_ctx->k0 = 0; | 110 sig_ctx->k0 = 0; |
106 sig_ctx->k1 = 0; | 111 sig_ctx->k1 = 0; |
107 sig_ctx->global_ptr = 0; | 112 sig_ctx->global_ptr = 0; |
108 sig_ctx->return_addr = 0; | 113 sig_ctx->return_addr = 0; |
109 } | 114 } |
OLD | NEW |