[libc-commits] [libc] [libc][i386] syscall support (PR #114264)
Nick Desaulniers via libc-commits
libc-commits at lists.llvm.org
Wed Oct 30 09:53:56 PDT 2024
https://github.com/nickdesaulniers created https://github.com/llvm/llvm-project/pull/114264
Link: #93709
>From 93ebdb3d34c8b9eb9ec107dd742f53188db47a04 Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <ndesaulniers at google.com>
Date: Wed, 2 Oct 2024 10:23:57 -0700
Subject: [PATCH] [libc][i386] syscall support
Link: #93709
---
.../src/__support/OSUtil/linux/i386/syscall.h | 76 +++++++++++++++++++
libc/src/__support/OSUtil/linux/syscall.h | 4 +-
2 files changed, 79 insertions(+), 1 deletion(-)
create mode 100644 libc/src/__support/OSUtil/linux/i386/syscall.h
diff --git a/libc/src/__support/OSUtil/linux/i386/syscall.h b/libc/src/__support/OSUtil/linux/i386/syscall.h
new file mode 100644
index 00000000000000..ddc51c543077ed
--- /dev/null
+++ b/libc/src/__support/OSUtil/linux/i386/syscall.h
@@ -0,0 +1,76 @@
+//===---------- 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"
+
+namespace LIBC_NAMESPACE {
+
+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
+
+#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_I386_SYSCALL_H
diff --git a/libc/src/__support/OSUtil/linux/syscall.h b/libc/src/__support/OSUtil/linux/syscall.h
index ad3f6947d0a06a..24e0fca73c1678 100644
--- a/libc/src/__support/OSUtil/linux/syscall.h
+++ b/libc/src/__support/OSUtil/linux/syscall.h
@@ -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"
More information about the libc-commits
mailing list