13cc2161cSSiva Chandra Reddy //===----------------------- Linux syscalls ---------------------*- C++ -*-===// 23cc2161cSSiva Chandra Reddy // 33cc2161cSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cc2161cSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 53cc2161cSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cc2161cSSiva Chandra Reddy // 73cc2161cSSiva Chandra Reddy //===----------------------------------------------------------------------===// 83cc2161cSSiva Chandra Reddy 9270547f3SGuillaume Chatelet #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H 10270547f3SGuillaume Chatelet #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H 113cc2161cSSiva Chandra Reddy 12f0a3954eSMichael Jones #include "src/__support/CPP/bit.h" 13494734b0SSiva Chandra Reddy #include "src/__support/common.h" 145ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 15f100ec25SGuillaume Chatelet #include "src/__support/macros/properties/architectures.h" 163cc2161cSSiva Chandra Reddy 17*8413599bSNick Desaulniers #ifdef LIBC_TARGET_ARCH_IS_X86_32 18*8413599bSNick Desaulniers #include "i386/syscall.h" 19*8413599bSNick Desaulniers #elif defined(LIBC_TARGET_ARCH_IS_X86_64) 203cc2161cSSiva Chandra Reddy #include "x86_64/syscall.h" 21a2569a76SGuillaume Chatelet #elif defined(LIBC_TARGET_ARCH_IS_AARCH64) 22371779faSSiva Chandra #include "aarch64/syscall.h" 23a2569a76SGuillaume Chatelet #elif defined(LIBC_TARGET_ARCH_IS_ARM) 244c810ecbSSiva Chandra Reddy #include "arm/syscall.h" 25e3087c4bSMikhail R. Gadelha #elif defined(LIBC_TARGET_ARCH_IS_ANY_RISCV) 26e3087c4bSMikhail R. Gadelha #include "riscv/syscall.h" 273cc2161cSSiva Chandra Reddy #endif 283cc2161cSSiva Chandra Reddy 295ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 30371779faSSiva Chandra 31f0a3954eSMichael Jones template <typename R, typename... Ts> 32f0a3954eSMichael Jones LIBC_INLINE R syscall_impl(long __number, Ts... ts) { 33371779faSSiva Chandra static_assert(sizeof...(Ts) <= 6, "Too many arguments for syscall"); 34f0a3954eSMichael Jones return cpp::bit_or_static_cast<R>(syscall_impl(__number, (long)ts...)); 35371779faSSiva Chandra } 36371779faSSiva Chandra 375ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 38371779faSSiva Chandra 39270547f3SGuillaume Chatelet #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_SYSCALL_H 40