aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/proc.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/proc.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/proc.c')
-rw-r--r--common/uapi/proc.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/common/uapi/proc.c b/common/uapi/proc.c
index 60617b4..ba9fb76 100644
--- a/common/uapi/proc.c
+++ b/common/uapi/proc.c
@@ -17,10 +17,13 @@
*
* \todo Implement.
*
+ * @param func Function to jump to at thread creation.
+ * @param arg Argument to pass to the function.
+ *
* @return \ref OK and 0.
*/
-SYSCALL_DEFINE0(create)(){
- return (struct sys_ret){ OK, 0 };
+SYSCALL_DEFINE2(create)(sys_arg_t func, sys_arg_t arg){
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
/**
@@ -39,7 +42,7 @@ SYSCALL_DEFINE0(create)(){
* @return \ref OK and 0.
*/
SYSCALL_DEFINE0(fork)(){
- return (struct sys_ret){ OK, 0 };
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
/**
@@ -56,7 +59,7 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){
/* mark binary to be kept */
struct mem_region *b = find_used_region(&r->sp_r, bin);
if (!b)
- return (struct sys_ret){ERR_INVAL, 0};
+ return (struct sys_ret){ERR_INVAL, 0, 0, 0, 0, 0};
set_bit(b->flags, MR_KEEP);
struct mem_region *i = 0;
@@ -64,7 +67,7 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){
/* mark interpreter to be kept */
i = find_used_region(&r->sp_r, interp);
if (!i)
- return (struct sys_ret){ERR_INVAL, 1};
+ return (struct sys_ret){ERR_INVAL, 1, 0, 0, 0, 0};
set_bit(i->flags, MR_KEEP);
}
@@ -76,7 +79,19 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){
if (interp)
clear_bit(b->flags, MR_KEEP);
- return (struct sys_ret){ prepare_proc(r, bin, interp), 0 };
+ return (struct sys_ret){ prepare_proc(r, bin, interp), 0, 0, 0, 0, 0 };
+}
+
+/**
+ * Kill syscall handler.
+ *
+ * \todo Implement.
+ *
+ * @return No?
+ */
+SYSCALL_DEFINE0(kill)()
+{
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0};
}
/**
@@ -86,10 +101,11 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){
*
* @param tid Thread ID to signal.
* @param signal Signal to send to \c tid.
+ * @param swap Whether to immediately swap to thread.
* @return \ref OK and 0.
*/
-SYSCALL_DEFINE2(signal)(sys_arg_t tid, sys_arg_t signal){
- return (struct sys_ret){ OK, 0 };
+SYSCALL_DEFINE3(signal)(sys_arg_t tid, sys_arg_t signal, sys_arg_t swap){
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
/**
@@ -106,5 +122,5 @@ SYSCALL_DEFINE1(swap)(sys_arg_t tid){
/** \todo switch to process */
/** \todo should switch return the registers of the new thread that would
* be used for message passing? */
- return (struct sys_ret){ OK, 0 };
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}