19 #ifndef _LIB_COBALT_POWERPC_SYSCALL_H 20 #define _LIB_COBALT_POWERPC_SYSCALL_H 22 #include <cobalt/uapi/syscall.h> 26 #define LOADARGS_0(syscode, dummy...) \ 27 __sc_0 = (unsigned long)(syscode) 28 #define LOADARGS_1(syscode, arg1) \ 29 LOADARGS_0(syscode); \ 30 __sc_3 = (unsigned long) (arg1) 31 #define LOADARGS_2(syscode, arg1, arg2) \ 32 LOADARGS_1(syscode, arg1); \ 33 __sc_4 = (unsigned long) (arg2) 34 #define LOADARGS_3(syscode, arg1, arg2, arg3) \ 35 LOADARGS_2(syscode, arg1, arg2); \ 36 __sc_5 = (unsigned long) (arg3) 37 #define LOADARGS_4(syscode, arg1, arg2, arg3, arg4) \ 38 LOADARGS_3(syscode, arg1, arg2, arg3); \ 39 __sc_6 = (unsigned long) (arg4) 40 #define LOADARGS_5(syscode, arg1, arg2, arg3, arg4, arg5) \ 41 LOADARGS_4(syscode, arg1, arg2, arg3, arg4); \ 42 __sc_7 = (unsigned long) (arg5) 44 #define ASM_INPUT_0 "0" (__sc_0) 45 #define ASM_INPUT_1 ASM_INPUT_0, "1" (__sc_3) 46 #define ASM_INPUT_2 ASM_INPUT_1, "2" (__sc_4) 47 #define ASM_INPUT_3 ASM_INPUT_2, "3" (__sc_5) 48 #define ASM_INPUT_4 ASM_INPUT_3, "4" (__sc_6) 49 #define ASM_INPUT_5 ASM_INPUT_4, "5" (__sc_7) 51 #define XENOMAI_DO_SYSCALL(nr, op, args...) \ 53 register unsigned long __sc_0 __asm__ ("r0"); \ 54 register unsigned long __sc_3 __asm__ ("r3"); \ 55 register unsigned long __sc_4 __asm__ ("r4"); \ 56 register unsigned long __sc_5 __asm__ ("r5"); \ 57 register unsigned long __sc_6 __asm__ ("r6"); \ 58 register unsigned long __sc_7 __asm__ ("r7"); \ 60 LOADARGS_##nr(__xn_syscode(op), args); \ 61 __asm__ __volatile__ \ 65 "=&r" (__sc_3), "=&r" (__sc_4), \ 66 "=&r" (__sc_5), "=&r" (__sc_6), \ 69 : "cr0", "ctr", "memory", \ 70 "r8", "r9", "r10","r11", "r12"); \ 71 (int)((__sc_0 & (1 << 28)) ? -__sc_3 : __sc_3); \ 74 #define XENOMAI_SYSCALL0(op) XENOMAI_DO_SYSCALL(0,op) 75 #define XENOMAI_SYSCALL1(op,a1) XENOMAI_DO_SYSCALL(1,op,a1) 76 #define XENOMAI_SYSCALL2(op,a1,a2) XENOMAI_DO_SYSCALL(2,op,a1,a2) 77 #define XENOMAI_SYSCALL3(op,a1,a2,a3) XENOMAI_DO_SYSCALL(3,op,a1,a2,a3) 78 #define XENOMAI_SYSCALL4(op,a1,a2,a3,a4) XENOMAI_DO_SYSCALL(4,op,a1,a2,a3,a4) 79 #define XENOMAI_SYSCALL5(op,a1,a2,a3,a4,a5) XENOMAI_DO_SYSCALL(5,op,a1,a2,a3,a4,a5) 80 #define XENOMAI_SYSBIND(breq) XENOMAI_DO_SYSCALL(1,sc_cobalt_bind,breq)