aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/bits.c4
-rw-r--r--common/dispatch.c23
2 files changed, 27 insertions, 0 deletions
diff --git a/common/bits.c b/common/bits.c
index 5691617..d92fd29 100644
--- a/common/bits.c
+++ b/common/bits.c
@@ -44,6 +44,10 @@ __weak int ffs(int v)
if (v == 0)
return 0;
+ /* silence ubsan warning */
+ if (v == INT_MIN)
+ return 32;
+
int c = 32;
v &= -v;
diff --git a/common/dispatch.c b/common/dispatch.c
index 1325d62..7fc13cf 100644
--- a/common/dispatch.c
+++ b/common/dispatch.c
@@ -1,6 +1,29 @@
#include <apos/uapi.h>
#include <apos/ipi.h>
+/**
+ * @file dispatch.c
+ *
+ * Interface between assembly and C for dispatching syscalls/IPIs.
+ * In apos, IPIs are a higher level concept and is not expected to be handled by
+ * the underlying architecture. Instead, we only require that there is some way
+ * to trigger an interrupt in some other core, and check if the interrupt was an
+ * IPI or syscall in C.
+ */
+
+/**
+ * Syscall/IPI handler.
+ * If a syscall was triggered, parameters have the meaning they are given.
+ * Otherwise, they are meaningless and unused.
+ *
+ * @param a Syscall number.
+ * @param b Argument 0.
+ * @param c Argument 1.
+ * @param d Argument 2.
+ * @param e Argument 3.
+ * @param f Argument 4.
+ * @return Return value of taken action.
+ */
struct sys_ret dispatch(sys_arg_t a, sys_arg_t b, sys_arg_t c,
sys_arg_t d, sys_arg_t e, sys_arg_t f)
{