1 /*
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
4 * found in the LICENSE file.
5 */
6
7 /*
8 * NaCl Secure Runtime
9 */
10 #include "native_client/src/include/portability_string.h"
11 #include "native_client/src/shared/platform/nacl_global_secure_random.h"
12 #include "native_client/src/trusted/service_runtime/nacl_app_thread.h"
13 #include "native_client/src/trusted/service_runtime/nacl_signal.h"
14 #include "native_client/src/trusted/service_runtime/nacl_tls.h"
15 #include "native_client/src/trusted/service_runtime/sel_ldr.h"
16 #include "native_client/src/trusted/service_runtime/sel_rt.h"
17 #include "native_client/src/trusted/service_runtime/arch/arm/sel_ldr_arm.h"
18 #include "native_client/src/trusted/service_runtime/arch/arm/tramp_arm.h"
19
20
21 uint32_t nacl_guard_token;
22
23
NaClInitGlobals(void)24 void NaClInitGlobals(void) {
25 NaClLog(2, "NaClInitGlobals\n");
26 nacl_guard_token = NaClGlobalSecureRngUint32();
27 }
28
29
NaClAppThreadInitArchSpecific(struct NaClAppThread * natp,nacl_reg_t prog_ctr,nacl_reg_t stack_ptr)30 int NaClAppThreadInitArchSpecific(struct NaClAppThread *natp,
31 nacl_reg_t prog_ctr,
32 nacl_reg_t stack_ptr) {
33 struct NaClThreadContext *ntcp = &natp->user;
34
35 /*
36 * We call this function so that it does not appear to be dead code,
37 * although it only contains compile-time assertions.
38 */
39 NaClThreadContextOffsetCheck();
40
41 memset((void *)ntcp, 0, sizeof(*ntcp));
42 ntcp->stack_ptr = stack_ptr;
43 ntcp->prog_ctr = prog_ctr;
44 ntcp->tls_idx = NaClTlsAllocate(natp);
45 if (ntcp->tls_idx == NACL_TLS_INDEX_INVALID)
46 return 0;
47 ntcp->r9 = (uintptr_t) &ntcp->tls_value1;
48 ntcp->syscall_routine = (uintptr_t) NaClSyscallSeg;
49 ntcp->guard_token = nacl_guard_token;
50
51 /*
52 * Save the system's state of the FPSCR so we can restore
53 * the same state when returning to trusted code.
54 */
55 __asm__ __volatile__("fmrx %0, fpscr" : "=r" (ntcp->sys_fpscr));
56
57 NaClLog(4, "user.tls_idx: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->tls_idx);
58 NaClLog(4, "user.stack_ptr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->stack_ptr);
59 NaClLog(4, "user.prog_ctr: 0x%08"NACL_PRIxNACL_REG"\n", ntcp->prog_ctr);
60
61 return 1;
62 }
63
64
NaClThreadContextToSignalContext(const struct NaClThreadContext * th_ctx,struct NaClSignalContext * sig_ctx)65 void NaClThreadContextToSignalContext(const struct NaClThreadContext *th_ctx,
66 struct NaClSignalContext *sig_ctx) {
67 sig_ctx->r0 = 0;
68 sig_ctx->r1 = 0;
69 sig_ctx->r2 = 0;
70 sig_ctx->r3 = 0;
71 sig_ctx->r4 = th_ctx->r4;
72 sig_ctx->r5 = th_ctx->r5;
73 sig_ctx->r6 = th_ctx->r6;
74 sig_ctx->r7 = th_ctx->r7;
75 sig_ctx->r8 = th_ctx->r8;
76 sig_ctx->r9 = th_ctx->r9;
77 sig_ctx->r10 = th_ctx->r10;
78 sig_ctx->r11 = th_ctx->fp;
79 sig_ctx->r12 = 0;
80 sig_ctx->stack_ptr = th_ctx->stack_ptr;
81 sig_ctx->lr = 0;
82 sig_ctx->prog_ctr = th_ctx->new_prog_ctr;
83 sig_ctx->cpsr = 0;
84 }
85
86
NaClSignalContextUnsetClobberedRegisters(struct NaClSignalContext * sig_ctx)87 void NaClSignalContextUnsetClobberedRegisters(
88 struct NaClSignalContext *sig_ctx) {
89 sig_ctx->r0 = 0;
90 sig_ctx->r1 = 0;
91 sig_ctx->r2 = 0;
92 sig_ctx->r3 = 0;
93 sig_ctx->r12 = 0;
94 sig_ctx->lr = 0;
95 sig_ctx->cpsr = 0;
96 }
97