aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-07-27 20:29:28 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-07-27 20:29:28 +0300
commit3212707a9ab549119ad0ad6441a07fe774c99f3b (patch)
tree9df1e69c92dabfea37202008f77f8a100c0a7de4 /include
parenta26fb216729ba7a7d0fbfc97c2082c9db512aa36 (diff)
downloadkmi-3212707a9ab549119ad0ad6441a07fe774c99f3b.tar.gz
kmi-3212707a9ab549119ad0ad6441a07fe774c99f3b.zip
use nifty variable argument count trick
+ Found it in newlib. This allows the compiler to more effectively optimize away unnecessary register operations. Applied to both kernel and init.c for a slight speed increase. I really should move init.c to some other repository though, the binary files are starting to get annoying
Diffstat (limited to 'include')
-rw-r--r--include/arch/proc.h2
-rw-r--r--include/kmi/uapi.h29
2 files changed, 29 insertions, 2 deletions
diff --git a/include/arch/proc.h b/include/arch/proc.h
index c9b54db..79b099e 100644
--- a/include/arch/proc.h
+++ b/include/arch/proc.h
@@ -23,7 +23,7 @@
* @param t Thread that will run after return.
* @param a Arguments to attach.
*/
-void set_args(struct tcb *t, struct sys_ret a);
+void set_args(struct tcb *t, size_t n, struct sys_ret a);
/**
* Get argument data attached to thread.
diff --git a/include/kmi/uapi.h b/include/kmi/uapi.h
index 526738a..477e315 100644
--- a/include/kmi/uapi.h
+++ b/include/kmi/uapi.h
@@ -817,6 +817,33 @@ void handle_syscall(sys_arg_t syscall, sys_arg_t a, sys_arg_t b,
* more readable? */
#include <arch/proc.h>
-#define return_args(t, x) {set_args((t), (x)); return;}
+
+#define set_args1(t, a) set_args(t, 1, SYS_RET1(a))
+#define set_args2(t, a, b) set_args(t, 2, SYS_RET2(a, b))
+#define set_args3(t, a, b, c) set_args(t, 3, SYS_RET3(a, b, c))
+#define set_args4(t, a, b, c, d) set_args(t, 4, SYS_RET4(a, b, c, d))
+#define set_args5(t, a, b, c, d, e) set_args(t, 5, SYS_RET5(a, b, c, d, e))
+#define set_args6(t, a, b, c, d, e, f) set_args(t, 6, \
+ SYS_RET6(a, b, c, d, e, f))
+
+#define return_args1(t, a) \
+ {set_args1(t, a); return;}
+
+#define return_args2(t, a, b) \
+ {set_args2(t, a, b); return;}
+
+#define return_args3(t, a, b, c) \
+ {set_args3(t, a, b, c); return;}
+
+#define return_args4(t, a, b, c, d) \
+ {set_args4(t, a, b, c, d); return;}
+
+#define return_args5(t, a, b, c, d, e) \
+ {set_args5(t, a, b, c, d, e); return;}
+
+#define return_args6(t, a, b, c, d, e, f) \
+ {set_args6(t, a, b, c, d, e, f); return;}
+
+#define return_args(t, x) {set_args((t), 6, (x)); return;}
#endif /* KMI_UAPI_H */