C Microkernel Realtime eXecutive
Realtime Operating System for Cortex-M based microcontrollers
 
Loading...
Searching...
No Matches
sysenter.h
1#pragma once
2
3#include <cmrx/defines.h>
4
5#define __SYSCALL
6
7#define CMRX_SYSCALL_GET_ARG_COUNT_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
8#ifdef __clang__
9# define CMRX_SYSCALL_GET_ARG_COUNT(...) CMRX_SYSCALL_GET_ARG_COUNT_HELPER(10, ## __VA_ARGS__ , 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
10#else
11# define CMRX_SYSCALL_GET_ARG_COUNT(...) CMRX_SYSCALL_GET_ARG_COUNT_HELPER(__VA_ARGS__ __VA_OPT__(,) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
12#endif
13
14int system_call_entrypoint(unsigned long arg0,
15 unsigned long arg1,
16 unsigned long arg2,
17 unsigned long arg3,
18 unsigned long arg4,
19 unsigned long arg5,
20 unsigned char syscall_id);
21
22#define CMRX_SYSCALL_PASTER(argcount) CMRX_SYSCALL_CALL_ ## argcount
23#define CMRX_SYSCALL_EVALUATOR(argcount) CMRX_SYSCALL_PASTER(argcount)
24
25#define CMRX_SYSCALL_CALL_6(no, arg0, arg1, arg2, arg3, arg4, arg5) \
26system_call_entrypoint((unsigned long) arg0, \
27(unsigned long) arg1, \
28(unsigned long) arg2, \
29(unsigned long) arg3, \
30(unsigned long) arg4, \
31(unsigned long) arg5, \
32no)
33#define CMRX_SYSCALL_CALL_5(no, arg0, arg1, arg2, arg3, arg4) \
34system_call_entrypoint((unsigned long) arg0, \
35(unsigned long) arg1, \
36(unsigned long) arg2, \
37(unsigned long) arg3, \
38(unsigned long) arg4, \
390, no)
40#define CMRX_SYSCALL_CALL_4(no, arg0, arg1, arg2, arg3) \
41 system_call_entrypoint((unsigned long) arg0, \
42 (unsigned long) arg1, \
43 (unsigned long) arg2, \
44 (unsigned long) arg3, \
45 0, 0, no)
46#define CMRX_SYSCALL_CALL_3(no, arg0, arg1, arg2) system_call_entrypoint(\
47 (unsigned long) arg0, \
48 (unsigned long) arg1, \
49 (unsigned long) arg2, \
50 0, 0, 0, no)
51#define CMRX_SYSCALL_CALL_2(no, arg0, arg1) system_call_entrypoint(\
52 (unsigned long) arg0, \
53 (unsigned long) arg1, \
54 0, 0, 0, 0, no)
55#define CMRX_SYSCALL_CALL_1(no, arg0) system_call_entrypoint(\
56 (unsigned long) arg0, \
57 0, 0, 0, 0, 0, no)
58#define CMRX_SYSCALL_CALL_0(no) system_call_entrypoint(0, 0, 0, 0, 0, 0, no)
59
60#define __SVC(no, ...) \
61 return CMRX_SYSCALL_EVALUATOR(CMRX_SYSCALL_GET_ARG_COUNT(__VA_ARGS__))(\
62 no, ##__VA_ARGS__)
int system_call_entrypoint(unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5, unsigned char syscall_id)
Entrypoint into system call machinery.
Definition posix.c:93