aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/ipc.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-09-15 19:21:14 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-09-15 19:46:07 +0300
commita717296a2036cede5fccfff544513043a984d614 (patch)
tree68f75a23adc298628fb9cab41fd47402a99dd19d /common/uapi/ipc.c
parent619725a5f2f5272f9cbb547ed95c87312c2765a9 (diff)
downloadkmi-a717296a2036cede5fccfff544513043a984d614.tar.gz
kmi-a717296a2036cede5fccfff544513043a984d614.zip
change syscalls to take 5 params and return 6
+ In total, a syscall is built up of 6 values, with the first being the syscall number. Symmetrically, the first value is now a status and the following five values return "values". This allows us to cram in more info into the ipc_* functions. The performance difference is absolutely minimal, at least from my testing in qemu.
Diffstat (limited to 'common/uapi/ipc.c')
-rw-r--r--common/uapi/ipc.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c
index 4cdec0c..ecfced5 100644
--- a/common/uapi/ipc.c
+++ b/common/uapi/ipc.c
@@ -13,17 +13,12 @@
* IPC server notification syscall handler.
*
* @param callback Address of server callback.
- * @return \ref ERR_EXT and \c 0 if process already is a server,
- * \ref OK and \c 0 otherwise.
+ * @return \ref OK and \c 0.
*/
SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback)
{
- struct tcb *r = cur_tcb();
- if (r->callback) /* server can't be reinitialized */
- return (struct sys_ret){ ERR_EXT, 0 };
-
- r->callback = callback;
- return (struct sys_ret){ OK, 0 };
+ cur_tcb()->callback = callback;
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
/**
@@ -32,29 +27,37 @@ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback)
* @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.
* @return \c d0 and \c d1.
*/
-SYSCALL_DEFINE3(ipc_req)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1)
+SYSCALL_DEFINE5(ipc_req)(sys_arg_t pid,
+ sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3)
{
+ struct tcb *t = cur_tcb();
struct tcb *r = get_tcb(pid);
/** \todo something like jump_to_callback(t) */
/* remember difference between ipc_req and ipc_fwd! */
- return (struct sys_ret){ d0, d1 };
+ return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 };
}
/**
* IPC forwarding syscall handler.
*
- * @param pid Process to rquest RPC to.
+ * @param pid Process to request RPC to.
* @param d0 IPC argument 0.
* @param d1 IPC argument 1.
- * @return \c d0 and \c d1.
+ * @param d2 IPC argument 2.
+ * @param d3 IPC argument 3.
+ * @return \p d0 and \p d1.
*/
-SYSCALL_DEFINE3(ipc_fwd)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1)
+SYSCALL_DEFINE5(ipc_fwd)(sys_arg_t pid,
+ sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3)
{
- struct tcb *t = get_tcb(pid);
+ struct tcb *t = cur_tcb();
+ struct tcb *r = get_tcb(pid);
/* ditto */
- return (struct sys_ret){ d0, d1 };
+ return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 };
}
/**
@@ -62,11 +65,14 @@ SYSCALL_DEFINE3(ipc_fwd)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1)
*
* @param d0 IPC return value 0.
* @param d1 IPC return value 1.
+ * @param d2 IPC return value 2.
+ * @param d3 IPC return value 3.
* @return \c d0 and \c d1.
*/
-SYSCALL_DEFINE2(ipc_resp)(sys_arg_t d0, sys_arg_t d1)
+SYSCALL_DEFINE4(ipc_resp)(sys_arg_t d0, sys_arg_t d1, sys_arg_t d2,
+ sys_arg_t d3)
{
- struct tcb *r = cur_tcb();
+ struct tcb *t = cur_tcb();
/* something like return_from_callback(t, r) */
- return (struct sys_ret){ d0, d1 };
+ return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 };
}