944ac99e51a875db113e8c9c9a2c6f5a9459c54f
[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 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 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 inline long syscall(long __number, long __arg1, long __arg2) {
36   long retcode;
37   LIBC_INLINE_ASM("syscall" :
38              "=a"(retcode) :
39              "a"(__number), "D"(__arg1), "S"(__arg2) :
40              SYSCALL_CLOBBER_LIST);
41   return retcode;
42 }
43
44 inline long syscall(long __number, long __arg1, long __arg2, long __arg3) {
45   long retcode;
46   LIBC_INLINE_ASM("syscall" :
47              "=a"(retcode) :
48              "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3) :
49              SYSCALL_CLOBBER_LIST);
50   return retcode;
51 }
52
53 inline long syscall(
54     long __number, long __arg1, long __arg2, long __arg3, long __arg4) {
55   long retcode;
56   register long r10 __asm__("r10") = __arg4;
57   LIBC_INLINE_ASM("syscall" :
58              "=a"(retcode) :
59              "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10) :
60              SYSCALL_CLOBBER_LIST);
61   return retcode;
62 }
63
64 inline long syscall(long __number, long __arg1, long __arg2, long __arg3,
65                     long __arg4, long __arg5) {
66   long retcode;
67   register long r10 __asm__("r10") = __arg4;
68   register long r8 __asm__("r8") = __arg5;
69   LIBC_INLINE_ASM(
70       "syscall" :
71       "=a"(retcode) :
72       "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10), "r"(r8) :
73       SYSCALL_CLOBBER_LIST);
74   return retcode;
75 }
76
77 inline long syscall(long __number, long __arg1, long __arg2, long __arg3,
78                     long __arg4, long __arg5, long __arg6) {
79   long retcode;
80   register long r10 __asm__("r10") = __arg4;
81   register long r8 __asm__("r8") = __arg5;
82   register long r9 __asm__("r9") = __arg6;
83   LIBC_INLINE_ASM(
84       "syscall" :
85       "=a"(retcode) :
86       "a"(__number), "D"(__arg1), "S"(__arg2), "d"(__arg3), "r"(r10), "r"(r8), "r"(r9) :
87       SYSCALL_CLOBBER_LIST);
88   return retcode;
89 }
90
91 #undef SYSCALL_CLOBBER_LIST
92
93 } // namespace __llvm_libc