aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/uapi/ipc.c')
-rw-r--r--common/uapi/ipc.c50
1 files changed, 30 insertions, 20 deletions
diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c
index 860ec54..93717e4 100644
--- a/common/uapi/ipc.c
+++ b/common/uapi/ipc.c
@@ -13,45 +13,51 @@
/**
* IPC server notification syscall handler.
*
+ * @param t Current tcb.
* @param callback Address of server callback.
* @return \ref OK and \c 0.
*/
SYSCALL_DEFINE1(ipc_server)(struct tcb *t, sys_arg_t callback)
{
get_cproc(t)->callback = callback;
- return SYS_RET1(OK);
+ return_args(t, SYS_RET1(OK));
}
/**
* Actual IPC syscall handler.
*
+ * @param t Current tcb.
* @param pid Process to request RPC to.
* @param d0 IPC argument 0.
* @param d1 IPC argument 1.
* @param d2 IPC argument 2.
* @param d3 IPC argument 3.
* @param fwd Whether to forward.
- * @return
+ *
+ * Returns \ref ERR_OOMEM if there isn't enough IPC stack left, \ref ERR_INVAL
+ * if the the target process doesn't exist, \ref ERR_NOINIT if the target
+ * process hasn't defined a callback. Otherwise \ref OK and whatever the target
+ * process sends back.
*/
-static struct sys_ret do_ipc(struct tcb *t,
- sys_arg_t pid,
- sys_arg_t d0,
- sys_arg_t d1,
- sys_arg_t d2,
- sys_arg_t d3,
- bool fwd)
+static void do_ipc(struct tcb *t,
+ sys_arg_t pid,
+ sys_arg_t d0,
+ sys_arg_t d1,
+ sys_arg_t d2,
+ sys_arg_t d3,
+ bool fwd)
{
if (!enough_rpc_stack(t))
- return SYS_RET1(ERR_OOMEM);
+ return_args(t, SYS_RET1(ERR_OOMEM));
struct tcb *r = get_tcb(pid);
if (!r)
- return SYS_RET1(ERR_INVAL);
+ return_args(t, SYS_RET1(ERR_INVAL));
r = get_rproc(r);
if (!r->callback)
- return SYS_RET1(ERR_NOINIT);
+ return_args(t, SYS_RET1(ERR_NOINIT));
clone_uvmem(r->proc.vmem, t->rpc.vmem);
use_vmem(t->rpc.vmem);
@@ -65,11 +71,12 @@ static struct sys_ret do_ipc(struct tcb *t,
t->pid = r->rid;
- return SYS_RET6(OK, t->eid, d0, d1, d2, d3);
+ return_args(t, SYS_RET6(OK, t->eid, d0, d1, d2, d3));
}
/**
* IPC request syscall handler.
*
+ * @param t Current tcb.
* @param pid Process to request RPC to.
* @param d0 IPC argument 0.
* @param d1 IPC argument 1.
@@ -80,12 +87,13 @@ static struct sys_ret do_ipc(struct tcb *t,
SYSCALL_DEFINE5(ipc_req)(struct tcb *t, sys_arg_t pid,
sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3)
{
- return do_ipc(t, pid, d0, d1, d2, d3, false);
+ do_ipc(t, pid, d0, d1, d2, d3, false);
}
/**
* IPC forwarding syscall handler.
*
+ * @param t Current tcb.
* @param pid Process to request RPC to.
* @param d0 IPC argument 0.
* @param d1 IPC argument 1.
@@ -96,12 +104,13 @@ SYSCALL_DEFINE5(ipc_req)(struct tcb *t, sys_arg_t pid,
SYSCALL_DEFINE5(ipc_fwd)(struct tcb *t, sys_arg_t pid,
sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3)
{
- return do_ipc(t, pid, d0, d1, d2, d3, true);
+ do_ipc(t, pid, d0, d1, d2, d3, true);
}
/**
* IPC response syscall handler.
*
+ * @param t Current tcb.
* @param d0 IPC return value 0.
* @param d1 IPC return value 1.
* @param d2 IPC return value 2.
@@ -121,7 +130,7 @@ SYSCALL_DEFINE4(ipc_resp)(struct tcb *t, sys_arg_t d0, sys_arg_t d1,
else
use_vmem(t->proc.vmem);
- return SYS_RET6(OK, t->tid, d0, d1, d2, d3);
+ return_args(t, SYS_RET6(OK, t->tid, d0, d1, d2, d3));
}
/**
@@ -129,25 +138,26 @@ SYSCALL_DEFINE4(ipc_resp)(struct tcb *t, sys_arg_t d0, sys_arg_t d1,
*
* \todo Implement.
*
+ * @param t Current tcb.
* @param tid Thread ID to notify.
* @return \ref OK and 0.
*/
SYSCALL_DEFINE1(ipc_notify)(struct tcb *t, sys_arg_t tid){
if (!has_cap(t->caps, CAP_CALL))
- return SYS_RET1(ERR_PERM);
+ return_args(t, SYS_RET1(ERR_PERM));
struct tcb *r = get_tcb(tid);
if (r->notify_state == NOTIFY_QUEUED)
- return SYS_RET1(OK);
+ return_args(t, SYS_RET1(OK));
if (r->notify_state == NOTIFY_RUNNING) {
t->notify_state = NOTIFY_QUEUED;
- return SYS_RET1(OK);
+ return_args(t, SYS_RET1(OK));
}
r->notify_state = NOTIFY_QUEUED;
if (running(r))
send_ipi(r);
- return SYS_RET1(OK);
+ return_args(t, SYS_RET1(OK));
}