Chromium Code Reviews| Index: mojo/monacl/monacl_sel_main.cc |
| diff --git a/mojo/monacl/monacl_sel_main.cc b/mojo/monacl/monacl_sel_main.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..782fa186b45a08b11232a2d043498114a80ea70e |
| --- /dev/null |
| +++ b/mojo/monacl/monacl_sel_main.cc |
| @@ -0,0 +1,112 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "mojo/monacl/monacl_sel_main.h" |
| + |
| +#include "mojo/monacl/mojo_syscall.h" |
| +#include "native_client/src/public/nacl_app.h" |
| +// For opening IRT |
| +#include "native_client/src/trusted/desc/nacl_desc_io.h" |
| +// For opening IRT |
| +#include "native_client/src/trusted/service_runtime/include/sys/fcntl.h" |
| +// For loading main nexe |
| +#include "native_client/src/trusted/service_runtime/load_file.h" |
| +#include "native_client/src/trusted/service_runtime/nacl_all_modules.h" |
| +#include "native_client/src/trusted/service_runtime/nacl_bootstrap_channel_error_reporter.h" |
| +#include "native_client/src/trusted/service_runtime/nacl_error_log_hook.h" |
| +#include "native_client/src/trusted/service_runtime/sel_ldr.h" |
| +#include "native_client/src/trusted/service_runtime/sel_main_common.h" |
| +#include "native_client/src/trusted/service_runtime/sel_qualify.h" |
| + |
| +int LaunchNaCl(const char *nexe_file, const char *irt_file, |
| + int app_argc, char *app_argv[]) { |
| + // Default to error. |
| + int ret_code = 1; |
| + NaClErrorCode errcode; |
| + struct NaClDesc *blob_file = NULL; |
| + |
| + const char *env = NULL; |
| + |
| + NaClAllModulesInit(); |
| + |
| + struct NaClApp* nap = NaClAppCreate(); |
| + if (nap == NULL) { |
| + NaClLog(LOG_ERROR, "NaClAppCreate() failed"); |
| + return ret_code; |
| + } |
| + |
| + int skip_qualification = 0; |
| + if (skip_qualification) { |
| + NaClLog(LOG_WARNING, "PLATFORM QUALIFICATION DISABLED - " |
| + "Native Client's sandbox will be unreliable!\n"); |
| + } else { |
| + // HACK no fault injection. |
| + errcode = NaClRunSelQualificationTests(); |
| + if (LOAD_OK != errcode) { |
| + nap->module_load_status = errcode; |
| + fprintf(stderr, "Error while loading in SelMain: %s\n", |
| + NaClErrorString(errcode)); |
| + } |
| + } |
| + |
| + NaClBootstrapChannelErrorReporterInit(); |
| + NaClErrorLogHookInit(NaClBootstrapChannelErrorReporter, nap); |
| + |
| + //NaClFileNameForValgrind(irt_file); |
| + blob_file = (struct NaClDesc *) NaClDescIoDescOpen( |
| + irt_file, NACL_ABI_O_RDONLY, 0); |
| + if (NULL == blob_file) { |
| + perror("sel_main"); |
| + fprintf(stderr, "Cannot open \"%s\".\n", irt_file); |
| + exit(1); |
| + } |
| + |
| + NaClAppInitialDescriptorHookup(nap); |
| + |
| + InjectMojo(nap); |
| + |
| + errcode = NaClAppLoadFileFromFilename(nap, nexe_file); |
| + if (LOAD_OK != errcode) { |
| + fprintf(stderr, "Error while loading \"%s\": %s\n", |
| + nexe_file, |
| + NaClErrorString(errcode)); |
| + fprintf(stderr, |
| + ("Using the wrong type of nexe (nacl-x86-32" |
| + " on an x86-64 or vice versa)\n" |
| + "or a corrupt nexe file may be" |
| + " responsible for this error.\n")); |
| + } |
| + |
| + errcode = NaClMainLoadIrt(nap, blob_file, NULL); |
| + if (LOAD_OK != errcode) { |
| + fprintf(stderr, "Error while loading \"%s\": %s\n", |
| + irt_file, |
| + NaClErrorString(errcode)); |
| + } |
| + |
| + NaClAppStartModule(nap, NULL, NULL); |
|
Mark Seaborn
2014/07/21 16:31:39
Don't duplicate all of this NaCl-side startup code
Nick Bray (chromium)
2014/07/21 22:38:36
This is a discussion for elsewhere. Getting the i
Mark Seaborn
2014/07/21 23:25:44
Can you compromise on at least part of the cleanup
|
| + |
| + if (!NaClAppLaunchServiceThreads(nap)) { |
| + fprintf(stderr, "Launch service threads failed\n"); |
| + goto done; |
| + } |
| + |
| + if (!NaClCreateMainThread(nap, |
| + app_argc, |
| + app_argv, |
| + &env)) { |
| + fprintf(stderr, "creating main thread failed\n"); |
| + goto done; |
| + } |
| + |
| + { |
| + fprintf(stderr, "waiting for main thread\n"); |
| + ret_code = NaClWaitForMainThreadToExit(nap); |
| + fprintf(stderr, "ret code %d\n", ret_code); |
| + } |
| + |
| + done: |
| + NaClAllModulesFini(); |
| + return ret_code; |
| +} |