21 #ifndef _LIB_COBALT_ARM_SYSCALL_H 22 #define _LIB_COBALT_ARM_SYSCALL_H 24 #include <xeno_config.h> 26 #include <cobalt/uapi/syscall.h> 32 #if defined(HAVE_TLS) && __GNUC__ == 4 && __GNUC_MINOR__ >= 3 33 #error TLS support (__thread) is broken with GCC >= 4.3, use --disable-tls when configuring 36 #define LOADARGS_0(syscode, dummy...) \ 37 __a0 = (unsigned long) (syscode) 38 #define LOADARGS_1(syscode, arg1) \ 39 LOADARGS_0(syscode); \ 40 __a1 = (unsigned long) (arg1) 41 #define LOADARGS_2(syscode, arg1, arg2) \ 42 LOADARGS_1(syscode, arg1); \ 43 __a2 = (unsigned long) (arg2) 44 #define LOADARGS_3(syscode, arg1, arg2, arg3) \ 45 LOADARGS_2(syscode, arg1, arg2); \ 46 __a3 = (unsigned long) (arg3) 47 #define LOADARGS_4(syscode, arg1, arg2, arg3, arg4) \ 48 LOADARGS_3(syscode, arg1, arg2, arg3); \ 49 __a4 = (unsigned long) (arg4) 50 #define LOADARGS_5(syscode, arg1, arg2, arg3, arg4, arg5) \ 51 LOADARGS_4(syscode, arg1, arg2, arg3, arg4); \ 52 __a5 = (unsigned long) (arg5) 54 #define CLOBBER_REGS_0 "r0" 55 #define CLOBBER_REGS_1 CLOBBER_REGS_0, "r1" 56 #define CLOBBER_REGS_2 CLOBBER_REGS_1, "r2" 57 #define CLOBBER_REGS_3 CLOBBER_REGS_2, "r3" 58 #define CLOBBER_REGS_4 CLOBBER_REGS_3, "r4" 59 #define CLOBBER_REGS_5 CLOBBER_REGS_4, "r5" 61 #define LOADREGS_0 __r0 = __a0 62 #define LOADREGS_1 LOADREGS_0; __r1 = __a1 63 #define LOADREGS_2 LOADREGS_1; __r2 = __a2 64 #define LOADREGS_3 LOADREGS_2; __r3 = __a3 65 #define LOADREGS_4 LOADREGS_3; __r4 = __a4 66 #define LOADREGS_5 LOADREGS_4; __r5 = __a5 68 #define ASM_INDECL_0 \ 69 unsigned long __a0; register unsigned long __r0 __asm__ ("r0"); 70 #define ASM_INDECL_1 ASM_INDECL_0; \ 71 unsigned long __a1; register unsigned long __r1 __asm__ ("r1") 72 #define ASM_INDECL_2 ASM_INDECL_1; \ 73 unsigned long __a2; register unsigned long __r2 __asm__ ("r2") 74 #define ASM_INDECL_3 ASM_INDECL_2; \ 75 unsigned long __a3; register unsigned long __r3 __asm__ ("r3") 76 #define ASM_INDECL_4 ASM_INDECL_3; \ 77 unsigned long __a4; register unsigned long __r4 __asm__ ("r4") 78 #define ASM_INDECL_5 ASM_INDECL_4; \ 79 unsigned long __a5; register unsigned long __r5 __asm__ ("r5") 81 #define ASM_INPUT_0 "0" (__r0) 82 #define ASM_INPUT_1 ASM_INPUT_0, "r" (__r1) 83 #define ASM_INPUT_2 ASM_INPUT_1, "r" (__r2) 84 #define ASM_INPUT_3 ASM_INPUT_2, "r" (__r3) 85 #define ASM_INPUT_4 ASM_INPUT_3, "r" (__r4) 86 #define ASM_INPUT_5 ASM_INPUT_4, "r" (__r5) 89 #define __sys1(x) __sys2(x) 92 #define __SYS_REG , "r7" 93 #define __SYS_REG_DECL register unsigned long __r7 __asm__ ("r7") 94 #define __SYS_REG_SET __r7 = XENO_ARM_SYSCALL 95 #define __SYS_REG_INPUT ,"r" (__r7) 96 #define __SYS_CALLOP "swi\t0" 99 #define __SYS_REG_DECL 100 #define __SYS_REG_SET 101 #define __SYS_REG_INPUT 102 #define __NR_OABI_SYSCALL_BASE 0x900000 103 #define __SYS_CALLOP "swi\t" __sys1(__NR_OABI_SYSCALL_BASE + XENO_ARM_SYSCALL) "" 106 #define XENOMAI_DO_SYSCALL(nr, op, args...) \ 110 LOADARGS_##nr(__xn_syscode(op), args); \ 111 __asm__ __volatile__ ("" : : : \ 112 CLOBBER_REGS_##nr __SYS_REG); \ 115 __asm__ __volatile__ ( \ 118 : ASM_INPUT_##nr __SYS_REG_INPUT \ 123 #define XENOMAI_SYSCALL0(op) \ 124 XENOMAI_DO_SYSCALL(0,op) 125 #define XENOMAI_SYSCALL1(op,a1) \ 126 XENOMAI_DO_SYSCALL(1,op,a1) 127 #define XENOMAI_SYSCALL2(op,a1,a2) \ 128 XENOMAI_DO_SYSCALL(2,op,a1,a2) 129 #define XENOMAI_SYSCALL3(op,a1,a2,a3) \ 130 XENOMAI_DO_SYSCALL(3,op,a1,a2,a3) 131 #define XENOMAI_SYSCALL4(op,a1,a2,a3,a4) \ 132 XENOMAI_DO_SYSCALL(4,op,a1,a2,a3,a4) 133 #define XENOMAI_SYSCALL5(op,a1,a2,a3,a4,a5) \ 134 XENOMAI_DO_SYSCALL(5,op,a1,a2,a3,a4,a5) 135 #define XENOMAI_SYSBIND(breq) \ 136 XENOMAI_DO_SYSCALL(1,sc_cobalt_bind,breq)