diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-24 21:18:55 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-24 21:18:55 +0300 |
| commit | e033569910aecb4d8fb437a622e542b8803834ec (patch) | |
| tree | b7e31d1b266dfbd3b1aa79ae4db47d584541c8bc /common/uapi/proc.c | |
| parent | 12be40e22aae582cca9abbd151031edaab800cae (diff) | |
| download | kmi-e033569910aecb4d8fb437a622e542b8803834ec.tar.gz kmi-e033569910aecb4d8fb437a622e542b8803834ec.zip | |
initial musings about exec
Diffstat (limited to 'common/uapi/proc.c')
| -rw-r--r-- | common/uapi/proc.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/common/uapi/proc.c b/common/uapi/proc.c index e36c62e..3f715af 100644 --- a/common/uapi/proc.c +++ b/common/uapi/proc.c @@ -4,6 +4,8 @@ */ #include <apos/uapi.h> +#include <apos/bits.h> +#include <apos/mem_regions.h> SYSCALL_DEFINE0(create)(){ return (struct sys_ret){ OK, 0 }; @@ -23,8 +25,35 @@ SYSCALL_DEFINE0(fork)(){ return (struct sys_ret){ OK, 0 }; } -SYSCALL_DEFINE3(exec)(sys_arg_t bin, sys_arg_t argc, sys_arg_t argv){ +SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){ /* TODO: execute new process, probably with more sensible argc passing */ + struct tcb *r = cur_tcb(); + + /* 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}; + __set_bit(b->flags, MR_KEEP); + + struct mem_region *i = 0; + if (interp) { + /* mark interpreter to be kept */ + i = find_used_region(&r->sp_r, interp); + if (!i) + return (struct sys_ret){ERR_INVAL, 1}; + __set_bit(i->flags, MR_KEEP); + } + + /* free everything except regions to be kept */ + clear_uvmem(r, false); + + /* restore to normal */ + __clear_bit(b->flags, MR_KEEP); + if (interp) + __clear_bit(b->flags, MR_KEEP); + + /* TODO: set entry? */ + load_elf(r, b, i); return (struct sys_ret){ OK, 0 }; } |
