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)