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)