| // Copyright 2015 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/nacl/nonsfi/irt_mojo_nonsfi.h" |
| |
| #include "mojo/public/c/system/buffer.h" |
| #include "mojo/public/c/system/data_pipe.h" |
| #include "mojo/public/c/system/handle.h" |
| #include "mojo/public/c/system/message_pipe.h" |
| #include "mojo/public/c/system/time.h" |
| #include "mojo/public/c/system/wait.h" |
| #include "mojo/public/platform/nacl/mgl_irt.h" |
| #include "mojo/public/platform/nacl/mojo_irt.h" |
| #include "native_client/src/public/irt_core.h" |
| #include "native_client/src/untrusted/irt/irt_dev.h" |
| |
| namespace { |
| |
| MojoHandle g_mojo_handle = MOJO_HANDLE_INVALID; |
| bool g_running_translator = false; |
| |
| const struct nacl_irt_mojo kIrtMojo = { |
| nacl::MojoGetInitialHandle, |
| MojoGetTimeTicksNow, |
| MojoClose, |
| MojoGetRights, |
| MojoDuplicateHandleWithReducedRights, |
| MojoDuplicateHandle, |
| MojoWait, |
| MojoWaitMany, |
| MojoCreateMessagePipe, |
| MojoWriteMessage, |
| MojoReadMessage, |
| MojoCreateDataPipe, |
| MojoSetDataPipeProducerOptions, |
| MojoGetDataPipeProducerOptions, |
| MojoWriteData, |
| MojoBeginWriteData, |
| MojoEndWriteData, |
| MojoSetDataPipeConsumerOptions, |
| MojoGetDataPipeConsumerOptions, |
| MojoReadData, |
| MojoBeginReadData, |
| MojoEndReadData, |
| MojoCreateSharedBuffer, |
| MojoDuplicateBufferHandle, |
| MojoGetBufferInformation, |
| MojoMapBuffer, |
| MojoUnmapBuffer, |
| }; |
| |
| const struct nacl_irt_mgl kIrtMGL = { |
| MGLCreateContext, |
| MGLDestroyContext, |
| MGLMakeCurrent, |
| MGLGetCurrentContext, |
| MGLGetProcAddress, |
| }; |
| |
| const struct nacl_irt_mgl_onscreen kIrtMGLOnScreen = { |
| MGLResizeSurface, |
| MGLSwapBuffers, |
| }; |
| |
| const struct nacl_irt_mgl_signal_sync_point kIrtMGLSignalSyncPoint = { |
| MGLSignalSyncPoint, |
| }; |
| |
| int NotPNaClFilter() { |
| return g_running_translator; |
| } |
| |
| const struct nacl_irt_interface kIrtInterfaces[] = { |
| // Interface to call Mojo functions |
| { NACL_IRT_MOJO_v0_1, |
| &kIrtMojo, |
| sizeof(kIrtMojo), |
| nullptr }, |
| // Interface to call PNaCl translation |
| { NACL_IRT_PRIVATE_PNACL_TRANSLATOR_COMPILE_v0_1, |
| &nacl::nacl_irt_private_pnacl_translator_compile, |
| sizeof(nacl_irt_private_pnacl_translator_compile), |
| NotPNaClFilter }, |
| // Interface to call PNaCl linking |
| { NACL_IRT_PRIVATE_PNACL_TRANSLATOR_LINK_v0_1, |
| &nacl::nacl_irt_private_pnacl_translator_link, |
| sizeof(nacl_irt_private_pnacl_translator_link), |
| NotPNaClFilter }, |
| // Adds mechanism for opening object files, like crtbegin.o |
| { NACL_IRT_RESOURCE_OPEN_v0_1, |
| &nacl::nacl_irt_resource_open, |
| sizeof(nacl_irt_resource_open), |
| NotPNaClFilter }, |
| // GPU functions which give control over MGL context |
| { NACL_IRT_MGL_v0_1, |
| &kIrtMGL, |
| sizeof(kIrtMGL), |
| nullptr }, |
| // GPU functions which update framebuffer with respect to the display |
| { NACL_IRT_MGL_ONSCREEN_v0_1, |
| &kIrtMGLOnScreen, |
| sizeof(kIrtMGLOnScreen), |
| nullptr }, |
| // GPU functions to synchronize CPU and GPU services |
| { NACL_IRT_MGL_SIGNAL_SYNC_POINT_v0_1, |
| &kIrtMGLSignalSyncPoint, |
| sizeof(kIrtMGLSignalSyncPoint), |
| nullptr }, |
| }; |
| |
| } // namespace |
| |
| namespace nacl { |
| |
| MojoResult MojoGetInitialHandle(MojoHandle* handle) { |
| *handle = g_mojo_handle; |
| return MOJO_RESULT_OK; |
| } |
| |
| void MojoSetInitialHandle(MojoHandle handle) { |
| g_mojo_handle = handle; |
| } |
| |
| void MojoPnaclTranslatorEnable() { |
| g_running_translator = true; |
| } |
| |
| size_t MojoIrtNonsfiQuery(const char* interface_ident, |
| void* table, |
| size_t tablesize) { |
| size_t result = nacl_irt_query_list(interface_ident, table, tablesize, |
| kIrtInterfaces, sizeof(kIrtInterfaces)); |
| if (result != 0) |
| return result; |
| return nacl_irt_query_core(interface_ident, table, tablesize); |
| } |
| |
| } // namespace nacl |