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"
13 #include "src/__support/macros/config.h"
15 #define SYSCALL_CLOBBER_LIST "rcx", "r11", "memory"
17 namespace LIBC_NAMESPACE_DECL
{
19 LIBC_INLINE
long syscall_impl(long __number
) {
21 LIBC_INLINE_ASM("syscall"
24 : SYSCALL_CLOBBER_LIST
);
28 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
) {
30 LIBC_INLINE_ASM("syscall"
32 : "a"(__number
), "D"(__arg1
)
33 : SYSCALL_CLOBBER_LIST
);
37 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
) {
39 LIBC_INLINE_ASM("syscall"
41 : "a"(__number
), "D"(__arg1
), "S"(__arg2
)
42 : SYSCALL_CLOBBER_LIST
);
46 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
49 LIBC_INLINE_ASM("syscall"
51 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
)
52 : SYSCALL_CLOBBER_LIST
);
56 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
57 long __arg3
, long __arg4
) {
59 register long r10
__asm__("r10") = __arg4
;
60 LIBC_INLINE_ASM("syscall"
62 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
64 : SYSCALL_CLOBBER_LIST
);
68 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
69 long __arg3
, long __arg4
, long __arg5
) {
71 register long r10
__asm__("r10") = __arg4
;
72 register long r8
__asm__("r8") = __arg5
;
73 LIBC_INLINE_ASM("syscall"
75 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
77 : SYSCALL_CLOBBER_LIST
);
81 LIBC_INLINE
long syscall_impl(long __number
, long __arg1
, long __arg2
,
82 long __arg3
, long __arg4
, long __arg5
,
85 register long r10
__asm__("r10") = __arg4
;
86 register long r8
__asm__("r8") = __arg5
;
87 register long r9
__asm__("r9") = __arg6
;
88 LIBC_INLINE_ASM("syscall"
90 : "a"(__number
), "D"(__arg1
), "S"(__arg2
), "d"(__arg3
),
91 "r"(r10
), "r"(r8
), "r"(r9
)
92 : SYSCALL_CLOBBER_LIST
);
96 #undef SYSCALL_CLOBBER_LIST
97 } // namespace LIBC_NAMESPACE_DECL
99 #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_X86_64_SYSCALL_H