//===---------- inline implementation of i386 syscalls ------------* C++ *-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H #include "src/__support/common.h" #include "src/__support/macros/config.h" namespace LIBC_NAMESPACE_DECL { LIBC_INLINE long syscall_impl(long num) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1, long arg2) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1), "c"(arg2) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, long arg4) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, long arg4, long arg5) { long ret; LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4), "D"(arg5) : "memory"); return ret; } LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3, long arg4, long arg5, long arg6) { long ret; LIBC_INLINE_ASM(R"( push %[arg6] push %%ebp mov 4(%%esp), %%ebp int $128 pop %%ebp add $4, %%esp )" : "=a"(ret) : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4), "D"(arg5), [arg6] "m"(arg6) : "memory"); return ret; } } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H