aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/riscv64/kernel/vmem.c24
-rw-r--r--common/uapi/proc.c2
-rw-r--r--include/kmi/uapi.h146
3 files changed, 82 insertions, 90 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index 89d895f..9edd246 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -398,8 +398,8 @@ static void __use_vmem(struct vmem *branch, enum mm_mode m)
else if (m == Sv48)
mode = SATP_MODE_Sv48;
- flush_tlb_full();
csr_write(CSR_SATP, mode | pn);
+ flush_tlb_full();
/* Sv57 && Sv64 in the future? */
/** @todo ASID table for maybe faster context switches? */
}
@@ -468,33 +468,19 @@ vm_t setup_kernel_io(struct vmem *b, vm_t paddr)
void clone_uvmem(struct vmem * restrict r, struct vmem * restrict b)
{
size_t i = 0;
- for (; i < CSTACK_PAGE; i += 8) {
+ for (; i < CSTACK_PAGE; ++i) {
struct vmem *t = r->leaf[i + 0];
if (t == 0)
break;
- b->leaf[i + 0] = t;
- b->leaf[i + 1] = r->leaf[i + 1];
- b->leaf[i + 2] = r->leaf[i + 2];
- b->leaf[i + 3] = r->leaf[i + 3];
- b->leaf[i + 4] = r->leaf[i + 4];
- b->leaf[i + 5] = r->leaf[i + 5];
- b->leaf[i + 6] = r->leaf[i + 6];
- b->leaf[i + 7] = r->leaf[i + 7];
+ b->leaf[i] = t;
}
- for (; i < CSTACK_PAGE; i += 8) {
+ for (; i < CSTACK_PAGE; ++i) {
struct vmem *t = b->leaf[i + 0];
if (t == 0)
break;
- b->leaf[i + 0] = 0;
- b->leaf[i + 1] = 0;
- b->leaf[i + 2] = 0;
- b->leaf[i + 3] = 0;
- b->leaf[i + 4] = 0;
- b->leaf[i + 5] = 0;
- b->leaf[i + 6] = 0;
- b->leaf[i + 7] = 0;
+ b->leaf[i] = 0;
}
}
diff --git a/common/uapi/proc.c b/common/uapi/proc.c
index 2f1a638..81e3305 100644
--- a/common/uapi/proc.c
+++ b/common/uapi/proc.c
@@ -183,5 +183,5 @@ SYSCALL_DEFINE1(swap)(struct tcb *t, sys_arg_t tid){
set_args(t, SYS_RET1(OK));
/* get register state for new thread */
- return_args(t, get_args(s));
+ return_args(s, get_args(s));
}
diff --git a/include/kmi/uapi.h b/include/kmi/uapi.h
index 1ec69db..ad4369f 100644
--- a/include/kmi/uapi.h
+++ b/include/kmi/uapi.h
@@ -158,21 +158,27 @@ struct sys_ret {
/**
* Helper macro for defining syscall with zero arguments.
*
+ * Note the \c __noinline attribute, might seem weird but turned out
+ * that gcc liked to inline all system calls into handle_syscall(),
+ * which seems to add quite a bit of moving registers around and spilling
+ * into memory. Forcing the syscalls to not be inlined removed this
+ * overhead and sped things up by ~7 %.
+ *
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE0(name) \
- static inline void __##name(struct tcb *t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(a); \
- UNUSED(b); \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t); \
- } \
+#define SYSCALL_DEFINE0(name) \
+ static inline void __##name(struct tcb *t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ UNUSED(a); \
+ UNUSED(b); \
+ UNUSED(c); \
+ UNUSED(d); \
+ UNUSED(e); \
+ __##name(t); \
+ } \
static inline void __##name
/**
@@ -180,18 +186,18 @@ struct sys_ret {
*
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE1(name) \
- static inline void __##name(struct tcb *, sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(b); \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a); \
- } \
+#define SYSCALL_DEFINE1(name) \
+ static inline void __##name(struct tcb *, sys_arg_t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ UNUSED(b); \
+ UNUSED(c); \
+ UNUSED(d); \
+ UNUSED(e); \
+ __##name(t, a); \
+ } \
static inline void __##name
/**
@@ -199,18 +205,18 @@ struct sys_ret {
*
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE2(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a, b); \
- } \
+#define SYSCALL_DEFINE2(name) \
+ static inline void __##name(struct tcb *, sys_arg_t, \
+ sys_arg_t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ UNUSED(c); \
+ UNUSED(d); \
+ UNUSED(e); \
+ __##name(t, a, b); \
+ } \
static inline void __##name
/**
@@ -218,18 +224,18 @@ struct sys_ret {
*
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE3(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a, b, c); \
- } \
+#define SYSCALL_DEFINE3(name) \
+ static inline void __##name(struct tcb *, sys_arg_t, \
+ sys_arg_t, \
+ sys_arg_t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ UNUSED(d); \
+ UNUSED(e); \
+ __##name(t, a, b, c); \
+ } \
static inline void __##name
/**
@@ -237,17 +243,17 @@ struct sys_ret {
*
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE4(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(e); \
- __##name(t, a, b, c, d); \
- } \
+#define SYSCALL_DEFINE4(name) \
+ static inline void __##name(struct tcb *, sys_arg_t, \
+ sys_arg_t, sys_arg_t, \
+ sys_arg_t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ UNUSED(e); \
+ __##name(t, a, b, c, d); \
+ } \
static inline void __##name
/**
@@ -255,16 +261,16 @@ struct sys_ret {
*
* @param name Name of syscall.
*/
-#define SYSCALL_DEFINE5(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, sys_arg_t, \
- sys_arg_t, sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- __##name(t, a, b, c, d, e); \
- } \
+#define SYSCALL_DEFINE5(name) \
+ static inline void __##name(struct tcb *, sys_arg_t, \
+ sys_arg_t, sys_arg_t, \
+ sys_arg_t, sys_arg_t); \
+ void __noinline sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
+ sys_arg_t c, \
+ sys_arg_t d, sys_arg_t e) \
+ { \
+ __##name(t, a, b, c, d, e); \
+ } \
static void __##name
/** @name Misc syscalls. */