Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Unified Diff: mojo/monacl/mojo_syscall.cc

Issue 385983008: Mojo + NaCl prototype. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Edits Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/monacl/mojo_syscall.cc
diff --git a/mojo/monacl/mojo_syscall.cc b/mojo/monacl/mojo_syscall.cc
new file mode 100644
index 0000000000000000000000000000000000000000..022a13195af2d436a5bfdc52c683ad2de9a899d3
--- /dev/null
+++ b/mojo/monacl/mojo_syscall.cc
@@ -0,0 +1,1192 @@
+// 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_monacl_bindings.py
+// Do not edit by hand.
+
+#include "mojo/monacl/mojo_syscall.h"
+
+#include <stdio.h>
+
+#include "mojo/public/c/system/core.h"
+#include "native_client/src/public/nacl_app.h"
+#include "native_client/src/trusted/desc/nacl_desc_custom.h"
+#include "native_client/src/trusted/service_runtime/nacl_copy.h"
+#include "native_client/src/trusted/service_runtime/sel_ldr.h"
+
+static INLINE uintptr_t NaClUserToSysAddrArray(
+ struct NaClApp *nap,
+ uintptr_t uaddr,
+ size_t count,
+ size_t size) {
+ // TODO overflow checking
+ size_t range = count * size;
+ return NaClUserToSysAddrRange(nap, uaddr, range);
+}
+
+void MojoDescDestroy(void *handle) {
+ UNREFERENCED_PARAMETER(handle);
+}
+
+ssize_t MojoDescSendMsg(void *handle,
+ const struct NaClImcTypedMsgHdr *msg,
+ int flags) {
+ UNREFERENCED_PARAMETER(flags);
+
+ struct NaClApp *nap = static_cast<struct NaClApp*>(handle);
+
+ if (msg->iov_length != 1 || msg->iov[0].length < 8 || msg->ndesc_length != 0) {
+ return -1;
+ }
+
+ uint32_t *params = static_cast<uint32_t*>(msg->iov[0].base);
+ uint32_t numParams = msg->iov[0].length / sizeof(*params);
+
+ uint32_t msgType = params[0];
+ switch (msgType) {
+ case 0:
+ {
+ if (numParams != 5) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ const struct MojoCreateSharedBufferOptions* options;
+ if (params[1] == 0) {
+ options = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ options = reinterpret_cast<const struct MojoCreateSharedBufferOptions*>(temp);
+ }
+ uint64_t num_bytes;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes = *reinterpret_cast<uint64_t volatile*>(temp);
+ }
+ MojoHandle* shared_buffer_handle_ptr;
+ MojoHandle shared_buffer_handle;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(shared_buffer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ shared_buffer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoCreateSharedBuffer(options, num_bytes, &shared_buffer_handle);
+
+ NaClCopyTakeLock(nap);
+ *shared_buffer_handle_ptr = shared_buffer_handle;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 1:
+ {
+ if (numParams != 5) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle buffer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ const struct MojoDuplicateBufferHandleOptions* options;
+ if (params[2] == 0) {
+ options = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(*options));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ options = reinterpret_cast<const struct MojoDuplicateBufferHandleOptions*>(temp);
+ }
+ MojoHandle* new_buffer_handle_ptr;
+ MojoHandle new_buffer_handle;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(new_buffer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ new_buffer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoDuplicateBufferHandle(buffer_handle, options, &new_buffer_handle);
+
+ NaClCopyTakeLock(nap);
+ *new_buffer_handle_ptr = new_buffer_handle;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 2:
+ {
+ if (numParams != 7) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle buffer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint64_t offset;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(offset));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ offset = *reinterpret_cast<uint64_t volatile*>(temp);
+ }
+ uint64_t num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes = *reinterpret_cast<uint64_t volatile*>(temp);
+ }
+ void** buffer_ptr;
+ void* buffer;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(buffer));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_ptr = reinterpret_cast<void**>(temp);
+ }
+ MojoMapBufferFlags flags;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoMapBufferFlags volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[6] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoMapBuffer(buffer_handle, offset, num_bytes, &buffer, flags);
+
+ NaClCopyTakeLock(nap);
+ *buffer_ptr = buffer;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 3:
+ {
+ if (numParams != 3) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ void* buffer;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer = *reinterpret_cast<void* volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoUnmapBuffer(buffer);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 4:
+ {
+ if (numParams != 5) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ const struct MojoCreateDataPipeOptions* options;
+ if (params[1] == 0) {
+ options = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ options = reinterpret_cast<const struct MojoCreateDataPipeOptions*>(temp);
+ }
+ MojoHandle* data_pipe_producer_handle_ptr;
+ MojoHandle data_pipe_producer_handle;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(data_pipe_producer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_producer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoHandle* data_pipe_consumer_handle_ptr;
+ MojoHandle data_pipe_consumer_handle;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(data_pipe_consumer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_consumer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoCreateDataPipe(options, &data_pipe_producer_handle, &data_pipe_consumer_handle);
+
+ NaClCopyTakeLock(nap);
+ *data_pipe_producer_handle_ptr = data_pipe_producer_handle;
+ *data_pipe_consumer_handle_ptr = data_pipe_consumer_handle;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 5:
+ {
+ if (numParams != 6) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_producer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_producer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t* num_bytes_ptr;
+ uint32_t num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ num_bytes = *num_bytes_ptr;
+ }
+ MojoWriteDataFlags flags;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoWriteDataFlags volatile*>(temp);
+ }
+ const void* elements;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ elements = reinterpret_cast<const void*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoWriteData(data_pipe_producer_handle, elements, &num_bytes, flags);
+
+ NaClCopyTakeLock(nap);
+ *num_bytes_ptr = num_bytes;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 6:
+ {
+ if (numParams != 6) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_producer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_producer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ void** buffer_ptr;
+ void* buffer;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(buffer));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_ptr = reinterpret_cast<void**>(temp);
+ }
+ uint32_t* buffer_num_bytes_ptr;
+ uint32_t buffer_num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(buffer_num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ buffer_num_bytes = *buffer_num_bytes_ptr;
+ }
+ MojoWriteDataFlags flags;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoWriteDataFlags volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoBeginWriteData(data_pipe_producer_handle, &buffer, &buffer_num_bytes, flags);
+
+ NaClCopyTakeLock(nap);
+ *buffer_ptr = buffer;
+ *buffer_num_bytes_ptr = buffer_num_bytes;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 7:
+ {
+ if (numParams != 4) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_producer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_producer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t num_bytes_written;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes_written));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes_written = *reinterpret_cast<uint32_t volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoEndWriteData(data_pipe_producer_handle, num_bytes_written);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 8:
+ {
+ if (numParams != 6) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_consumer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_consumer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t* num_bytes_ptr;
+ uint32_t num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ num_bytes = *num_bytes_ptr;
+ }
+ MojoReadDataFlags flags;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoReadDataFlags volatile*>(temp);
+ }
+ void* elements;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ elements = reinterpret_cast<void*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoReadData(data_pipe_consumer_handle, elements, &num_bytes, flags);
+
+ NaClCopyTakeLock(nap);
+ *num_bytes_ptr = num_bytes;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 9:
+ {
+ if (numParams != 6) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_consumer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_consumer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ const void** buffer_ptr;
+ const void* buffer;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(buffer));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_ptr = reinterpret_cast<const void**>(temp);
+ }
+ uint32_t* buffer_num_bytes_ptr;
+ uint32_t buffer_num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(buffer_num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ buffer_num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ buffer_num_bytes = *buffer_num_bytes_ptr;
+ }
+ MojoReadDataFlags flags;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoReadDataFlags volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoBeginReadData(data_pipe_consumer_handle, &buffer, &buffer_num_bytes, flags);
+
+ NaClCopyTakeLock(nap);
+ *buffer_ptr = buffer;
+ *buffer_num_bytes_ptr = buffer_num_bytes;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 10:
+ {
+ if (numParams != 4) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle data_pipe_consumer_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe_consumer_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t num_bytes_read;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes_read));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes_read = *reinterpret_cast<uint32_t volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoEndReadData(data_pipe_consumer_handle, num_bytes_read);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 11:
+ {
+ if (numParams != 2) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoTimeTicks* result_ptr;
+ MojoTimeTicks result;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoTimeTicks*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoGetTimeTicksNow();
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 12:
+ {
+ if (numParams != 3) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoClose(handle);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 13:
+ {
+ if (numParams != 5) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ MojoHandleSignals signals;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(signals));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ signals = *reinterpret_cast<MojoHandleSignals volatile*>(temp);
+ }
+ MojoDeadline deadline;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(deadline));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ deadline = *reinterpret_cast<MojoDeadline volatile*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoWait(handle, signals, deadline);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 14:
+ {
+ if (numParams != 6) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ uint32_t num_handles;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_handles = *reinterpret_cast<uint32_t volatile*>(temp);
+ }
+ MojoDeadline deadline;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(deadline));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ deadline = *reinterpret_cast<MojoDeadline volatile*>(temp);
+ }
+ const MojoHandle* handles;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrArray(nap, params[1], num_handles, sizeof(*handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ handles = reinterpret_cast<const MojoHandle*>(temp);
+ }
+ const MojoHandleSignals* signals;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrArray(nap, params[2], num_handles, sizeof(*signals));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ signals = reinterpret_cast<const MojoHandleSignals*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoWaitMany(handles, signals, num_handles, deadline);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 15:
+ {
+ if (numParams != 5) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ const struct MojoCreateMessagePipeOptions* options;
+ if (params[1] == 0) {
+ options = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ options = reinterpret_cast<const struct MojoCreateMessagePipeOptions*>(temp);
+ }
+ MojoHandle* message_pipe_handle0_ptr;
+ MojoHandle message_pipe_handle0;
+ if (params[2] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(message_pipe_handle0));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ message_pipe_handle0_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoHandle* message_pipe_handle1_ptr;
+ MojoHandle message_pipe_handle1;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(message_pipe_handle1));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ message_pipe_handle1_ptr = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[4] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoCreateMessagePipe(options, &message_pipe_handle0, &message_pipe_handle1);
+
+ NaClCopyTakeLock(nap);
+ *message_pipe_handle0_ptr = message_pipe_handle0;
+ *message_pipe_handle1_ptr = message_pipe_handle1;
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 16:
+ {
+ if (numParams != 8) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle message_pipe_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(message_pipe_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ message_pipe_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t num_bytes;
+ if (params[3] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes = *reinterpret_cast<uint32_t volatile*>(temp);
+ }
+ uint32_t num_handles;
+ if (params[5] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(num_handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_handles = *reinterpret_cast<uint32_t volatile*>(temp);
+ }
+ MojoWriteMessageFlags flags;
+ if (params[6] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoWriteMessageFlags volatile*>(temp);
+ }
+ const void* bytes;
+ if (params[2] == 0) {
+ bytes = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ bytes = reinterpret_cast<const void*>(temp);
+ }
+ const MojoHandle* handles;
+ if (params[4] == 0) {
+ handles = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrArray(nap, params[4], num_handles, sizeof(*handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ handles = reinterpret_cast<const MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[7] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[7], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoWriteMessage(message_pipe_handle, bytes, num_bytes, handles, num_handles, flags);
+
+ NaClCopyTakeLock(nap);
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+ case 17:
+ {
+ if (numParams != 8) {
+ return -1;
+ }
+ NaClCopyTakeLock(nap);
+ MojoHandle message_pipe_handle;
+ if (params[1] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(message_pipe_handle));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ message_pipe_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
+ }
+ uint32_t* num_bytes_ptr;
+ uint32_t num_bytes;
+ if (params[3] == 0) {
+ num_bytes_ptr = NULL;
+ num_bytes = 0;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ num_bytes = *num_bytes_ptr;
+ }
+ uint32_t* num_handles_ptr;
+ uint32_t num_handles;
+ if (params[5] == 0) {
+ num_handles_ptr = NULL;
+ num_handles = 0;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(num_handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ num_handles_ptr = reinterpret_cast<uint32_t*>(temp);
+ // In/Out
+ num_handles = *num_handles_ptr;
+ }
+ MojoReadMessageFlags flags;
+ if (params[6] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(flags));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ flags = *reinterpret_cast<MojoReadMessageFlags volatile*>(temp);
+ }
+ void* bytes;
+ if (params[2] == 0) {
+ bytes = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ bytes = reinterpret_cast<void*>(temp);
+ }
+ MojoHandle* handles;
+ if (params[4] == 0) {
+ handles = NULL;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrArray(nap, params[4], num_handles, sizeof(*handles));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ handles = reinterpret_cast<MojoHandle*>(temp);
+ }
+ MojoResult* result_ptr;
+ MojoResult result;
+ if (params[7] == 0) {
+ return -1;
+ } else {
+ uintptr_t temp = NaClUserToSysAddrRange(nap, params[7], sizeof(result));
+ if (temp == kNaClBadAddress) {
+ return -1;
+ }
+ result_ptr = reinterpret_cast<MojoResult*>(temp);
+ }
+ NaClCopyDropLock(nap);
+
+ result = MojoReadMessage(message_pipe_handle, bytes, num_bytes_ptr ? &num_bytes : NULL, handles, num_handles_ptr ? &num_handles : NULL, flags);
+
+ NaClCopyTakeLock(nap);
+ if (num_bytes_ptr != NULL) {
+ *num_bytes_ptr = num_bytes;
+ }
+ if (num_handles_ptr != NULL) {
+ *num_handles_ptr = num_handles;
+ }
+ *result_ptr = result;
+ NaClCopyDropLock(nap);
+
+ return 0;
+ }
+
+ default:
+ return -1;
+ }
+
+ return -1;
+}
+
+ssize_t MojoDescRecvMsg(void *handle,
+ struct NaClImcTypedMsgHdr *msg,
+ int flags) {
+ UNREFERENCED_PARAMETER(handle);
+ UNREFERENCED_PARAMETER(msg);
+ UNREFERENCED_PARAMETER(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);
+}
+
+#define NACL_MOJO_DESC 5
+
+void InjectMojo(struct NaClApp *nap) {
+ NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeMojoDesc(nap));
+}

Powered by Google App Engine
This is Rietveld 408576698