[libc-commits] [libc] [libc][i386] syscall support (PR #114264)

via libc-commits libc-commits at lists.llvm.org
Wed Oct 30 09:54:34 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Nick Desaulniers (nickdesaulniers)

<details>
<summary>Changes</summary>

Link: #<!-- -->93709


---
Full diff: https://github.com/llvm/llvm-project/pull/114264.diff


2 Files Affected:

- (added) libc/src/__support/OSUtil/linux/i386/syscall.h (+76) 
- (modified) libc/src/__support/OSUtil/linux/syscall.h (+3-1) 


``````````diff
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"

``````````

</details>


https://github.com/llvm/llvm-project/pull/114264


More information about the libc-commits mailing list