// 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.

// WARNING this file was generated by generate_nacl_bindings.py
// Do not edit by hand.

#include "mojo/public/platform/nacl/mojo_irt.h"

#include <stdio.h>
#include <string.h>

#include "native_client/src/public/chrome_main.h"
#include "native_client/src/public/imc_syscalls.h"
#include "native_client/src/public/imc_types.h"
#include "native_client/src/public/irt_core.h"

#define NACL_MOJO_DESC (NACL_CHROME_DESC_BASE + 3)

static void DoMojoCall(uint32_t params[], nacl_abi_size_t num_params) {
  struct NaClAbiNaClImcMsgIoVec iov[1] = {
    {params, num_params}
  };
  struct NaClAbiNaClImcMsgHdr msgh = {iov, 1, NULL, 0};
  // Note: return value unchecked.  We're relying on the result parameter being
  // unmodified - if the syscall fails, the Mojo function will return whatever
  // the result parameter was initialized to before this function was called.
  imc_sendmsg(NACL_MOJO_DESC, &msgh, 0);
}

static MojoResult irt__MojoGetInitialHandle(MojoHandle* handle) {
  uint32_t params[3];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 0;
  params[1] = (uint32_t)(handle);
  params[2] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoTimeTicks irt_MojoGetTimeTicksNow() {
  uint32_t params[2];
  MojoTimeTicks result = 0;
  params[0] = 1;
  params[1] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoClose(MojoHandle handle) {
  uint32_t params[3];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 2;
  params[1] = (uint32_t)(&handle);
  params[2] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoGetRights(
    MojoHandle handle,
    MojoHandleRights* rights) {
  uint32_t params[4];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 3;
  params[1] = (uint32_t)(&handle);
  params[2] = (uint32_t)(rights);
  params[3] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoWait(
    MojoHandle handle,
    MojoHandleSignals signals,
    MojoDeadline deadline,
    struct MojoHandleSignalsState* signals_state) {
  uint32_t params[6];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 4;
  params[1] = (uint32_t)(&handle);
  params[2] = (uint32_t)(&signals);
  params[3] = (uint32_t)(&deadline);
  params[4] = (uint32_t)(signals_state);
  params[5] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoWaitMany(
    const MojoHandle* handles,
    const MojoHandleSignals* signals,
    uint32_t num_handles,
    MojoDeadline deadline,
    uint32_t* result_index,
    struct MojoHandleSignalsState* signals_states) {
  uint32_t params[8];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 5;
  params[1] = (uint32_t)(handles);
  params[2] = (uint32_t)(signals);
  params[3] = (uint32_t)(&num_handles);
  params[4] = (uint32_t)(&deadline);
  params[5] = (uint32_t)(result_index);
  params[6] = (uint32_t)(signals_states);
  params[7] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoCreateMessagePipe(
    const struct MojoCreateMessagePipeOptions* options,
    MojoHandle* message_pipe_handle0,
    MojoHandle* message_pipe_handle1) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 6;
  params[1] = (uint32_t)(options);
  params[2] = (uint32_t)(message_pipe_handle0);
  params[3] = (uint32_t)(message_pipe_handle1);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoWriteMessage(
    MojoHandle message_pipe_handle,
    const void* bytes,
    uint32_t num_bytes,
    const MojoHandle* handles,
    uint32_t num_handles,
    MojoWriteMessageFlags flags) {
  uint32_t params[8];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 7;
  params[1] = (uint32_t)(&message_pipe_handle);
  params[2] = (uint32_t)(bytes);
  params[3] = (uint32_t)(&num_bytes);
  params[4] = (uint32_t)(handles);
  params[5] = (uint32_t)(&num_handles);
  params[6] = (uint32_t)(&flags);
  params[7] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoReadMessage(
    MojoHandle message_pipe_handle,
    void* bytes,
    uint32_t* num_bytes,
    MojoHandle* handles,
    uint32_t* num_handles,
    MojoReadMessageFlags flags) {
  uint32_t params[8];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 8;
  params[1] = (uint32_t)(&message_pipe_handle);
  params[2] = (uint32_t)(bytes);
  params[3] = (uint32_t)(num_bytes);
  params[4] = (uint32_t)(handles);
  params[5] = (uint32_t)(num_handles);
  params[6] = (uint32_t)(&flags);
  params[7] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoCreateDataPipe(
    const struct MojoCreateDataPipeOptions* options,
    MojoHandle* data_pipe_producer_handle,
    MojoHandle* data_pipe_consumer_handle) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 9;
  params[1] = (uint32_t)(options);
  params[2] = (uint32_t)(data_pipe_producer_handle);
  params[3] = (uint32_t)(data_pipe_consumer_handle);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoSetDataPipeProducerOptions(
    MojoHandle data_pipe_producer_handle,
    const struct MojoDataPipeProducerOptions* options) {
  uint32_t params[4];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 10;
  params[1] = (uint32_t)(&data_pipe_producer_handle);
  params[2] = (uint32_t)(options);
  params[3] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoGetDataPipeProducerOptions(
    MojoHandle data_pipe_producer_handle,
    struct MojoDataPipeProducerOptions* options,
    uint32_t options_num_bytes) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 11;
  params[1] = (uint32_t)(&data_pipe_producer_handle);
  params[2] = (uint32_t)(options);
  params[3] = (uint32_t)(&options_num_bytes);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoWriteData(
    MojoHandle data_pipe_producer_handle,
    const void* elements,
    uint32_t* num_bytes,
    MojoWriteDataFlags flags) {
  uint32_t params[6];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 12;
  params[1] = (uint32_t)(&data_pipe_producer_handle);
  params[2] = (uint32_t)(elements);
  params[3] = (uint32_t)(num_bytes);
  params[4] = (uint32_t)(&flags);
  params[5] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoBeginWriteData(
    MojoHandle data_pipe_producer_handle,
    void** buffer,
    uint32_t* buffer_num_bytes,
    MojoWriteDataFlags flags) {
  uint32_t params[6];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 13;
  params[1] = (uint32_t)(&data_pipe_producer_handle);
  params[2] = (uint32_t)(buffer);
  params[3] = (uint32_t)(buffer_num_bytes);
  params[4] = (uint32_t)(&flags);
  params[5] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoEndWriteData(
    MojoHandle data_pipe_producer_handle,
    uint32_t num_bytes_written) {
  uint32_t params[4];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 14;
  params[1] = (uint32_t)(&data_pipe_producer_handle);
  params[2] = (uint32_t)(&num_bytes_written);
  params[3] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoSetDataPipeConsumerOptions(
    MojoHandle data_pipe_consumer_handle,
    const struct MojoDataPipeConsumerOptions* options) {
  uint32_t params[4];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 15;
  params[1] = (uint32_t)(&data_pipe_consumer_handle);
  params[2] = (uint32_t)(options);
  params[3] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoGetDataPipeConsumerOptions(
    MojoHandle data_pipe_consumer_handle,
    struct MojoDataPipeConsumerOptions* options,
    uint32_t options_num_bytes) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 16;
  params[1] = (uint32_t)(&data_pipe_consumer_handle);
  params[2] = (uint32_t)(options);
  params[3] = (uint32_t)(&options_num_bytes);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoReadData(
    MojoHandle data_pipe_consumer_handle,
    void* elements,
    uint32_t* num_bytes,
    MojoReadDataFlags flags) {
  uint32_t params[6];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 17;
  params[1] = (uint32_t)(&data_pipe_consumer_handle);
  params[2] = (uint32_t)(elements);
  params[3] = (uint32_t)(num_bytes);
  params[4] = (uint32_t)(&flags);
  params[5] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoBeginReadData(
    MojoHandle data_pipe_consumer_handle,
    const void** buffer,
    uint32_t* buffer_num_bytes,
    MojoReadDataFlags flags) {
  uint32_t params[6];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 18;
  params[1] = (uint32_t)(&data_pipe_consumer_handle);
  params[2] = (uint32_t)(buffer);
  params[3] = (uint32_t)(buffer_num_bytes);
  params[4] = (uint32_t)(&flags);
  params[5] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoEndReadData(
    MojoHandle data_pipe_consumer_handle,
    uint32_t num_bytes_read) {
  uint32_t params[4];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 19;
  params[1] = (uint32_t)(&data_pipe_consumer_handle);
  params[2] = (uint32_t)(&num_bytes_read);
  params[3] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoCreateSharedBuffer(
    const struct MojoCreateSharedBufferOptions* options,
    uint64_t num_bytes,
    MojoHandle* shared_buffer_handle) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 20;
  params[1] = (uint32_t)(options);
  params[2] = (uint32_t)(&num_bytes);
  params[3] = (uint32_t)(shared_buffer_handle);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoDuplicateBufferHandle(
    MojoHandle buffer_handle,
    const struct MojoDuplicateBufferHandleOptions* options,
    MojoHandle* new_buffer_handle) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 21;
  params[1] = (uint32_t)(&buffer_handle);
  params[2] = (uint32_t)(options);
  params[3] = (uint32_t)(new_buffer_handle);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoGetBufferInformation(
    MojoHandle buffer_handle,
    struct MojoBufferInformation* info,
    uint32_t info_num_bytes) {
  uint32_t params[5];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 22;
  params[1] = (uint32_t)(&buffer_handle);
  params[2] = (uint32_t)(info);
  params[3] = (uint32_t)(&info_num_bytes);
  params[4] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoMapBuffer(
    MojoHandle buffer_handle,
    uint64_t offset,
    uint64_t num_bytes,
    void** buffer,
    MojoMapBufferFlags flags) {
  uint32_t params[7];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 23;
  params[1] = (uint32_t)(&buffer_handle);
  params[2] = (uint32_t)(&offset);
  params[3] = (uint32_t)(&num_bytes);
  params[4] = (uint32_t)(buffer);
  params[5] = (uint32_t)(&flags);
  params[6] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

static MojoResult irt_MojoUnmapBuffer(void* buffer) {
  uint32_t params[3];
  MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
  params[0] = 24;
  params[1] = (uint32_t)(&buffer);
  params[2] = (uint32_t)(&result);
  DoMojoCall(params, sizeof(params));
  return result;
};

struct nacl_irt_mojo kIrtMojo = {
  &irt__MojoGetInitialHandle,
  &irt_MojoGetTimeTicksNow,
  &irt_MojoClose,
  &irt_MojoGetRights,
  &irt_MojoWait,
  &irt_MojoWaitMany,
  &irt_MojoCreateMessagePipe,
  &irt_MojoWriteMessage,
  &irt_MojoReadMessage,
  &irt_MojoCreateDataPipe,
  &irt_MojoSetDataPipeProducerOptions,
  &irt_MojoGetDataPipeProducerOptions,
  &irt_MojoWriteData,
  &irt_MojoBeginWriteData,
  &irt_MojoEndWriteData,
  &irt_MojoSetDataPipeConsumerOptions,
  &irt_MojoGetDataPipeConsumerOptions,
  &irt_MojoReadData,
  &irt_MojoBeginReadData,
  &irt_MojoEndReadData,
  &irt_MojoCreateSharedBuffer,
  &irt_MojoDuplicateBufferHandle,
  &irt_MojoGetBufferInformation,
  &irt_MojoMapBuffer,
  &irt_MojoUnmapBuffer,
};


size_t mojo_irt_query(const char* interface_ident,
                      void* table,
                      size_t tablesize) {
  static const size_t size = sizeof(kIrtMojo);
  if (0 == strcmp(interface_ident, NACL_IRT_MOJO_v0_1)) {
    if (size <= tablesize) {
      memcpy(table, &kIrtMojo, size);
      return size;
    }
  }
  return 0;
}
