diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-11-13 17:16:28 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-11-13 17:16:28 +0200 |
| commit | 1a0188fac0c0f265c4495b83592389b8b3645462 (patch) | |
| tree | c1687724dd7f7ccf6d9d0d134c2766f14d3e39f5 /common/uapi | |
| parent | e6dc962ef7758c438039d7f8ac7e2bf3ebcb5c10 (diff) | |
| download | kmi-1a0188fac0c0f265c4495b83592389b8b3645462.tar.gz kmi-1a0188fac0c0f265c4495b83592389b8b3645462.zip | |
outline rpc stack handling
Diffstat (limited to 'common/uapi')
| -rw-r--r-- | common/uapi/conf.c | 62 | ||||
| -rw-r--r-- | common/uapi/ipc.c | 3 |
2 files changed, 61 insertions, 4 deletions
diff --git a/common/uapi/conf.c b/common/uapi/conf.c index 2094604..596cb5c 100644 --- a/common/uapi/conf.c +++ b/common/uapi/conf.c @@ -16,6 +16,15 @@ * conf*-syscalls even necessary? */ size_t __thread_stack_size = SZ_2M; size_t __call_stack_size = SZ_2M; +size_t __rpc_stack_size = SZ_512K; + +/** IDs for configuration parameters. */ +/** @todo should probably be moved somewhere so it can be shared with userspace */ +enum conf_param { + CONF_THREAD_STACK = 0, + CONF_CALL_STACK, + CONF_RPC_STACK, +}; /** * Configuration parameter read syscall handler. @@ -27,7 +36,29 @@ size_t __call_stack_size = SZ_2M; */ SYSCALL_DEFINE1(conf_get)(sys_arg_t param) { - return SYS_RET1(OK); + struct tcb *t = cur_tcb(); + if (!has_cap(t->caps, CAP_CONF)) + return SYS_RET1(ERR_PERM); + + long val = 0; + switch (param) { + case CONF_THREAD_STACK: + val = __thread_stack_size; + break; + + case CONF_CALL_STACK: + val = __call_stack_size; + break; + + case CONF_RPC_STACK: + val = __rpc_stack_size; + break; + + default: + return SYS_RET1(ERR_NF); + } + + return SYS_RET2(OK, val); } /** @@ -41,9 +72,32 @@ SYSCALL_DEFINE1(conf_get)(sys_arg_t param) */ SYSCALL_DEFINE2(conf_set)(sys_arg_t param, sys_arg_t val) { - UNUSED(param); - UNUSED(val); - /* no parameters supported atm */ + struct tcb *t = cur_tcb(); + if (!has_cap(t->caps, CAP_CONF)) + return SYS_RET1(ERR_PERM); + + size_t size = 0; + switch (param) { + case CONF_THREAD_STACK: + __thread_stack_size = align_up(val, BASE_PAGE_SIZE); + break; + + case CONF_CALL_STACK: + size = align_up(val, 4 * BASE_PAGE_SIZE); + if (size < __rpc_stack_size * 4) + return SYS_RET1(ERR_MISC); + + __call_stack_size = size; + break; + + case CONF_RPC_STACK: + size = align_up(val, BASE_PAGE_SIZE); + if (size > __call_stack_size / 4) + return SYS_RET1(ERR_MISC); + + __rpc_stack_size = size; + break; + } return SYS_RET1(OK); } diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c index 052e0ad..5d91588 100644 --- a/common/uapi/ipc.c +++ b/common/uapi/ipc.c @@ -41,6 +41,9 @@ static struct sys_ret do_ipc(sys_arg_t pid, bool fwd) { struct tcb *t = cur_tcb(); + if (!enough_rpc_stack(t)) + return SYS_RET1(ERR_OOMEM); + struct tcb *r = get_tcb(pid); if (!r) return SYS_RET1(ERR_INVAL); |
