brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 88d7f2f Raw
89 lines · c
1//===---------- inline implementation of i386 syscalls ------------* C++ *-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H10#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H11 12#include "src/__support/common.h"13#include "src/__support/macros/config.h"14 15namespace LIBC_NAMESPACE_DECL {16 17LIBC_INLINE long syscall_impl(long num) {18  long ret;19  LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num) : "memory");20  return ret;21}22 23LIBC_INLINE long syscall_impl(long num, long arg1) {24  long ret;25  LIBC_INLINE_ASM("int $128" : "=a"(ret) : "a"(num), "b"(arg1) : "memory");26  return ret;27}28 29LIBC_INLINE long syscall_impl(long num, long arg1, long arg2) {30  long ret;31  LIBC_INLINE_ASM("int $128"32                  : "=a"(ret)33                  : "a"(num), "b"(arg1), "c"(arg2)34                  : "memory");35  return ret;36}37 38LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3) {39  long ret;40  LIBC_INLINE_ASM("int $128"41                  : "=a"(ret)42                  : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3)43                  : "memory");44  return ret;45}46 47LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3,48                              long arg4) {49  long ret;50  LIBC_INLINE_ASM("int $128"51                  : "=a"(ret)52                  : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4)53                  : "memory");54  return ret;55}56 57LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3,58                              long arg4, long arg5) {59  long ret;60  LIBC_INLINE_ASM("int $128"61                  : "=a"(ret)62                  : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4),63                    "D"(arg5)64                  : "memory");65  return ret;66}67 68LIBC_INLINE long syscall_impl(long num, long arg1, long arg2, long arg3,69                              long arg4, long arg5, long arg6) {70  long ret;71  LIBC_INLINE_ASM(R"(72    push %[arg6]73    push %%ebp74    mov 4(%%esp), %%ebp75    int $12876    pop %%ebp77    add $4, %%esp78  )"79                  : "=a"(ret)80                  : "a"(num), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4),81                    "D"(arg5), [arg6] "m"(arg6)82                  : "memory");83  return ret;84}85 86} // namespace LIBC_NAMESPACE_DECL87 88#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H89