From a717296a2036cede5fccfff544513043a984d614 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Thu, 15 Sep 2022 19:21:14 +0300 Subject: 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. --- common/uapi/proc.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'common/uapi/proc.c') 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 }; } -- cgit v1.3