aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/dispatch.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-09-14 23:34:58 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-09-14 23:34:58 +0300
commit30055ec1753b5f8cfc2940dba5d4188475fdbf7f (patch)
tree5497eb92f0f7083755589ca5a31755166a739522 /common/uapi/dispatch.c
parentcabbf335824db0df835e4c541c19d3803ce38454 (diff)
downloadkmi-30055ec1753b5f8cfc2940dba5d4188475fdbf7f.tar.gz
kmi-30055ec1753b5f8cfc2940dba5d4188475fdbf7f.zip
add putch syscall for easier userspace debugging
+ Note that it is NOT intended for end user usage, just for debugging.
Diffstat (limited to 'common/uapi/dispatch.c')
-rw-r--r--common/uapi/dispatch.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/common/uapi/dispatch.c b/common/uapi/dispatch.c
index 73e037a..b16b255 100644
--- a/common/uapi/dispatch.c
+++ b/common/uapi/dispatch.c
@@ -14,6 +14,10 @@
static const sys_t syscall_table[] = {
/* noop */
[SYS_NOOP] = sys_noop,
+
+ /* debugging */
+ [SYS_PUTCH] = sys_putch,
+
/* mem */
[SYS_REQ_MEM] = sys_req_mem,
[SYS_REQ_PMEM] = sys_req_pmem,
@@ -55,6 +59,18 @@ SYSCALL_DEFINE0(noop)(){
return (struct sys_ret){ OK, 0 };
}
+/**
+ * Putch syscall handler.
+ *
+ * @param a Character to put.
+ * @return \ref OK and 0.
+ */
+SYSCALL_DEFINE1(putch)(sys_arg_t a){
+ const char c[2] = {a, 0};
+ dbg((const char *)&c);
+ return (struct sys_ret){ OK, 0 };
+}
+
struct sys_ret syscall_dispatch(sys_arg_t syscall, sys_arg_t a, sys_arg_t b,
sys_arg_t c, sys_arg_t d)
{
@@ -67,9 +83,13 @@ struct sys_ret syscall_dispatch(sys_arg_t syscall, sys_arg_t a, sys_arg_t b,
return (struct sys_ret){ ERR_INVAL, 0 };
}
- /* the syscall must be a valid number, as they're numbered in a linear
- * fashion */
- struct sys_ret r = syscall_table[syscall](a, b, c, d);
+ sys_t call = syscall_table[sc];
+ if (!call) {
+ error("Syscall %zu not legitimate value\n", sc);
+ return (struct sys_ret){ ERR_INVAL, 0 };
+ }
+
+ struct sys_ret r = call(a, b, c, d);
if (check_canary(t)) {
bug("Syscall %zu overwrote stack canary\n", syscall);