blob: c83054b719236b690d76e03bcdcccaccbf19541b [file] [log] [blame]
/*
* Copyright 2019, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*/
#include <rpc.pb.h>
#include <pb_encode.h>
#include <pb_decode.h>
#include <sel4nanopb/sel4nanopb.h>
#include <sel4rpc/client.h>
#include <sel4rpc/server.h>
#include <utils/zf_log.h>
#define IPC_RESERVED_WORDS (1)
int sel4rpc_client_init(sel4rpc_client_t *client, seL4_CPtr server_ep, seL4_Word magic)
{
client->server_ep = server_ep;
client->magic = magic;
}
int sel4rpc_call(sel4rpc_client_t *client, RpcMessage *msg, seL4_CPtr root,
seL4_CPtr capPtr, seL4_Word capDepth)
{
pb_ostream_t stream = pb_ostream_from_IPC(IPC_RESERVED_WORDS);
bool ret = pb_encode_delimited(&stream, &RpcMessage_msg, msg);
if (!ret) {
ZF_LOGE("Failed to encode message (%s)", PB_GET_ERROR(&stream));
return -1;
}
size_t stream_size = stream.bytes_written / sizeof(seL4_Word);
/* add an extra word if bytes_written is not divisible by sizeof(seL4_Word). */
if (stream.bytes_written % sizeof(seL4_Word)) {
stream_size += 1;
}
/* add an extra word for the magic header */
stream_size += IPC_RESERVED_WORDS;
/* set cap receive path */
seL4_SetCapReceivePath(root, capPtr, capDepth);
/* set magic header */
seL4_SetMR(0, client->magic);
seL4_Call(client->server_ep, seL4_MessageInfo_new(0, 0, 0, stream_size));
pb_istream_t istream = pb_istream_from_IPC(0);
ret = pb_decode_delimited(&istream, &RpcMessage_msg, msg);
if (!ret) {
ZF_LOGE("Failed to decode server reply (%s)", PB_GET_ERROR(&stream));
return -1;
}
return 0;
}