| // 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. |
| |
| // WARNING this file was generated by generate_nacl_bindings.py |
| // Do not edit by hand. |
| |
| #include "nacl_bindings/mojo_syscall.h" |
| |
| #include <stdio.h> |
| |
| #include "mojo/public/c/system/core.h" |
| #include "mojo/public/platform/native/system_impl_private.h" |
| #include "nacl_bindings/mojo_syscall_internal.h" |
| #include "native_client/src/public/chrome_main.h" |
| #include "native_client/src/public/nacl_app.h" |
| #include "native_client/src/trusted/desc/nacl_desc_custom.h" |
| |
| MojoHandle g_mojo_handle = MOJO_HANDLE_INVALID; |
| MojoSystemImpl g_mojo_system = nullptr; |
| |
| namespace { |
| |
| MojoResult _MojoGetInitialHandle(MojoHandle* handle) { |
| *handle = g_mojo_handle; |
| return MOJO_RESULT_OK; |
| } |
| |
| void MojoDescDestroy(void* handle) { |
| } |
| |
| ssize_t MojoDescSendMsg(void* handle, |
| const struct NaClImcTypedMsgHdr* msg, |
| int flags) { |
| struct NaClApp* nap = static_cast<struct NaClApp*>(handle); |
| |
| if (msg->iov_length != 1 || msg->ndesc_length != 0) { |
| return -1; |
| } |
| |
| uint32_t volatile* params = static_cast<uint32_t volatile*>(msg->iov[0].base); |
| size_t num_params = msg->iov[0].length / sizeof(*params); |
| |
| if (num_params < 1) { |
| return -1; |
| } |
| |
| uint32_t msg_type = params[0]; |
| switch (msg_type) { |
| case 0: { |
| if (num_params != 5) { |
| return -1; |
| } |
| const struct MojoCreateSharedBufferOptions* options; |
| uint64_t num_bytes_value; |
| MojoHandle volatile* shared_buffer_handle_ptr; |
| MojoHandle shared_buffer_handle_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[2], &num_bytes_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, |
| &shared_buffer_handle_value, |
| &shared_buffer_handle_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplCreateSharedBuffer( |
| g_mojo_system, options, num_bytes_value, &shared_buffer_handle_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *shared_buffer_handle_ptr = shared_buffer_handle_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 1: { |
| if (num_params != 5) { |
| return -1; |
| } |
| MojoHandle buffer_handle_value; |
| const struct MojoDuplicateBufferHandleOptions* options; |
| MojoHandle volatile* new_buffer_handle_ptr; |
| MojoHandle new_buffer_handle_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], &buffer_handle_value)) { |
| return -1; |
| } |
| if (!ConvertExtensibleStructInput(nap, params[2], true, &options)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, &new_buffer_handle_value, |
| &new_buffer_handle_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplDuplicateBufferHandle( |
| g_mojo_system, buffer_handle_value, options, |
| &new_buffer_handle_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *new_buffer_handle_ptr = new_buffer_handle_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 2: |
| fprintf(stderr, "MojoMapBuffer not implemented\n"); |
| return -1; |
| case 3: |
| fprintf(stderr, "MojoUnmapBuffer not implemented\n"); |
| return -1; |
| case 4: { |
| if (num_params != 5) { |
| return -1; |
| } |
| const struct MojoCreateDataPipeOptions* options; |
| MojoHandle volatile* data_pipe_producer_handle_ptr; |
| MojoHandle data_pipe_producer_handle_value; |
| MojoHandle volatile* data_pipe_consumer_handle_ptr; |
| MojoHandle data_pipe_consumer_handle_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[2], false, |
| &data_pipe_producer_handle_value, |
| &data_pipe_producer_handle_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, |
| &data_pipe_consumer_handle_value, |
| &data_pipe_consumer_handle_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplCreateDataPipe( |
| g_mojo_system, options, &data_pipe_producer_handle_value, |
| &data_pipe_consumer_handle_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *data_pipe_producer_handle_ptr = data_pipe_producer_handle_value; |
| *data_pipe_consumer_handle_ptr = data_pipe_consumer_handle_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 5: { |
| if (num_params != 6) { |
| return -1; |
| } |
| MojoHandle data_pipe_producer_handle_value; |
| const void* elements; |
| uint32_t volatile* num_bytes_ptr; |
| uint32_t num_bytes_value; |
| MojoWriteDataFlags flags_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], |
| &data_pipe_producer_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, &num_bytes_value, |
| &num_bytes_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[4], &flags_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[2], num_bytes_value, 1, false, |
| &elements)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplWriteData( |
| g_mojo_system, data_pipe_producer_handle_value, elements, |
| &num_bytes_value, flags_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *num_bytes_ptr = num_bytes_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 6: |
| fprintf(stderr, "MojoBeginWriteData not implemented\n"); |
| return -1; |
| case 7: { |
| if (num_params != 4) { |
| return -1; |
| } |
| MojoHandle data_pipe_producer_handle_value; |
| uint32_t num_bytes_written_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], |
| &data_pipe_producer_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[2], &num_bytes_written_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplEndWriteData(g_mojo_system, |
| data_pipe_producer_handle_value, |
| num_bytes_written_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 8: { |
| if (num_params != 6) { |
| return -1; |
| } |
| MojoHandle data_pipe_consumer_handle_value; |
| void* elements; |
| uint32_t volatile* num_bytes_ptr; |
| uint32_t num_bytes_value; |
| MojoReadDataFlags flags_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], |
| &data_pipe_consumer_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, &num_bytes_value, |
| &num_bytes_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[4], &flags_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[2], num_bytes_value, 1, false, |
| &elements)) { |
| return -1; |
| } |
| } |
| |
| result_value = |
| MojoSystemImplReadData(g_mojo_system, data_pipe_consumer_handle_value, |
| elements, &num_bytes_value, flags_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *num_bytes_ptr = num_bytes_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 9: |
| fprintf(stderr, "MojoBeginReadData not implemented\n"); |
| return -1; |
| case 10: { |
| if (num_params != 4) { |
| return -1; |
| } |
| MojoHandle data_pipe_consumer_handle_value; |
| uint32_t num_bytes_read_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], |
| &data_pipe_consumer_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[2], &num_bytes_read_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplEndReadData( |
| g_mojo_system, data_pipe_consumer_handle_value, num_bytes_read_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 11: { |
| if (num_params != 2) { |
| return -1; |
| } |
| MojoTimeTicks volatile* result_ptr; |
| MojoTimeTicks result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarOutput(nap, params[1], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplGetTimeTicksNow(g_mojo_system); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 12: { |
| if (num_params != 3) { |
| return -1; |
| } |
| MojoHandle handle_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], &handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[2], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplClose(g_mojo_system, handle_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 13: { |
| if (num_params != 6) { |
| return -1; |
| } |
| MojoHandle handle_value; |
| MojoHandleSignals signals_value; |
| MojoDeadline deadline_value; |
| MojoHandleSignalsState volatile* signals_state_ptr; |
| MojoHandleSignalsState signals_state_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], &handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[2], &signals_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[3], &deadline_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[4], true, &signals_state_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplWait( |
| g_mojo_system, handle_value, signals_value, deadline_value, |
| signals_state_ptr ? &signals_state_value : NULL); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (signals_state_ptr != NULL) { |
| memcpy_volatile_out(signals_state_ptr, &signals_state_value, |
| sizeof(MojoHandleSignalsState)); |
| } |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 14: { |
| if (num_params != 8) { |
| return -1; |
| } |
| const MojoHandle* handles; |
| const MojoHandleSignals* signals; |
| uint32_t num_handles_value; |
| MojoDeadline deadline_value; |
| uint32_t volatile* result_index_ptr; |
| uint32_t result_index_value; |
| struct MojoHandleSignalsState* signals_states; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[3], &num_handles_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[4], &deadline_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[5], true, &result_index_value, |
| &result_index_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[1], num_handles_value, sizeof(*handles), |
| false, &handles)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[2], num_handles_value, sizeof(*signals), |
| false, &signals)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[6], num_handles_value, |
| sizeof(*signals_states), true, &signals_states)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplWaitMany( |
| g_mojo_system, handles, signals, num_handles_value, deadline_value, |
| result_index_ptr ? &result_index_value : NULL, signals_states); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (result_index_ptr != NULL) { |
| *result_index_ptr = result_index_value; |
| } |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 15: { |
| if (num_params != 5) { |
| return -1; |
| } |
| const struct MojoCreateMessagePipeOptions* options; |
| MojoHandle volatile* message_pipe_handle0_ptr; |
| MojoHandle message_pipe_handle0_value; |
| MojoHandle volatile* message_pipe_handle1_ptr; |
| MojoHandle message_pipe_handle1_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[2], false, |
| &message_pipe_handle0_value, |
| &message_pipe_handle0_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], false, |
| &message_pipe_handle1_value, |
| &message_pipe_handle1_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplCreateMessagePipe( |
| g_mojo_system, options, &message_pipe_handle0_value, |
| &message_pipe_handle1_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *message_pipe_handle0_ptr = message_pipe_handle0_value; |
| *message_pipe_handle1_ptr = message_pipe_handle1_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 16: { |
| if (num_params != 8) { |
| return -1; |
| } |
| MojoHandle message_pipe_handle_value; |
| const void* bytes; |
| uint32_t num_bytes_value; |
| const MojoHandle* handles; |
| uint32_t num_handles_value; |
| MojoWriteMessageFlags flags_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], &message_pipe_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[3], &num_bytes_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[5], &num_handles_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[6], &flags_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[2], num_bytes_value, 1, true, &bytes)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[4], num_handles_value, sizeof(*handles), |
| true, &handles)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplWriteMessage( |
| g_mojo_system, message_pipe_handle_value, bytes, num_bytes_value, |
| handles, num_handles_value, flags_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 17: { |
| if (num_params != 8) { |
| return -1; |
| } |
| MojoHandle message_pipe_handle_value; |
| void* bytes; |
| uint32_t volatile* num_bytes_ptr; |
| uint32_t num_bytes_value; |
| MojoHandle* handles; |
| uint32_t volatile* num_handles_ptr; |
| uint32_t num_handles_value; |
| MojoReadMessageFlags flags_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInput(nap, params[1], &message_pipe_handle_value)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[3], true, &num_bytes_value, |
| &num_bytes_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInOut(nap, params[5], true, &num_handles_value, |
| &num_handles_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarInput(nap, params[6], &flags_value)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[2], num_bytes_value, 1, true, &bytes)) { |
| return -1; |
| } |
| if (!ConvertArray(nap, params[4], num_handles_value, sizeof(*handles), |
| true, &handles)) { |
| return -1; |
| } |
| } |
| |
| result_value = MojoSystemImplReadMessage( |
| g_mojo_system, message_pipe_handle_value, bytes, |
| num_bytes_ptr ? &num_bytes_value : NULL, handles, |
| num_handles_ptr ? &num_handles_value : NULL, flags_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (num_bytes_ptr != NULL) { |
| *num_bytes_ptr = num_bytes_value; |
| } |
| if (num_handles_ptr != NULL) { |
| *num_handles_ptr = num_handles_value; |
| } |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| case 18: { |
| if (num_params != 3) { |
| return -1; |
| } |
| MojoHandle volatile* handle_ptr; |
| MojoHandle handle_value; |
| MojoResult volatile* result_ptr; |
| MojoResult result_value; |
| { |
| ScopedCopyLock copy_lock(nap); |
| if (!ConvertScalarInOut(nap, params[1], false, &handle_value, |
| &handle_ptr)) { |
| return -1; |
| } |
| if (!ConvertScalarOutput(nap, params[2], false, &result_ptr)) { |
| return -1; |
| } |
| } |
| |
| result_value = _MojoGetInitialHandle(&handle_value); |
| |
| { |
| ScopedCopyLock copy_lock(nap); |
| *handle_ptr = handle_value; |
| *result_ptr = result_value; |
| } |
| |
| return 0; |
| } |
| } |
| |
| return -1; |
| } |
| |
| ssize_t MojoDescRecvMsg(void* handle, |
| struct NaClImcTypedMsgHdr* msg, |
| int flags) { |
| return -1; |
| } |
| |
| struct NaClDesc* MakeMojoDesc(struct NaClApp* nap) { |
| struct NaClDescCustomFuncs funcs = NACL_DESC_CUSTOM_FUNCS_INITIALIZER; |
| funcs.Destroy = MojoDescDestroy; |
| funcs.SendMsg = MojoDescSendMsg; |
| funcs.RecvMsg = MojoDescRecvMsg; |
| return NaClDescMakeCustomDesc(nap, &funcs); |
| } |
| |
| void MojoDisabledDescDestroy(void* handle) { |
| } |
| |
| ssize_t MojoDisabledDescSendMsg(void* handle, |
| const struct NaClImcTypedMsgHdr* msg, |
| int flags) { |
| fprintf(stderr, "Mojo is not currently supported."); |
| abort(); |
| } |
| |
| ssize_t MojoDisabledDescRecvMsg(void* handle, |
| struct NaClImcTypedMsgHdr* msg, |
| int flags) { |
| fprintf(stderr, "Mojo is not currently supported."); |
| abort(); |
| } |
| |
| struct NaClDesc* MakeDisabledMojoDesc(struct NaClApp* nap) { |
| struct NaClDescCustomFuncs funcs = NACL_DESC_CUSTOM_FUNCS_INITIALIZER; |
| funcs.Destroy = MojoDisabledDescDestroy; |
| funcs.SendMsg = MojoDisabledDescSendMsg; |
| funcs.RecvMsg = MojoDisabledDescRecvMsg; |
| return NaClDescMakeCustomDesc(nap, &funcs); |
| } |
| |
| } // namespace |
| |
| // The value for this FD must not conflict with uses inside Chromium. However, |
| // mojo/nacl doesn't depend on any Chromium headers, so we can't use a #define |
| // from there. |
| #define NACL_MOJO_DESC (NACL_CHROME_DESC_BASE + 3) |
| |
| MojoResult InjectMojo(struct NaClApp* nap, MojoHandle handle) { |
| NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeMojoDesc(nap)); |
| g_mojo_system = MojoSystemImplCreateImpl(); |
| return MojoSystemImplTransferHandle(MojoSystemImplGetDefaultImpl(), handle, |
| g_mojo_system, &g_mojo_handle); |
| } |
| |
| void InjectDisabledMojo(struct NaClApp* nap) { |
| NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeDisabledMojoDesc(nap)); |
| } |