diff options
Diffstat (limited to 'common/uapi')
| -rw-r--r-- | common/uapi/conf.c | 4 | ||||
| -rw-r--r-- | common/uapi/ipc.c | 16 | ||||
| -rw-r--r-- | common/uapi/proc.c | 10 |
3 files changed, 23 insertions, 7 deletions
diff --git a/common/uapi/conf.c b/common/uapi/conf.c index 7e88358..2094604 100644 --- a/common/uapi/conf.c +++ b/common/uapi/conf.c @@ -57,6 +57,10 @@ SYSCALL_DEFINE2(conf_set)(sys_arg_t param, sys_arg_t val) */ SYSCALL_DEFINE1(poweroff)(sys_arg_t type) { + struct tcb *t = cur_tcb(); + if (!(has_cap(t->caps, CAP_POWER))) + return SYS_RET1(ERR_PERM); + switch (type) { case SHUTDOWN: case COLD_REBOOT: diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c index cb53ee3..e45c7dd 100644 --- a/common/uapi/ipc.c +++ b/common/uapi/ipc.c @@ -18,7 +18,7 @@ */ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) { - cur_tcb()->callback = callback; + cur_proc()->callback = callback; return SYS_RET1(OK); } @@ -50,8 +50,12 @@ static struct sys_ret do_ipc(sys_arg_t pid, if (!r->callback) return SYS_RET1(ERR_NOINIT); - /** \todo place data on rpc stack and clone into virtual memory */ + clone_uvmem(r->proc.vmem, t->rpc.vmem); + use_vmem(t->rpc.vmem); + save_context(t); set_return(t, r->callback); + /** @todo associate thread with new proc, should be done in tcb.c I + * think */ if (!fwd) t->eid = t->pid; @@ -105,7 +109,13 @@ SYSCALL_DEFINE4(ipc_resp)(sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3) { struct tcb *t = cur_tcb(); - /* something like return_from_callback(t, r) */ + load_context(t); + + if (is_rpc(t)) + use_vmem(t->rpc.vmem); + else + use_vmem(t->proc.vmem); + return SYS_RET6(OK, t->tid, d0, d1, d2, d3); } diff --git a/common/uapi/proc.c b/common/uapi/proc.c index 969dcd6..7a078da 100644 --- a/common/uapi/proc.c +++ b/common/uapi/proc.c @@ -32,6 +32,8 @@ SYSCALL_DEFINE5(create)(sys_arg_t func, if (!t) return SYS_RET1(ERR_OOMEM); + alloc_stack(t); + set_args(t, SYS_RET5(t->tid, d0, d1, d2, d3)); set_return(t, func); @@ -55,7 +57,7 @@ SYSCALL_DEFINE5(create)(sys_arg_t func, */ SYSCALL_DEFINE0(fork)(){ struct tcb *c = cur_proc(); - if (!(get_caps(c->caps, 0) & CAP_PROC)) + if (!(has_cap(c->caps, CAP_PROC))) return SYS_RET1(ERR_PERM); struct tcb *t = create_proc(eff_proc()); @@ -118,7 +120,7 @@ SYSCALL_DEFINE2(exec)(sys_arg_t bin, sys_arg_t interp){ SYSCALL_DEFINE2(spawn)(sys_arg_t bin, sys_arg_t interp) { struct tcb *c = cur_proc(); - if (!(get_caps(c->caps, 0) & CAP_PROC)) + if (!(has_cap(c->caps, CAP_PROC))) return SYS_RET1(ERR_PERM); struct tcb *t = create_proc(NULL); @@ -139,7 +141,7 @@ SYSCALL_DEFINE2(spawn)(sys_arg_t bin, sys_arg_t interp) SYSCALL_DEFINE1(kill)(sys_arg_t tid) { struct tcb *c = cur_proc(); - if (!(get_caps(c->caps, 0) & CAP_PROC)) + if (!(has_cap(c->caps, CAP_PROC))) return SYS_RET1(ERR_PERM); return SYS_RET1(OK); @@ -157,7 +159,7 @@ SYSCALL_DEFINE1(kill)(sys_arg_t tid) */ SYSCALL_DEFINE1(swap)(sys_arg_t tid){ struct tcb *c = cur_proc(); - if (!(get_caps(c->caps, 0) & CAP_PROC)) + if (!(has_cap(c->caps, CAP_PROC))) return SYS_RET1(ERR_PERM); struct tcb *t = get_tcb(tid); |
