github.com/afumu/libc@v0.0.6/musl/arch/i386/syscall_arch.h (about)

     1  #define __SYSCALL_LL_E(x) \
     2  ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
     3  ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
     4  #define __SYSCALL_LL_O(x) __SYSCALL_LL_E((x))
     5  
     6  #if SYSCALL_NO_TLS
     7  #define SYSCALL_INSNS "int $128"
     8  #else
     9  #define SYSCALL_INSNS "call *%%gs:16"
    10  #endif
    11  
    12  #define SYSCALL_INSNS_12 "xchg %%ebx,%%edx ; " SYSCALL_INSNS " ; xchg %%ebx,%%edx"
    13  #define SYSCALL_INSNS_34 "xchg %%ebx,%%edi ; " SYSCALL_INSNS " ; xchg %%ebx,%%edi"
    14  
    15  inline long __syscall0(long n)
    16  {
    17  	unsigned long __ret;
    18  	__asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n) : "memory");
    19  	return __ret;
    20  }
    21  
    22  inline long __syscall1(long n, long a1)
    23  {
    24  	unsigned long __ret;
    25  	__asm__ __volatile__ (SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1) : "memory");
    26  	return __ret;
    27  }
    28  
    29  inline long __syscall2(long n, long a1, long a2)
    30  {
    31  	unsigned long __ret;
    32  	__asm__ __volatile__ (SYSCALL_INSNS_12 : "=a"(__ret) : "a"(n), "d"(a1), "c"(a2) : "memory");
    33  	return __ret;
    34  }
    35  
    36  inline long __syscall3(long n, long a1, long a2, long a3)
    37  {
    38  	unsigned long __ret;
    39  #if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
    40  	__asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3) : "memory");
    41  #else
    42  	__asm__ __volatile__ (SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3) : "memory");
    43  #endif
    44  	return __ret;
    45  }
    46  
    47  inline long __syscall4(long n, long a1, long a2, long a3, long a4)
    48  {
    49  	unsigned long __ret;
    50  #if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
    51  	__asm__ __volatile__ (SYSCALL_INSNS : "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
    52  #else
    53  	__asm__ __volatile__ (SYSCALL_INSNS_34 : "=a"(__ret) : "a"(n), "D"(a1), "c"(a2), "d"(a3), "S"(a4) : "memory");
    54  #endif
    55  	return __ret;
    56  }
    57  
    58  inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5)
    59  {
    60  	unsigned long __ret;
    61  #if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
    62  	__asm__ __volatile__ (SYSCALL_INSNS
    63  		: "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
    64  #else
    65  	__asm__ __volatile__ ("pushl %2 ; push %%ebx ; mov 4(%%esp),%%ebx ; " SYSCALL_INSNS " ; pop %%ebx ; add $4,%%esp"
    66  		: "=a"(__ret) : "a"(n), "g"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
    67  #endif
    68  	return __ret;
    69  }
    70  
    71  inline long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6)
    72  {
    73  	unsigned long __ret;
    74  #if !defined(__PIC__) || !defined(BROKEN_EBX_ASM)
    75  	__asm__ __volatile__ ("pushl %7 ; push %%ebp ; mov 4(%%esp),%%ebp ; " SYSCALL_INSNS " ; pop %%ebp ; add $4,%%esp"
    76  		: "=a"(__ret) : "a"(n), "b"(a1), "c"(a2), "d"(a3), "S"(a4), "D"(a5), "g"(a6) : "memory");
    77  #else
    78  	unsigned long a1a6[2] = { a1, a6 };
    79  	__asm__ __volatile__ ("pushl %1 ; push %%ebx ; push %%ebp ; mov 8(%%esp),%%ebx ; mov 4(%%ebx),%%ebp ; mov (%%ebx),%%ebx ; " SYSCALL_INSNS " ; pop %%ebp ; pop %%ebx ; add $4,%%esp"
    80  		: "=a"(__ret) : "g"(&a1a6), "a"(n), "c"(a2), "d"(a3), "S"(a4), "D"(a5) : "memory");
    81  #endif
    82  	return __ret;
    83  }
    84  
    85  #define VDSO_USEFUL
    86  #define VDSO_CGT32_SYM "__vdso_clock_gettime"
    87  #define VDSO_CGT32_VER "LINUX_2.6"
    88  #define VDSO_CGT_SYM "__vdso_clock_gettime64"
    89  #define VDSO_CGT_VER "LINUX_2.6"
    90  
    91  #define SYSCALL_USE_SOCKETCALL