aboutsummaryrefslogtreecommitdiff
path: root/common/dispatch.c
blob: 62f10a9a9117599a749f1eef0f3367196923fe8c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* SPDX-License-Identifier: copyleft-next-0.3.1 */
/* Copyright 2023 Kim Kuparinen < kimi.h.kuparinen@gmail.com > */

#include <kmi/uapi.h>
#include <kmi/ipi.h>

/**
 * @file dispatch.c
 *
 * Interface between assembly and C for dispatching syscalls/IPIs.
 * In kmi, 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.
 *
 * Returns value of taken action.
 */
void 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)
{
	struct tcb *t = cur_tcb();
	if (clear_ipi(t)) {
		handle_ipi(t);
		return;
	}

	handle_syscall(a, b, c, d, e, f, t);
}