aboutsummaryrefslogtreecommitdiff
path: root/common/uapi
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-11-12 16:41:36 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2022-11-12 16:41:36 +0200
commit41ead8de77963bae907375c1bb115dad3315f46b (patch)
tree4b364db137bd3bea69853f15329292af7662897d /common/uapi
parent1d37792fb7a47135f0e7b7fc245e83bb1d8fc496 (diff)
downloadkmi-41ead8de77963bae907375c1bb115dad3315f46b.tar.gz
kmi-41ead8de77963bae907375c1bb115dad3315f46b.zip
initial rpc implementations
Diffstat (limited to 'common/uapi')
-rw-r--r--common/uapi/conf.c4
-rw-r--r--common/uapi/ipc.c16
-rw-r--r--common/uapi/proc.c10
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);