[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