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