Skip to content

Commit

Permalink
[libc][i386] syscall support (llvm#114264)
Browse files Browse the repository at this point in the history
  • Loading branch information
nickdesaulniers authored and smallp-o-p committed Nov 3, 2024
1 parent f0e03e6 commit ff1c8a6
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 1 deletion.
88 changes: 88 additions & 0 deletions libc/src/__support/OSUtil/linux/i386/syscall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
//===---------- 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
4 changes: 3 additions & 1 deletion libc/src/__support/OSUtil/linux/syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
#include "src/__support/macros/config.h"
#include "src/__support/macros/properties/architectures.h"

#ifdef LIBC_TARGET_ARCH_IS_X86_64
#ifdef LIBC_TARGET_ARCH_IS_X86_32
#include "i386/syscall.h"
#elif defined(LIBC_TARGET_ARCH_IS_X86_64)
#include "x86_64/syscall.h"
#elif defined(LIBC_TARGET_ARCH_IS_AARCH64)
#include "aarch64/syscall.h"
Expand Down

0 comments on commit ff1c8a6

Please sign in to comment.