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 #include <string.h> |
| 8 |
7 #include "native_client/src/shared/gio/gio.h" | 9 #include "native_client/src/shared/gio/gio.h" |
8 #include "native_client/src/shared/platform/nacl_check.h" | 10 #include "native_client/src/shared/platform/nacl_check.h" |
9 #include "native_client/src/shared/platform/nacl_log.h" | 11 #include "native_client/src/shared/platform/nacl_log.h" |
10 #include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h
" | 12 #include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h
" |
11 #include "native_client/src/trusted/service_runtime/nacl_all_modules.h" | 13 #include "native_client/src/trusted/service_runtime/nacl_all_modules.h" |
12 #include "native_client/src/trusted/service_runtime/nacl_app.h" | 14 #include "native_client/src/trusted/service_runtime/nacl_app.h" |
13 #include "native_client/src/trusted/service_runtime/nacl_app_thread.h" | 15 #include "native_client/src/trusted/service_runtime/nacl_app_thread.h" |
14 #include "native_client/src/trusted/service_runtime/nacl_copy.h" | 16 #include "native_client/src/trusted/service_runtime/nacl_copy.h" |
15 #include "native_client/src/trusted/service_runtime/nacl_syscall_handlers.h" | 17 #include "native_client/src/trusted/service_runtime/nacl_syscall_handlers.h" |
16 #include "native_client/src/trusted/service_runtime/nacl_valgrind_hooks.h" | 18 #include "native_client/src/trusted/service_runtime/nacl_valgrind_hooks.h" |
(...skipping 17 matching lines...) Expand all Loading... |
34 | 36 |
35 static int32_t MySyscallExit(struct NaClAppThread *natp) { | 37 static int32_t MySyscallExit(struct NaClAppThread *natp) { |
36 NaClCopyInDropLock(natp->nap); | 38 NaClCopyInDropLock(natp->nap); |
37 printf("Inside custom test 'exit' syscall\n"); | 39 printf("Inside custom test 'exit' syscall\n"); |
38 fflush(stdout); | 40 fflush(stdout); |
39 _exit(0); | 41 _exit(0); |
40 } | 42 } |
41 | 43 |
42 int main(int argc, char **argv) { | 44 int main(int argc, char **argv) { |
43 struct NaClApp app; | 45 struct NaClApp app; |
| 46 struct NaClApp *nap = &app; |
44 struct GioMemoryFileSnapshot gio_file; | 47 struct GioMemoryFileSnapshot gio_file; |
45 struct NaClSyscallTableEntry syscall_table[NACL_MAX_SYSCALLS] = {{0}}; | 48 struct NaClSyscallTableEntry syscall_table[NACL_MAX_SYSCALLS] = {{0}}; |
46 int index; | 49 int index; |
| 50 int use_separate_thread = 0; |
47 | 51 |
48 NaClHandleBootstrapArgs(&argc, &argv); | 52 NaClHandleBootstrapArgs(&argc, &argv); |
49 | 53 |
50 for (index = 0; index < NACL_MAX_SYSCALLS; index++) { | 54 for (index = 0; index < NACL_MAX_SYSCALLS; index++) { |
51 syscall_table[index].handler = NotImplementedDecoder; | 55 syscall_table[index].handler = NotImplementedDecoder; |
52 } | 56 } |
53 syscall_table[TEST_SYSCALL_INVOKE].handler = MySyscallInvoke; | 57 syscall_table[TEST_SYSCALL_INVOKE].handler = MySyscallInvoke; |
54 syscall_table[TEST_SYSCALL_EXIT].handler = MySyscallExit; | 58 syscall_table[TEST_SYSCALL_EXIT].handler = MySyscallExit; |
55 | 59 |
| 60 if (argc >= 2 && strcmp(argv[1], "--use_separate_thread") == 0) { |
| 61 use_separate_thread = 1; |
| 62 argc--; |
| 63 argv++; |
| 64 } |
56 if (argc != 2) { | 65 if (argc != 2) { |
57 NaClLog(LOG_FATAL, "Expected 1 argument: executable filename\n"); | 66 NaClLog(LOG_FATAL, "Expected 1 argument: executable filename\n"); |
58 } | 67 } |
59 | 68 |
60 NaClAllModulesInit(); | 69 NaClAllModulesInit(); |
61 | 70 |
62 NaClFileNameForValgrind(argv[1]); | 71 NaClFileNameForValgrind(argv[1]); |
63 CHECK(GioMemoryFileSnapshotCtor(&gio_file, argv[1])); | 72 CHECK(GioMemoryFileSnapshotCtor(&gio_file, argv[1])); |
64 CHECK(NaClAppWithSyscallTableCtor(&app, syscall_table)); | 73 CHECK(NaClAppWithSyscallTableCtor(&app, syscall_table)); |
65 CHECK(NaClAppLoadFile((struct Gio *) &gio_file, &app) == LOAD_OK); | 74 CHECK(NaClAppLoadFile((struct Gio *) &gio_file, &app) == LOAD_OK); |
66 CHECK(NaClAppPrepareToLaunch(&app) == LOAD_OK); | 75 CHECK(NaClAppPrepareToLaunch(&app) == LOAD_OK); |
67 /* | |
68 * TODO(mseaborn): It would be nice if we did not have to create a | |
69 * separate thread for running the sandboxed code. | |
70 */ | |
71 CHECK(NaClCreateMainThread(&app, 0, NULL, NULL)); | |
72 NaClWaitForMainThreadToExit(&app); | |
73 | 76 |
74 NaClLog(LOG_FATAL, "The exit syscall is not supposed to be callable\n"); | 77 /* These are examples of two different ways to run untrusted code. */ |
| 78 if (use_separate_thread) { |
| 79 /* Create a new host thread that is managed by NaCl. */ |
| 80 CHECK(NaClCreateMainThread(&app, 0, NULL, NULL)); |
| 81 NaClWaitForMainThreadToExit(&app); |
| 82 |
| 83 NaClLog(LOG_FATAL, "The exit syscall is not supposed to be callable\n"); |
| 84 } else { |
| 85 /* Reuse the existing host thread for running untrusted code. */ |
| 86 struct NaClAppThread *natp; |
| 87 uintptr_t stack_ptr = NaClGetInitialStackTop(nap); |
| 88 /* Ensure the stack pointer is suitably aligned. */ |
| 89 stack_ptr &= ~NACL_STACK_ALIGN_MASK; |
| 90 stack_ptr -= NACL_STACK_PAD_BELOW_ALIGN; |
| 91 /* TODO(mseaborn): Make this interface more straightforward to use. */ |
| 92 stack_ptr = NaClSysToUserStackAddr(nap, NaClUserToSys(nap, stack_ptr)); |
| 93 |
| 94 natp = NaClAppThreadMake(nap, nap->initial_entry_pt, stack_ptr, 0, 0); |
| 95 CHECK(natp != NULL); |
| 96 NaClAppThreadLauncher(natp); |
| 97 |
| 98 NaClLog(LOG_FATAL, "NaClThreadLauncher() should not return\n"); |
| 99 } |
75 | 100 |
76 return 1; | 101 return 1; |
77 } | 102 } |
OLD | NEW |