aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-10-22 18:39:57 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-10-22 18:39:57 +0300
commit6be4e656cbf575dbcba95de4e99183586aa88ffe (patch)
treec3fde91dd1d00d199804e7901df79e4de91d9cc7
parent22eeabc6c63e220d628417ea525c8838f3fae913 (diff)
downloadkmi-6be4e656cbf575dbcba95de4e99183586aa88ffe.tar.gz
kmi-6be4e656cbf575dbcba95de4e99183586aa88ffe.zip
create impl and CAP_PROC checking
-rw-r--r--arch/riscv64/kernel/cpu.c1
-rw-r--r--common/proc.c3
-rw-r--r--common/tcb.c6
-rw-r--r--common/uapi/proc.c39
-rw-r--r--include/apos/caps.h3
-rw-r--r--include/apos/tcb.h9
-rw-r--r--include/apos/uapi.h22
7 files changed, 68 insertions, 15 deletions
diff --git a/arch/riscv64/kernel/cpu.c b/arch/riscv64/kernel/cpu.c
index a730b87..d6d07ec 100644
--- a/arch/riscv64/kernel/cpu.c
+++ b/arch/riscv64/kernel/cpu.c
@@ -11,6 +11,7 @@
#include <arch/cpu.h>
+/** Keeps track of initialized cpus. */
static atomic_long cpus = 0;
void cpu_assign(struct tcb *t)
diff --git a/common/proc.c b/common/proc.c
index 270ec0c..137a2fe 100644
--- a/common/proc.c
+++ b/common/proc.c
@@ -39,6 +39,9 @@ stat_t init_proc(void *fdt)
/* set current tcb */
use_tcb(t);
+ /* init process has all capabilities */
+ set_caps(t->caps, 0, CAP_CAPS | CAP_PROC | CAP_CALL);
+
/* allocate stacks after ELF file to make sure nothing of importance
* clashes */
return prepare_proc(t, get_init_base(fdt), 0);
diff --git a/common/tcb.c b/common/tcb.c
index 675aa1f..1c1a623 100644
--- a/common/tcb.c
+++ b/common/tcb.c
@@ -300,6 +300,12 @@ __weak struct tcb *cur_tcb()
struct tcb *cur_proc()
{
struct tcb *t = cur_tcb();
+ return get_tcb(t->pid);
+}
+
+struct tcb *eff_proc()
+{
+ struct tcb *t = cur_tcb();
return get_tcb(t->eid);
}
diff --git a/common/uapi/proc.c b/common/uapi/proc.c
index ea42a3a..0039195 100644
--- a/common/uapi/proc.c
+++ b/common/uapi/proc.c
@@ -17,16 +17,25 @@
/**
* Create syscall handler.
*
- * \todo Implement.
- *
* @param func Function to jump to at thread creation.
- * @param arg Argument to pass to the function.
+ * @param d0 Argument 0.
+ * @param d1 Argument 1.
+ * @param d2 Argument 2.
+ * @param d3 Argument 3.
*
- * @return \ref OK and 0.
+ * @return ERR_OOMEM if thread creation was unsuccessful, otherwise OK and the
+ * thread id.
*/
SYSCALL_DEFINE5(create)(sys_arg_t func,
- sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3){
- return SYS_RET1(OK);
+ sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3){
+ struct tcb *t = create_thread(cur_tcb());
+ if (!t)
+ return SYS_RET1(ERR_OOMEM);
+
+ set_args(t, SYS_RET5(t->tid, d0, d1, d2, d3));
+ set_return(t, func);
+
+ return SYS_RET2(OK, t->tid);
}
/**
@@ -45,7 +54,11 @@ SYSCALL_DEFINE5(create)(sys_arg_t func,
* @return \ref OK and 0.
*/
SYSCALL_DEFINE0(fork)(){
- struct tcb *t = create_proc(cur_proc());
+ struct tcb *c = cur_proc();
+ if (!(get_caps(c->caps, 0) & CAP_PROC))
+ return SYS_RET1(ERR_PERM);
+
+ struct tcb *t = create_proc(eff_proc());
if (!t)
return SYS_RET1(ERR_OOMEM);
@@ -103,6 +116,10 @@ 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))
+ return SYS_RET1(ERR_PERM);
+
struct tcb *t = create_proc(NULL);
if (!t)
return SYS_RET1(ERR_OOMEM);
@@ -120,6 +137,10 @@ 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))
+ return SYS_RET1(ERR_PERM);
+
return SYS_RET1(OK);
}
@@ -134,6 +155,10 @@ SYSCALL_DEFINE1(kill)(sys_arg_t tid)
* @return \ref OK.
*/
SYSCALL_DEFINE1(swap)(sys_arg_t tid){
+ struct tcb *c = cur_proc();
+ if (!(get_caps(c->caps, 0) & CAP_PROC))
+ return SYS_RET1(ERR_PERM);
+
struct tcb *t = get_tcb(tid);
if (!t)
return SYS_RET1(ERR_INVAL);
diff --git a/include/apos/caps.h b/include/apos/caps.h
index b64b05a..e8ef76b 100644
--- a/include/apos/caps.h
+++ b/include/apos/caps.h
@@ -22,9 +22,6 @@ enum {
/** Thread is allowed to force interrupt to callback in other thread. */
CAP_CALL = (1 << 2),
-
- /** Thread is allowed to assign threads to processors. */
- CAP_ASSIGN = (1 << 3),
};
/**
diff --git a/include/apos/tcb.h b/include/apos/tcb.h
index a31e308..b92cd10 100644
--- a/include/apos/tcb.h
+++ b/include/apos/tcb.h
@@ -268,11 +268,18 @@ struct tcb *cur_tcb();
/**
* Get currently executing process.
*
- * @return Current process \ref tcb.
+ * @return Effective process \ref tcb.
*/
struct tcb *cur_proc();
/**
+ * Get currently executing process.
+ *
+ * @return Effective process \ref tcb.
+ */
+struct tcb *eff_proc();
+
+/**
* Set \c t as current \ref tcb.
*
* Also updates the current cpu id of the tcb.
diff --git a/include/apos/uapi.h b/include/apos/uapi.h
index 7d612b6..084c1fa 100644
--- a/include/apos/uapi.h
+++ b/include/apos/uapi.h
@@ -51,12 +51,25 @@ struct sys_ret {
sys_arg_t ar4;
};
+/** Helper for returning sys_ret with 0 arguments. */
#define SYS_RET0() (struct sys_ret){0, 0, 0, 0, 0, 0}
+
+/** Helper for returning sys_ret with 1 arguments. */
#define SYS_RET1(a) (struct sys_ret){a, 0, 0, 0, 0, 0}
+
+/** Helper for returning sys_ret with 2 arguments. */
#define SYS_RET2(a, b) (struct sys_ret){a, b, 0, 0, 0, 0}
+
+/** Helper for returning sys_ret with 3 arguments. */
#define SYS_RET3(a, b, c) (struct sys_ret){a, b, c, 0, 0, 0}
+
+/** Helper for returning sys_ret with 4 arguments. */
#define SYS_RET4(a, b, c, d) (struct sys_ret){a, b, c, d, 0, 0}
+
+/** Helper for returning sys_ret with 5 arguments. */
#define SYS_RET5(a, b, c, d, e) (struct sys_ret){a, b, c, d, e, 0}
+
+/** Helper for returning sys_ret with 6 arguments. */
#define SYS_RET6(a, b, c, d, e, f) (struct sys_ret){a, b, c, d, e, f}
/**
@@ -504,10 +517,11 @@ SYSCALL_DECLARE2(ipc_notify, tid, swap);
* Creates thread in current effective process context.
*
* @param func Function to call on startup.
- * @param arg Argument to pass to function.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
+ * @param d0 Argument 0.
+ * @param d1 Argument 1.
+ * @param d2 Argument 2.
+ * @param d3 Argument 3.
+ *
* @return \ref OK and 0.
* \todo Should this take stack size etc?
*/