18 #ifndef _LIB_COBALT_ARM64_SYSCALL_H
19 #define _LIB_COBALT_ARM64_SYSCALL_H
21 #include <xeno_config.h>
23 #include <cobalt/uapi/syscall.h>
25 #define __emit_asmdecl0 \
26 register unsigned int __scno __asm__ ("w8"); \
27 register unsigned long __res __asm__ ("x0")
28 #define __emit_asmdecl1 \
29 __emit_asmdecl0; register unsigned long __x0 __asm__ ("x0")
30 #define __emit_asmdecl2 \
31 __emit_asmdecl1; register unsigned long __x1 __asm__ ("x1")
32 #define __emit_asmdecl3 \
33 __emit_asmdecl2; register unsigned long __x2 __asm__ ("x2")
34 #define __emit_asmdecl4 \
35 __emit_asmdecl3; register unsigned long __x3 __asm__ ("x3")
36 #define __emit_asmdecl5 \
37 __emit_asmdecl4; register unsigned long __x4 __asm__ ("x4")
39 #define __load_asminput0(__op) \
40 __scno = (unsigned int)__xn_syscode(__op)
41 #define __load_asminput1(__op, __a1) \
42 __load_asminput0(__op); \
43 __x0 = (unsigned long)(__a1)
44 #define __load_asminput2(__op, __a1, __a2) \
45 __load_asminput1(__op, __a1); \
46 __x1 = (unsigned long)(__a2)
47 #define __load_asminput3(__op, __a1, __a2, __a3) \
48 __load_asminput2(__op, __a1, __a2); \
49 __x2 = (unsigned long)(__a3)
50 #define __load_asminput4(__op, __a1, __a2, __a3, __a4) \
51 __load_asminput3(__op, __a1, __a2, __a3); \
52 __x3 = (unsigned long)(__a4)
53 #define __load_asminput5(__op, __a1, __a2, __a3, __a4, __a5) \
54 __load_asminput4(__op, __a1, __a2, __a3, __a4); \
55 __x4 = (unsigned long)(__a5)
57 #define __emit_syscall0(__args...) \
58 __asm__ __volatile__ ( \
61 : "r" (__scno), ##__args \
64 #define __emit_syscall1(__a1, __args...) \
65 __emit_syscall0("r" (__x0), ##__args)
66 #define __emit_syscall2(__a1, __a2, __args...) \
67 __emit_syscall1(__a1, "r" (__x1), ##__args)
68 #define __emit_syscall3(__a1, __a2, __a3, __args...) \
69 __emit_syscall2(__a1, __a2, "r" (__x2), ##__args)
70 #define __emit_syscall4(__a1, __a2, __a3, __a4, __args...) \
71 __emit_syscall3(__a1, __a2, __a3, "r" (__x3), ##__args)
72 #define __emit_syscall5(__a1, __a2, __a3, __a4, __a5, __args...) \
73 __emit_syscall4(__a1, __a2, __a3, __a4, "r" (__x4), ##__args)
75 #define XENOMAI_DO_SYSCALL(__argnr, __op, __args...) \
77 __emit_asmdecl##__argnr; \
78 __load_asminput##__argnr(__op, ##__args); \
79 __emit_syscall##__argnr(__args); \
82 #define XENOMAI_SYSCALL0(__op) \
83 XENOMAI_DO_SYSCALL(0, __op)
84 #define XENOMAI_SYSCALL1(__op, __a1) \
85 XENOMAI_DO_SYSCALL(1, __op, __a1)
86 #define XENOMAI_SYSCALL2(__op, __a1, __a2) \
87 XENOMAI_DO_SYSCALL(2, __op, __a1, __a2)
88 #define XENOMAI_SYSCALL3(__op, __a1, __a2, __a3) \
89 XENOMAI_DO_SYSCALL(3, __op, __a1, __a2, __a3)
90 #define XENOMAI_SYSCALL4(__op, __a1, __a2, __a3, __a4) \
91 XENOMAI_DO_SYSCALL(4, __op, __a1, __a2, __a3, __a4)
92 #define XENOMAI_SYSCALL5(__op, __a1, __a2, __a3, __a4, __a5) \
93 XENOMAI_DO_SYSCALL(5, __op, __a1, __a2, __a3, __a4, __a5)
94 #define XENOMAI_SYSBIND(__breq) \
95 XENOMAI_DO_SYSCALL(1, sc_cobalt_bind, __breq)