From 6be4e656cbf575dbcba95de4e99183586aa88ffe Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 22 Oct 2022 18:39:57 +0300 Subject: create impl and CAP_PROC checking --- arch/riscv64/kernel/cpu.c | 1 + common/proc.c | 3 +++ common/tcb.c | 6 ++++++ common/uapi/proc.c | 39 ++++++++++++++++++++++++++++++++------- include/apos/caps.h | 3 --- include/apos/tcb.h | 9 ++++++++- include/apos/uapi.h | 22 ++++++++++++++++++---- 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 +/** 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 @@ -298,6 +298,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,10 +268,17 @@ 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. * 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? */ -- cgit v1.3