18 #ifndef _LIB_COBALT_POWERPC_SYSCALL_H 19 #define _LIB_COBALT_POWERPC_SYSCALL_H 21 #include <xeno_config.h> 22 #include <cobalt/uapi/syscall.h> 28 #ifdef CONFIG_XENO_X86_VSYSCALL 36 #define DOSYSCALL "call *%%gs:0x10\n\t" 38 #define DOSYSCALL "int $0x80\n\t" 42 #define DOSYSCALLSAFE "int $0x80\n\t" 44 asm (
".L__X'%ebx = 1\n\t" 52 ".macro bpushl name reg\n\t" 57 "xchgl \\reg, %ebx\n\t" 61 ".macro bpopl name reg\n\t" 66 "xchgl \\reg, %ebx\n\t" 70 ".macro bmovl name reg\n\t" 73 "movl \\reg, %ebx\n\t" 78 #define XENOMAI_DO_SYSCALL(nr, op, args...) \ 80 unsigned __resultvar; \ 83 "movl %1, %%eax\n\t" \ 86 : "=a" (__resultvar) \ 87 : "i" (__xn_syscode(op)) ASMFMT_##nr(args) \ 92 #define XENOMAI_DO_SYSCALL_SAFE(nr, op, args...) \ 94 unsigned __resultvar; \ 97 "movl %1, %%eax\n\t" \ 100 : "=a" (__resultvar) \ 101 : "i" (__xn_syscode(op)) ASMFMT_##nr(args) \ 108 "bpushl .L__X'%k2, %k2\n\t" \ 109 "bmovl .L__X'%k2, %k2\n\t" 110 #define LOADARGS_2 LOADARGS_1 111 #define LOADARGS_3 LOADARGS_1 112 #define LOADARGS_4 LOADARGS_1 113 #define LOADARGS_5 LOADARGS_1 115 #define RESTOREARGS_0 116 #define RESTOREARGS_1 \ 117 "bpopl .L__X'%k2, %k2\n\t" 118 #define RESTOREARGS_2 RESTOREARGS_1 119 #define RESTOREARGS_3 RESTOREARGS_1 120 #define RESTOREARGS_4 RESTOREARGS_1 121 #define RESTOREARGS_5 RESTOREARGS_1 124 #define ASMFMT_1(arg1) \ 126 #define ASMFMT_2(arg1, arg2) \ 127 , "adSD" (arg1), "c" (arg2) 128 #define ASMFMT_3(arg1, arg2, arg3) \ 129 , "aSD" (arg1), "c" (arg2), "d" (arg3) 130 #define ASMFMT_4(arg1, arg2, arg3, arg4) \ 131 , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4) 132 #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \ 133 , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5) 135 #define XENOMAI_SYSBIND(breq) \ 136 XENOMAI_DO_SYSCALL_SAFE(1, sc_cobalt_bind, breq) 140 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) 141 #define LOAD_ARGS_0() asm volatile ("" : : : "memory"); 143 #define LOAD_ARGS_0() 148 #define LOAD_ARGS_1(a1) \ 149 long int __arg1 = (long) (a1); \ 151 #define LOAD_REGS_1 \ 152 register long int _a1 asm ("rdi") = __arg1; \ 154 #define ASM_ARGS_1 ASM_ARGS_0, "r" (_a1) 156 #define LOAD_ARGS_2(a1, a2) \ 157 long int __arg2 = (long) (a2); \ 159 #define LOAD_REGS_2 \ 160 register long int _a2 asm ("rsi") = __arg2; \ 162 #define ASM_ARGS_2 ASM_ARGS_1, "r" (_a2) 164 #define LOAD_ARGS_3(a1, a2, a3) \ 165 long int __arg3 = (long) (a3); \ 167 #define LOAD_REGS_3 \ 168 register long int _a3 asm ("rdx") = __arg3; \ 170 #define ASM_ARGS_3 ASM_ARGS_2, "r" (_a3) 172 #define LOAD_ARGS_4(a1, a2, a3, a4) \ 173 long int __arg4 = (long) (a4); \ 174 LOAD_ARGS_3 (a1, a2, a3) 175 #define LOAD_REGS_4 \ 176 register long int _a4 asm ("r10") = __arg4; \ 178 #define ASM_ARGS_4 ASM_ARGS_3, "r" (_a4) 180 #define LOAD_ARGS_5(a1, a2, a3, a4, a5) \ 181 long int __arg5 = (long) (a5); \ 182 LOAD_ARGS_4 (a1, a2, a3, a4) 183 #define LOAD_REGS_5 \ 184 register long int _a5 asm ("r8") = __arg5; \ 186 #define ASM_ARGS_5 ASM_ARGS_4, "r" (_a5) 188 #define DO_SYSCALL(name, nr, args...) \ 190 unsigned long __resultvar; \ 191 LOAD_ARGS_##nr(args) \ 195 : "=a" (__resultvar) \ 196 : "0" (name) ASM_ARGS_##nr \ 197 : "memory", "cc", "r11", "cx"); \ 201 #define XENOMAI_DO_SYSCALL(nr, op, args...) \ 202 DO_SYSCALL(__xn_syscode(op), nr, args) 204 #define XENOMAI_SYSBIND(breq) \ 205 XENOMAI_DO_SYSCALL(1, sc_cobalt_bind, breq) 209 #define XENOMAI_SYSCALL0(op) XENOMAI_DO_SYSCALL(0,op) 210 #define XENOMAI_SYSCALL1(op,a1) XENOMAI_DO_SYSCALL(1,op,a1) 211 #define XENOMAI_SYSCALL2(op,a1,a2) XENOMAI_DO_SYSCALL(2,op,a1,a2) 212 #define XENOMAI_SYSCALL3(op,a1,a2,a3) XENOMAI_DO_SYSCALL(3,op,a1,a2,a3) 213 #define XENOMAI_SYSCALL4(op,a1,a2,a3,a4) XENOMAI_DO_SYSCALL(4,op,a1,a2,a3,a4) 214 #define XENOMAI_SYSCALL5(op,a1,a2,a3,a4,a5) XENOMAI_DO_SYSCALL(5,op,a1,a2,a3,a4,a5)