xref: /aosp_15_r20/external/liburing/src/arch/x86/syscall.h (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker 
3*25da2beaSAndroid Build Coastguard Worker #ifndef __INTERNAL__LIBURING_SYSCALL_H
4*25da2beaSAndroid Build Coastguard Worker 	#error "This file should be included from src/syscall.h (liburing)"
5*25da2beaSAndroid Build Coastguard Worker #endif
6*25da2beaSAndroid Build Coastguard Worker 
7*25da2beaSAndroid Build Coastguard Worker #ifndef LIBURING_ARCH_X86_SYSCALL_H
8*25da2beaSAndroid Build Coastguard Worker #define LIBURING_ARCH_X86_SYSCALL_H
9*25da2beaSAndroid Build Coastguard Worker 
10*25da2beaSAndroid Build Coastguard Worker #if defined(__x86_64__)
11*25da2beaSAndroid Build Coastguard Worker /**
12*25da2beaSAndroid Build Coastguard Worker  * Note for syscall registers usage (x86-64):
13*25da2beaSAndroid Build Coastguard Worker  *   - %rax is the syscall number.
14*25da2beaSAndroid Build Coastguard Worker  *   - %rax is also the return value.
15*25da2beaSAndroid Build Coastguard Worker  *   - %rdi is the 1st argument.
16*25da2beaSAndroid Build Coastguard Worker  *   - %rsi is the 2nd argument.
17*25da2beaSAndroid Build Coastguard Worker  *   - %rdx is the 3rd argument.
18*25da2beaSAndroid Build Coastguard Worker  *   - %r10 is the 4th argument (**yes it's %r10, not %rcx!**).
19*25da2beaSAndroid Build Coastguard Worker  *   - %r8  is the 5th argument.
20*25da2beaSAndroid Build Coastguard Worker  *   - %r9  is the 6th argument.
21*25da2beaSAndroid Build Coastguard Worker  *
22*25da2beaSAndroid Build Coastguard Worker  * `syscall` instruction will clobber %r11 and %rcx.
23*25da2beaSAndroid Build Coastguard Worker  *
24*25da2beaSAndroid Build Coastguard Worker  * After the syscall returns to userspace:
25*25da2beaSAndroid Build Coastguard Worker  *   - %r11 will contain %rflags.
26*25da2beaSAndroid Build Coastguard Worker  *   - %rcx will contain the return address.
27*25da2beaSAndroid Build Coastguard Worker  *
28*25da2beaSAndroid Build Coastguard Worker  * IOW, after the syscall returns to userspace:
29*25da2beaSAndroid Build Coastguard Worker  *   %r11 == %rflags and %rcx == %rip.
30*25da2beaSAndroid Build Coastguard Worker  */
31*25da2beaSAndroid Build Coastguard Worker 
32*25da2beaSAndroid Build Coastguard Worker #define __do_syscall0(NUM) ({			\
33*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;				\
34*25da2beaSAndroid Build Coastguard Worker 						\
35*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
36*25da2beaSAndroid Build Coastguard Worker 		"syscall"			\
37*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */	\
38*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM)	/* %rax */	\
39*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"	\
40*25da2beaSAndroid Build Coastguard Worker 	);					\
41*25da2beaSAndroid Build Coastguard Worker 	rax;					\
42*25da2beaSAndroid Build Coastguard Worker })
43*25da2beaSAndroid Build Coastguard Worker 
44*25da2beaSAndroid Build Coastguard Worker #define __do_syscall1(NUM, ARG1) ({		\
45*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;				\
46*25da2beaSAndroid Build Coastguard Worker 						\
47*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
48*25da2beaSAndroid Build Coastguard Worker 		"syscall"			\
49*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */	\
50*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */	\
51*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1))	/* %rdi */	\
52*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"	\
53*25da2beaSAndroid Build Coastguard Worker 	);					\
54*25da2beaSAndroid Build Coastguard Worker 	rax;					\
55*25da2beaSAndroid Build Coastguard Worker })
56*25da2beaSAndroid Build Coastguard Worker 
57*25da2beaSAndroid Build Coastguard Worker #define __do_syscall2(NUM, ARG1, ARG2) ({	\
58*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;				\
59*25da2beaSAndroid Build Coastguard Worker 						\
60*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
61*25da2beaSAndroid Build Coastguard Worker 		"syscall"			\
62*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */	\
63*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */	\
64*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1)),	/* %rdi */	\
65*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG2))	/* %rsi */	\
66*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"	\
67*25da2beaSAndroid Build Coastguard Worker 	);					\
68*25da2beaSAndroid Build Coastguard Worker 	rax;					\
69*25da2beaSAndroid Build Coastguard Worker })
70*25da2beaSAndroid Build Coastguard Worker 
71*25da2beaSAndroid Build Coastguard Worker #define __do_syscall3(NUM, ARG1, ARG2, ARG3) ({	\
72*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;				\
73*25da2beaSAndroid Build Coastguard Worker 						\
74*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
75*25da2beaSAndroid Build Coastguard Worker 		"syscall"			\
76*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */	\
77*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */	\
78*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1)),	/* %rdi */	\
79*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG2)),	/* %rsi */	\
80*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3))	/* %rdx */	\
81*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"	\
82*25da2beaSAndroid Build Coastguard Worker 	);					\
83*25da2beaSAndroid Build Coastguard Worker 	rax;					\
84*25da2beaSAndroid Build Coastguard Worker })
85*25da2beaSAndroid Build Coastguard Worker 
86*25da2beaSAndroid Build Coastguard Worker #define __do_syscall4(NUM, ARG1, ARG2, ARG3, ARG4) ({			\
87*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;							\
88*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4);	\
89*25da2beaSAndroid Build Coastguard Worker 									\
90*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(						\
91*25da2beaSAndroid Build Coastguard Worker 		"syscall"						\
92*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */				\
93*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */				\
94*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1)),	/* %rdi */				\
95*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG2)),	/* %rsi */				\
96*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3)),	/* %rdx */				\
97*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r10)	/* %r10 */				\
98*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"				\
99*25da2beaSAndroid Build Coastguard Worker 	);								\
100*25da2beaSAndroid Build Coastguard Worker 	rax;								\
101*25da2beaSAndroid Build Coastguard Worker })
102*25da2beaSAndroid Build Coastguard Worker 
103*25da2beaSAndroid Build Coastguard Worker #define __do_syscall5(NUM, ARG1, ARG2, ARG3, ARG4, ARG5) ({		\
104*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;							\
105*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4);	\
106*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG5) __r8 __asm__("r8") = (ARG5);		\
107*25da2beaSAndroid Build Coastguard Worker 									\
108*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(						\
109*25da2beaSAndroid Build Coastguard Worker 		"syscall"						\
110*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */				\
111*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */				\
112*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1)),	/* %rdi */				\
113*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG2)),	/* %rsi */				\
114*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3)),	/* %rdx */				\
115*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r10),	/* %r10 */				\
116*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r8)	/* %r8 */				\
117*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"				\
118*25da2beaSAndroid Build Coastguard Worker 	);								\
119*25da2beaSAndroid Build Coastguard Worker 	rax;								\
120*25da2beaSAndroid Build Coastguard Worker })
121*25da2beaSAndroid Build Coastguard Worker 
122*25da2beaSAndroid Build Coastguard Worker #define __do_syscall6(NUM, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) ({	\
123*25da2beaSAndroid Build Coastguard Worker 	intptr_t rax;							\
124*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG4) __r10 __asm__("r10") = (ARG4);	\
125*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG5) __r8 __asm__("r8") = (ARG5);		\
126*25da2beaSAndroid Build Coastguard Worker 	register __typeof__(ARG6) __r9 __asm__("r9") = (ARG6);		\
127*25da2beaSAndroid Build Coastguard Worker 									\
128*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(						\
129*25da2beaSAndroid Build Coastguard Worker 		"syscall"						\
130*25da2beaSAndroid Build Coastguard Worker 		: "=a"(rax)	/* %rax */				\
131*25da2beaSAndroid Build Coastguard Worker 		: "a"((NUM)),	/* %rax */				\
132*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG1)),	/* %rdi */				\
133*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG2)),	/* %rsi */				\
134*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3)),	/* %rdx */				\
135*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r10),	/* %r10 */				\
136*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r8),	/* %r8 */				\
137*25da2beaSAndroid Build Coastguard Worker 		  "r"(__r9)	/* %r9 */				\
138*25da2beaSAndroid Build Coastguard Worker 		: "rcx", "r11", "memory"				\
139*25da2beaSAndroid Build Coastguard Worker 	);								\
140*25da2beaSAndroid Build Coastguard Worker 	rax;								\
141*25da2beaSAndroid Build Coastguard Worker })
142*25da2beaSAndroid Build Coastguard Worker 
143*25da2beaSAndroid Build Coastguard Worker #include "../syscall-defs.h"
144*25da2beaSAndroid Build Coastguard Worker 
145*25da2beaSAndroid Build Coastguard Worker #else /* #if defined(__x86_64__) */
146*25da2beaSAndroid Build Coastguard Worker 
147*25da2beaSAndroid Build Coastguard Worker #ifdef CONFIG_NOLIBC
148*25da2beaSAndroid Build Coastguard Worker /**
149*25da2beaSAndroid Build Coastguard Worker  * Note for syscall registers usage (x86, 32-bit):
150*25da2beaSAndroid Build Coastguard Worker  *   - %eax is the syscall number.
151*25da2beaSAndroid Build Coastguard Worker  *   - %eax is also the return value.
152*25da2beaSAndroid Build Coastguard Worker  *   - %ebx is the 1st argument.
153*25da2beaSAndroid Build Coastguard Worker  *   - %ecx is the 2nd argument.
154*25da2beaSAndroid Build Coastguard Worker  *   - %edx is the 3rd argument.
155*25da2beaSAndroid Build Coastguard Worker  *   - %esi is the 4th argument.
156*25da2beaSAndroid Build Coastguard Worker  *   - %edi is the 5th argument.
157*25da2beaSAndroid Build Coastguard Worker  *   - %ebp is the 6th argument.
158*25da2beaSAndroid Build Coastguard Worker  */
159*25da2beaSAndroid Build Coastguard Worker 
160*25da2beaSAndroid Build Coastguard Worker #define __do_syscall0(NUM) ({			\
161*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;				\
162*25da2beaSAndroid Build Coastguard Worker 						\
163*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
164*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"			\
165*25da2beaSAndroid Build Coastguard Worker 		: "=a"(eax)	/* %eax */	\
166*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM)	/* %eax */	\
167*25da2beaSAndroid Build Coastguard Worker 		: "memory"			\
168*25da2beaSAndroid Build Coastguard Worker 	);					\
169*25da2beaSAndroid Build Coastguard Worker 	eax;					\
170*25da2beaSAndroid Build Coastguard Worker })
171*25da2beaSAndroid Build Coastguard Worker 
172*25da2beaSAndroid Build Coastguard Worker #define __do_syscall1(NUM, ARG1) ({		\
173*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;				\
174*25da2beaSAndroid Build Coastguard Worker 						\
175*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
176*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"			\
177*25da2beaSAndroid Build Coastguard Worker 		: "=a"(eax)	/* %eax */	\
178*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM),	/* %eax */	\
179*25da2beaSAndroid Build Coastguard Worker 		  "b"((ARG1))	/* %ebx */	\
180*25da2beaSAndroid Build Coastguard Worker 		: "memory"			\
181*25da2beaSAndroid Build Coastguard Worker 	);					\
182*25da2beaSAndroid Build Coastguard Worker 	eax;					\
183*25da2beaSAndroid Build Coastguard Worker })
184*25da2beaSAndroid Build Coastguard Worker 
185*25da2beaSAndroid Build Coastguard Worker #define __do_syscall2(NUM, ARG1, ARG2) ({	\
186*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;				\
187*25da2beaSAndroid Build Coastguard Worker 						\
188*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
189*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"			\
190*25da2beaSAndroid Build Coastguard Worker 		: "=a" (eax)	/* %eax */	\
191*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM),	/* %eax */	\
192*25da2beaSAndroid Build Coastguard Worker 		  "b"((ARG1)),	/* %ebx */	\
193*25da2beaSAndroid Build Coastguard Worker 		  "c"((ARG2))	/* %ecx */	\
194*25da2beaSAndroid Build Coastguard Worker 		: "memory"			\
195*25da2beaSAndroid Build Coastguard Worker 	);					\
196*25da2beaSAndroid Build Coastguard Worker 	eax;					\
197*25da2beaSAndroid Build Coastguard Worker })
198*25da2beaSAndroid Build Coastguard Worker 
199*25da2beaSAndroid Build Coastguard Worker #define __do_syscall3(NUM, ARG1, ARG2, ARG3) ({	\
200*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;				\
201*25da2beaSAndroid Build Coastguard Worker 						\
202*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(			\
203*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"			\
204*25da2beaSAndroid Build Coastguard Worker 		: "=a" (eax)	/* %eax */	\
205*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM),	/* %eax */	\
206*25da2beaSAndroid Build Coastguard Worker 		  "b"((ARG1)),	/* %ebx */	\
207*25da2beaSAndroid Build Coastguard Worker 		  "c"((ARG2)),	/* %ecx */	\
208*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3))	/* %edx */	\
209*25da2beaSAndroid Build Coastguard Worker 		: "memory"			\
210*25da2beaSAndroid Build Coastguard Worker 	);					\
211*25da2beaSAndroid Build Coastguard Worker 	eax;					\
212*25da2beaSAndroid Build Coastguard Worker })
213*25da2beaSAndroid Build Coastguard Worker 
214*25da2beaSAndroid Build Coastguard Worker #define __do_syscall4(NUM, ARG1, ARG2, ARG3, ARG4) ({	\
215*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;					\
216*25da2beaSAndroid Build Coastguard Worker 							\
217*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(				\
218*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"				\
219*25da2beaSAndroid Build Coastguard Worker 		: "=a" (eax)	/* %eax */		\
220*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM),	/* %eax */		\
221*25da2beaSAndroid Build Coastguard Worker 		  "b"((ARG1)),	/* %ebx */		\
222*25da2beaSAndroid Build Coastguard Worker 		  "c"((ARG2)),	/* %ecx */		\
223*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3)),	/* %edx */		\
224*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG4))	/* %esi */		\
225*25da2beaSAndroid Build Coastguard Worker 		: "memory"				\
226*25da2beaSAndroid Build Coastguard Worker 	);						\
227*25da2beaSAndroid Build Coastguard Worker 	eax;						\
228*25da2beaSAndroid Build Coastguard Worker })
229*25da2beaSAndroid Build Coastguard Worker 
230*25da2beaSAndroid Build Coastguard Worker #define __do_syscall5(NUM, ARG1, ARG2, ARG3, ARG4, ARG5) ({	\
231*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax;						\
232*25da2beaSAndroid Build Coastguard Worker 								\
233*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile(					\
234*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80"					\
235*25da2beaSAndroid Build Coastguard Worker 		: "=a" (eax)	/* %eax */			\
236*25da2beaSAndroid Build Coastguard Worker 		: "a"(NUM),	/* %eax */			\
237*25da2beaSAndroid Build Coastguard Worker 		  "b"((ARG1)),	/* %ebx */			\
238*25da2beaSAndroid Build Coastguard Worker 		  "c"((ARG2)),	/* %ecx */			\
239*25da2beaSAndroid Build Coastguard Worker 		  "d"((ARG3)),	/* %edx */			\
240*25da2beaSAndroid Build Coastguard Worker 		  "S"((ARG4)),	/* %esi */			\
241*25da2beaSAndroid Build Coastguard Worker 		  "D"((ARG5))	/* %edi */			\
242*25da2beaSAndroid Build Coastguard Worker 		: "memory"					\
243*25da2beaSAndroid Build Coastguard Worker 	);							\
244*25da2beaSAndroid Build Coastguard Worker 	eax;							\
245*25da2beaSAndroid Build Coastguard Worker })
246*25da2beaSAndroid Build Coastguard Worker 
247*25da2beaSAndroid Build Coastguard Worker 
248*25da2beaSAndroid Build Coastguard Worker /*
249*25da2beaSAndroid Build Coastguard Worker  * On i386, the 6th argument of syscall goes in %ebp. However, both Clang
250*25da2beaSAndroid Build Coastguard Worker  * and GCC cannot use %ebp in the clobber list and in the "r" constraint
251*25da2beaSAndroid Build Coastguard Worker  * without using -fomit-frame-pointer. To make it always available for
252*25da2beaSAndroid Build Coastguard Worker  * any kind of compilation, the below workaround is implemented:
253*25da2beaSAndroid Build Coastguard Worker  *
254*25da2beaSAndroid Build Coastguard Worker  *  1) Push the 6-th argument.
255*25da2beaSAndroid Build Coastguard Worker  *  2) Push %ebp.
256*25da2beaSAndroid Build Coastguard Worker  *  3) Load the 6-th argument from 4(%esp) to %ebp.
257*25da2beaSAndroid Build Coastguard Worker  *  4) Do the syscall (int $0x80).
258*25da2beaSAndroid Build Coastguard Worker  *  5) Pop %ebp (restore the old value of %ebp).
259*25da2beaSAndroid Build Coastguard Worker  *  6) Add %esp by 4 (undo the stack pointer).
260*25da2beaSAndroid Build Coastguard Worker  *
261*25da2beaSAndroid Build Coastguard Worker  * WARNING:
262*25da2beaSAndroid Build Coastguard Worker  *   Don't use register variables for __do_syscall6(), there is a known
263*25da2beaSAndroid Build Coastguard Worker  *   GCC bug that results in an endless loop.
264*25da2beaSAndroid Build Coastguard Worker  *
265*25da2beaSAndroid Build Coastguard Worker  * BugLink: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105032
266*25da2beaSAndroid Build Coastguard Worker  *
267*25da2beaSAndroid Build Coastguard Worker  */
268*25da2beaSAndroid Build Coastguard Worker #define __do_syscall6(NUM, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) ({	\
269*25da2beaSAndroid Build Coastguard Worker 	intptr_t eax  = (intptr_t)(NUM);				\
270*25da2beaSAndroid Build Coastguard Worker 	intptr_t arg6 = (intptr_t)(ARG6); /* Always in memory */	\
271*25da2beaSAndroid Build Coastguard Worker 	__asm__ volatile (						\
272*25da2beaSAndroid Build Coastguard Worker 		"pushl	%[_arg6]\n\t"					\
273*25da2beaSAndroid Build Coastguard Worker 		"pushl	%%ebp\n\t"					\
274*25da2beaSAndroid Build Coastguard Worker 		"movl	4(%%esp),%%ebp\n\t"				\
275*25da2beaSAndroid Build Coastguard Worker 		"int	$0x80\n\t"					\
276*25da2beaSAndroid Build Coastguard Worker 		"popl	%%ebp\n\t"					\
277*25da2beaSAndroid Build Coastguard Worker 		"addl	$4,%%esp"					\
278*25da2beaSAndroid Build Coastguard Worker 		: "+a"(eax)		/* %eax */			\
279*25da2beaSAndroid Build Coastguard Worker 		: "b"(ARG1),		/* %ebx */			\
280*25da2beaSAndroid Build Coastguard Worker 		  "c"(ARG2),		/* %ecx */			\
281*25da2beaSAndroid Build Coastguard Worker 		  "d"(ARG3),		/* %edx */			\
282*25da2beaSAndroid Build Coastguard Worker 		  "S"(ARG4),		/* %esi */			\
283*25da2beaSAndroid Build Coastguard Worker 		  "D"(ARG5),		/* %edi */			\
284*25da2beaSAndroid Build Coastguard Worker 		  [_arg6]"m"(arg6)	/* memory */			\
285*25da2beaSAndroid Build Coastguard Worker 		: "memory", "cc"					\
286*25da2beaSAndroid Build Coastguard Worker 	);								\
287*25da2beaSAndroid Build Coastguard Worker 	eax;								\
288*25da2beaSAndroid Build Coastguard Worker })
289*25da2beaSAndroid Build Coastguard Worker 
290*25da2beaSAndroid Build Coastguard Worker #include "../syscall-defs.h"
291*25da2beaSAndroid Build Coastguard Worker 
292*25da2beaSAndroid Build Coastguard Worker #else /* #ifdef CONFIG_NOLIBC */
293*25da2beaSAndroid Build Coastguard Worker 
294*25da2beaSAndroid Build Coastguard Worker #include "../generic/syscall.h"
295*25da2beaSAndroid Build Coastguard Worker 
296*25da2beaSAndroid Build Coastguard Worker #endif /* #ifdef CONFIG_NOLIBC */
297*25da2beaSAndroid Build Coastguard Worker 
298*25da2beaSAndroid Build Coastguard Worker #endif /* #if defined(__x86_64__) */
299*25da2beaSAndroid Build Coastguard Worker 
300*25da2beaSAndroid Build Coastguard Worker #endif /* #ifndef LIBURING_ARCH_X86_SYSCALL_H */
301