Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright (c) 2015 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 #include "native_client/src/shared/platform/nacl_log.h" | |
| 8 #include "native_client/src/shared/srpc/nacl_srpc.h" | |
| 9 #include "native_client/src/untrusted/irt/irt_dev.h" | |
| 10 #include "native_client/src/untrusted/irt/irt_interfaces.h" | |
| 11 | |
| 12 #include <string.h> | |
| 13 | |
| 14 static const int kMaxObjectFiles = 16; | |
| 15 | |
| 16 static const struct PNaClSubzeroFunctions *g_funcs; | |
| 17 | |
| 18 static void stream_init_with_split( | |
| 19 NaClSrpcRpc *rpc, NaClSrpcArg **in_args, | |
| 20 NaClSrpcArg **out_args, NaClSrpcClosure *done) { | |
| 21 int num_threads = in_args[0]->u.ival; | |
| 22 if (num_threads < 1) { | |
| 23 NaClLog(LOG_FATAL, "Invalid # of threads (%d)\n", num_threads); | |
| 24 } | |
| 25 /* | |
| 26 * Only one object file is needed for subzero. | |
|
Jim Stichnoth
2015/03/23 18:13:40
Subzero
JF
2015/03/23 18:33:54
SubZero.
/TroLol
jvoung (off chromium)
2015/03/23 21:18:55
Acknowledged.
| |
| 27 * The others must be left empty and the linker must tolerate empty files. | |
| 28 */ | |
| 29 int obj_fd = in_args[1]->u.hval; | |
| 30 const char *cmd_line = in_args[kMaxObjectFiles + 1]->arrays.carr; | |
| 31 size_t cmd_line_len = in_args[kMaxObjectFiles + 1]->u.count; | |
| 32 int result = g_funcs->init_callback(num_threads, obj_fd, | |
| 33 cmd_line, cmd_line_len); | |
| 34 rpc->result = result == 0 ? NACL_SRPC_RESULT_OK : NACL_SRPC_RESULT_APP_ERROR; | |
| 35 /* Currently, errors are logged via log_fatal instead of returned. */ | |
| 36 if (result) | |
| 37 out_args[0]->arrays.str = strdup("There was some sort of error"); | |
| 38 else | |
| 39 out_args[0]->arrays.str = strdup("no error"); | |
| 40 done->Run(done); | |
| 41 } | |
| 42 | |
| 43 static void stream_chunk(NaClSrpcRpc *rpc, NaClSrpcArg **in_args, | |
| 44 NaClSrpcArg **out_args, NaClSrpcClosure *done) { | |
| 45 int result = g_funcs->data_callback( | |
| 46 (unsigned char *)in_args[0]->arrays.carr, | |
| 47 in_args[0]->u.count); | |
| 48 rpc->result = result == 0 ? NACL_SRPC_RESULT_OK : NACL_SRPC_RESULT_APP_ERROR; | |
| 49 done->Run(done); | |
| 50 } | |
| 51 | |
| 52 static void stream_end(NaClSrpcRpc *rpc, NaClSrpcArg **in_args, | |
| 53 NaClSrpcArg **out_args, NaClSrpcClosure *done) { | |
| 54 int result = g_funcs->end_callback(); | |
| 55 rpc->result = result == 0 ? NACL_SRPC_RESULT_OK : NACL_SRPC_RESULT_APP_ERROR; | |
| 56 out_args[0]->u.ival = 0; | |
| 57 out_args[1]->arrays.str = strdup(""); | |
| 58 out_args[2]->arrays.str = strdup(""); | |
| 59 /* Currently, errors are logged via log_fatal instead of returned. */ | |
| 60 if (result) | |
| 61 out_args[3]->arrays.str = strdup("There was some sort of error"); | |
| 62 else | |
| 63 out_args[3]->arrays.str = strdup("no error"); | |
| 64 done->Run(done); | |
| 65 } | |
| 66 | |
| 67 const struct NaClSrpcHandlerDesc srpc_methods[] = { | |
|
Mark Seaborn
2015/03/23 18:18:36
Nit: add "static"
jvoung (off chromium)
2015/03/23 21:18:55
Done.
| |
| 68 /* | |
| 69 * Protocol for streaming: | |
| 70 * StreamInitWithSplit(num_threads, obj_fd x 16, cmdline_flags) -> error_str | |
| 71 * StreamChunk(data) + | |
| 72 * TODO(jvoung): remove these is_shared_lib, etc. | |
| 73 * StreamEnd() -> (is_shared_lib, soname,dependencies, error_str) | |
| 74 */ | |
| 75 { "StreamInitWithSplit:ihhhhhhhhhhhhhhhhC:s", stream_init_with_split }, | |
| 76 { "StreamChunk:C:", stream_chunk }, | |
| 77 { "StreamEnd::isss", stream_end }, | |
| 78 { NULL, NULL }, | |
| 79 }; | |
| 80 | |
| 81 static void serve_translate_request( | |
| 82 const struct PNaClSubzeroFunctions *funcs) { | |
| 83 g_funcs = funcs; | |
| 84 if (!NaClSrpcModuleInit()) { | |
| 85 NaClLog(LOG_FATAL, "NaClSrpcModuleInit() failed\n"); | |
| 86 } | |
| 87 if (!NaClSrpcAcceptClientConnection(srpc_methods)) { | |
| 88 NaClLog(LOG_FATAL, "NaClSrpcAcceptClientConnection() failed\n"); | |
| 89 } | |
| 90 NaClSrpcModuleFini(); | |
| 91 } | |
| 92 | |
| 93 static void log_fatal(const char *msg) { | |
|
Mark Seaborn
2015/03/23 18:09:38
I don't understand the reason for having this.
Yo
jvoung (off chromium)
2015/03/23 21:18:55
Ah... didn't think that the hook was only for trus
| |
| 94 NaClLog(LOG_FATAL, "%s\n", msg); | |
| 95 } | |
| 96 | |
| 97 const struct nacl_irt_private_pnacl_translator_subzero | |
| 98 nacl_irt_private_pnacl_translator_subzero = { | |
| 99 serve_translate_request, | |
| 100 log_fatal | |
| 101 }; | |
| OLD | NEW |