33f211ca19997c72c84d8b1940cabaed7af7328a
[lldb.git] / libc / config / linux / x86_64 / syscall.h.inc
1 //===------------ inline implementation of x86_64 syscalls ----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 %%begin()
10
11 #include "src/__support/common.h"
12
13 #define SYSCALL_CLOBBER_LIST "rcx", "r11", "memory"
14
15 namespace __llvm_libc {
16
17 __attribute__((always_inline)) inline long syscall(long __number) {
18   long retcode;
19   LIBC_INLINE_ASM("syscall" :
20              "=a"(retcode) :
21              "a"(__number) :
22              SYSCALL_CLOBBER_LIST);
23   return retcode;
24 }
25
26 __attribute__((always_inline)) inline long syscall(long __number, long __arg1) {
27   long retcode;
28   LIBC_INLINE_ASM("syscall" :
29              "=a"(retcode) :
30              "a"(__number), "D"(__arg1) :
31              SYSCALL_CLOBBER_LIST);
32   return retcode;
33 }
34
35 __attribute__((always_inline)) inline long syscall(
36     long __number, long __arg1, long __arg2) {
37   long retcode;
38   LIBC_INLINE_ASM("syscall" :
39              "=a"(retcode) :
40              "a"(__number), "D"(__arg1), "S"(__arg2) :
41              SYSCALL_CLOBBER_LIST);
42   return retcode;
43 }
44
45 __attribute__((always_inline)) inline long syscall(
46     long __number, long __arg1, long __arg2, long __arg3) {
47   long retcode;
48   LIBC_INLINE_ASM("syscall" :
49              "=a"(retcode) :
50              "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3) :
51              SYSCALL_CLOBBER_LIST);
52   return retcode;
53 }
54
55 __attribute__((always_inline)) inline long syscall(
56     long __number, long __arg1, long __arg2, long __arg3, long __arg4) {
57   long retcode;
58   register long r10 __asm__("r10") = __arg4;
59   LIBC_INLINE_ASM("syscall" :
60              "=a"(retcode) :
61              "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10) :
62              SYSCALL_CLOBBER_LIST);
63   return retcode;
64 }
65
66 __attribute__((always_inline)) inline long syscall(
67     long __number, long __arg1, long __arg2, long __arg3, long __arg4,
68     long __arg5) {
69   long retcode;
70   register long r10 __asm__("r10") = __arg4;
71   register long r8 __asm__("r8") = __arg5;
72   LIBC_INLINE_ASM(
73       "syscall" :
74       "=a"(retcode) :
75       "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10), "r"(r8) :
76       SYSCALL_CLOBBER_LIST);
77   return retcode;
78 }
79
80 __attribute__((always_inline)) inline long syscall(
81     long __number, long __arg1, long __arg2, long __arg3, long __arg4,
82     long __arg5, long __arg6) {
83   long retcode;
84   register long r10 __asm__("r10") = __arg4;
85   register long r8 __asm__("r8") = __arg5;
86   register long r9 __asm__("r9") = __arg6;
87   LIBC_INLINE_ASM(
88       "syscall" :
89       "=a"(retcode) :
90       "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10), "r"(r8), "r"(r9) :
91       SYSCALL_CLOBBER_LIST);
92   return retcode;
93 }
94
95 #undef SYSCALL_CLOBBER_LIST
96
97 } // namespace __llvm_libc