1 //===---------- inline implementation of x86_64 syscalls ----------* C++ *-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H
10 #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H
12 #include "src/__support/common.h"
14 #define SYSCALL_CLOBBER_LIST "rcx", "r11", "memory"
16 namespace LIBC_NAMESPACE
{
18 LIBC_INLINE
long syscall_impl(long __number
) {
20 LIBC_INLINE_ASM("syscall"
23 : SYSCALL_CLOBBER_LIST
);
27 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
) {
29 LIBC_INLINE_ASM("syscall"
31 : "a"(__number
), "D"(__arg1
)
32 : SYSCALL_CLOBBER_LIST
);
36 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
) {
38 LIBC_INLINE_ASM("syscall"
40 : "a"(__number
), "D"(__arg1
), "S"(__arg2
)
41 : SYSCALL_CLOBBER_LIST
);
45 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
48 LIBC_INLINE_ASM("syscall"
50 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
)
51 : SYSCALL_CLOBBER_LIST
);
55 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
56 long __arg3
, long __arg4
) {
58 register long r10
__asm__("r10") = __arg4
;
59 LIBC_INLINE_ASM("syscall"
61 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
63 : SYSCALL_CLOBBER_LIST
);
67 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
68 long __arg3
, long __arg4
, long __arg5
) {
70 register long r10
__asm__("r10") = __arg4
;
71 register long r8
__asm__("r8") = __arg5
;
72 LIBC_INLINE_ASM("syscall"
74 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
76 : SYSCALL_CLOBBER_LIST
);
80 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
81 long __arg3
, long __arg4
, long __arg5
,
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("syscall"
89 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
90 "r"(r10
), "r"(r8
), "r"(r9
)
91 : SYSCALL_CLOBBER_LIST
);
95 #undef SYSCALL_CLOBBER_LIST
96 } // namespace LIBC_NAMESPACE
98 #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H