[libc-commits] [libc] af92edf - [libc] Port munmap and mprotect to the new syscall interface (#199199)

via libc-commits libc-commits at lists.llvm.org
Mon May 25 04:07:10 PDT 2026


Author: Pavel Labath
Date: 2026-05-25T13:07:05+02:00
New Revision: af92edf8b3aa4104992de9fe08ce2170d14bc28d

URL: https://github.com/llvm/llvm-project/commit/af92edf8b3aa4104992de9fe08ce2170d14bc28d
DIFF: https://github.com/llvm/llvm-project/commit/af92edf8b3aa4104992de9fe08ce2170d14bc28d.diff

LOG: [libc] Port munmap and mprotect to the new syscall interface (#199199)

Assisted by Gemini.

Added: 
    

Modified: 
    libc/src/__support/OSUtil/linux/CMakeLists.txt
    libc/src/__support/OSUtil/linux/auxv.h
    libc/src/__support/OSUtil/linux/syscall_wrappers/mprotect.h
    libc/src/__support/OSUtil/linux/syscall_wrappers/munmap.h
    libc/src/__support/threads/linux/CMakeLists.txt
    libc/src/__support/threads/linux/thread.cpp
    libc/startup/linux/aarch64/CMakeLists.txt
    libc/startup/linux/aarch64/tls.cpp
    libc/startup/linux/riscv/CMakeLists.txt
    libc/startup/linux/riscv/tls.cpp
    libc/startup/linux/x86_64/CMakeLists.txt
    libc/startup/linux/x86_64/tls.cpp

Removed: 
    


################################################################################
diff  --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt
index 5d42bc67912fb..3350fb298a7fd 100644
--- a/libc/src/__support/OSUtil/linux/CMakeLists.txt
+++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt
@@ -35,6 +35,7 @@ add_header_library(
     libc.hdr.sys_auxv_macros
     libc.hdr.sys_mman_macros
     libc.src.__support.OSUtil.linux.syscall_wrappers.mmap
+    libc.src.__support.OSUtil.linux.syscall_wrappers.munmap
     libc.src.__support.OSUtil.osutil
     libc.src.__support.common
     libc.src.__support.CPP.optional

diff  --git a/libc/src/__support/OSUtil/linux/auxv.h b/libc/src/__support/OSUtil/linux/auxv.h
index a14f0ad731b05..972ad78276f21 100644
--- a/libc/src/__support/OSUtil/linux/auxv.h
+++ b/libc/src/__support/OSUtil/linux/auxv.h
@@ -13,6 +13,7 @@
 #include "hdr/sys_auxv_macros.h" // For AT_ macros
 #include "hdr/sys_mman_macros.h" // For mmap flags
 #include "src/__support/OSUtil/linux/syscall_wrappers/mmap.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/munmap.h"
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/common.h"
 #include "src/__support/threads/callonce.h"
@@ -118,7 +119,7 @@ LIBC_INLINE void Vector::fallback_initialize_unsync() {
   int fd = syscall_impl<int>(SYS_open, "/proc/self/auxv", O_RDONLY | O_CLOEXEC);
 #endif
   if (fd < 0) {
-    syscall_impl<long>(SYS_munmap, vector, AUXV_MMAP_SIZE);
+    linux_syscalls::munmap(vector, AUXV_MMAP_SIZE);
     return;
   }
   uint8_t *cursor = reinterpret_cast<uint8_t *>(vector);
@@ -136,7 +137,7 @@ LIBC_INLINE void Vector::fallback_initialize_unsync() {
   }
   syscall_impl<long>(SYS_close, fd);
   if (has_error) {
-    syscall_impl<long>(SYS_munmap, vector, AUXV_MMAP_SIZE);
+    linux_syscalls::munmap(vector, AUXV_MMAP_SIZE);
     return;
   }
   entries = vector;

diff  --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/mprotect.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/mprotect.h
index a85032ddcc547..2534efc38104c 100644
--- a/libc/src/__support/OSUtil/linux/syscall_wrappers/mprotect.h
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/mprotect.h
@@ -9,7 +9,7 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_MPROTECT_H
 #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_MPROTECT_H
 
-#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl
+#include "src/__support/OSUtil/linux/syscall.h" // For syscall_checked
 #include "src/__support/common.h"
 #include "src/__support/error_or.h"
 #include "src/__support/macros/config.h"
@@ -19,11 +19,7 @@ namespace LIBC_NAMESPACE_DECL {
 namespace linux_syscalls {
 
 LIBC_INLINE ErrorOr<int> mprotect(void *addr, size_t size, int prot) {
-  int ret =
-      syscall_impl<int>(SYS_mprotect, reinterpret_cast<long>(addr), size, prot);
-  if (ret < 0)
-    return Error(-ret);
-  return ret;
+  return syscall_checked<int>(SYS_mprotect, addr, size, prot);
 }
 
 } // namespace linux_syscalls

diff  --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/munmap.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/munmap.h
index 1cd35e54f450f..dca6f3cc75a0a 100644
--- a/libc/src/__support/OSUtil/linux/syscall_wrappers/munmap.h
+++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/munmap.h
@@ -9,7 +9,7 @@
 #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_MUNMAP_H
 #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_MUNMAP_H
 
-#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl
+#include "src/__support/OSUtil/linux/syscall.h" // For syscall_checked
 #include "src/__support/common.h"
 #include "src/__support/error_or.h"
 #include "src/__support/macros/config.h"
@@ -19,10 +19,7 @@ namespace LIBC_NAMESPACE_DECL {
 namespace linux_syscalls {
 
 LIBC_INLINE ErrorOr<int> munmap(void *addr, size_t size) {
-  int ret = syscall_impl<int>(SYS_munmap, reinterpret_cast<long>(addr), size);
-  if (ret < 0)
-    return Error(-ret);
-  return ret;
+  return syscall_checked<int>(SYS_munmap, addr, size);
 }
 
 } // namespace linux_syscalls

diff  --git a/libc/src/__support/threads/linux/CMakeLists.txt b/libc/src/__support/threads/linux/CMakeLists.txt
index 8ce19634c41b1..ad898d5c79514 100644
--- a/libc/src/__support/threads/linux/CMakeLists.txt
+++ b/libc/src/__support/threads/linux/CMakeLists.txt
@@ -42,6 +42,8 @@ add_object_library(
     libc.src.__support.common
     libc.src.__support.error_or
     libc.src.__support.OSUtil.linux.syscall_wrappers.mmap
+    libc.src.__support.OSUtil.linux.syscall_wrappers.mprotect
+    libc.src.__support.OSUtil.linux.syscall_wrappers.munmap
     libc.src.__support.threads.thread_common
   COMPILE_OPTIONS
     ${libc_opt_high_flag}

diff  --git a/libc/src/__support/threads/linux/thread.cpp b/libc/src/__support/threads/linux/thread.cpp
index 2c9744ba66338..28b5fa0fd4dab 100644
--- a/libc/src/__support/threads/linux/thread.cpp
+++ b/libc/src/__support/threads/linux/thread.cpp
@@ -12,6 +12,8 @@
 #include "src/__support/CPP/string_view.h"
 #include "src/__support/CPP/stringstream.h"
 #include "src/__support/OSUtil/linux/syscall_wrappers/mmap.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/mprotect.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/munmap.h"
 #include "src/__support/OSUtil/syscall.h" // For syscall functions.
 #include "src/__support/common.h"
 #include "src/__support/error_or.h"
@@ -100,11 +102,11 @@ LIBC_INLINE ErrorOr<void *> alloc_stack(size_t stacksize, size_t guardsize) {
   if (guardsize) {
     // Give read/write permissions to actual stack.
     // TODO: We are assuming stack growsdown here.
-    long result = LIBC_NAMESPACE::syscall_impl<long>(
-        SYS_mprotect, stack, stacksize, PROT_READ | PROT_WRITE);
+    auto result =
+        linux_syscalls::mprotect(stack, stacksize, PROT_READ | PROT_WRITE);
 
-    if (result != 0)
-      return Error{int(-result)};
+    if (!result)
+      return Error{result.error()};
   }
   return stack;
 }
@@ -117,7 +119,7 @@ free_stack(void *stack, size_t stacksize, size_t guardsize) {
   uintptr_t stackaddr = reinterpret_cast<uintptr_t>(stack);
   stackaddr -= guardsize;
   stack = reinterpret_cast<void *>(stackaddr);
-  LIBC_NAMESPACE::syscall_impl<long>(SYS_munmap, stack, stacksize + guardsize);
+  linux_syscalls::munmap(stack, stacksize + guardsize);
 }
 
 struct Thread;

diff  --git a/libc/startup/linux/aarch64/CMakeLists.txt b/libc/startup/linux/aarch64/CMakeLists.txt
index ddf60c5ec8e71..a776bce714139 100644
--- a/libc/startup/linux/aarch64/CMakeLists.txt
+++ b/libc/startup/linux/aarch64/CMakeLists.txt
@@ -7,6 +7,7 @@ add_startup_object(
     libc.hdr.sys_mman_macros
     libc.include.sys_syscall
     libc.src.__support.OSUtil.linux.syscall_wrappers.mmap
+    libc.src.__support.OSUtil.linux.syscall_wrappers.munmap
     libc.src.__support.OSUtil.osutil
     libc.src.string.memory_utils.inline_memcpy
   COMPILE_OPTIONS

diff  --git a/libc/startup/linux/aarch64/tls.cpp b/libc/startup/linux/aarch64/tls.cpp
index 645936c8e4c94..b925df16b8c60 100644
--- a/libc/startup/linux/aarch64/tls.cpp
+++ b/libc/startup/linux/aarch64/tls.cpp
@@ -8,6 +8,7 @@
 
 #include "hdr/sys_mman_macros.h"
 #include "src/__support/OSUtil/linux/syscall_wrappers/mmap.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/munmap.h"
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/macros/config.h"
 #include "src/__support/threads/thread.h"
@@ -65,7 +66,7 @@ void init_tls(TLSDescriptor &tls_descriptor) {
 void cleanup_tls(uintptr_t addr, uintptr_t size) {
   if (size == 0)
     return;
-  syscall_impl<long>(SYS_munmap, addr, size);
+  linux_syscalls::munmap(reinterpret_cast<void *>(addr), size);
 }
 
 bool set_thread_ptr(uintptr_t val) {

diff  --git a/libc/startup/linux/riscv/CMakeLists.txt b/libc/startup/linux/riscv/CMakeLists.txt
index fa47f97bb9370..4a2e0ab80342e 100644
--- a/libc/startup/linux/riscv/CMakeLists.txt
+++ b/libc/startup/linux/riscv/CMakeLists.txt
@@ -7,6 +7,7 @@ add_startup_object(
     libc.hdr.sys_mman_macros
     libc.include.sys_syscall
     libc.src.__support.OSUtil.linux.syscall_wrappers.mmap
+    libc.src.__support.OSUtil.linux.syscall_wrappers.munmap
     libc.src.__support.OSUtil.osutil
     libc.src.string.memory_utils.inline_memcpy
   COMPILE_OPTIONS

diff  --git a/libc/startup/linux/riscv/tls.cpp b/libc/startup/linux/riscv/tls.cpp
index f9d0315668aa2..4081692cfa30e 100644
--- a/libc/startup/linux/riscv/tls.cpp
+++ b/libc/startup/linux/riscv/tls.cpp
@@ -8,6 +8,7 @@
 
 #include "hdr/sys_mman_macros.h"
 #include "src/__support/OSUtil/linux/syscall_wrappers/mmap.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/munmap.h"
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/macros/config.h"
 #include "src/__support/threads/thread.h"
@@ -52,7 +53,7 @@ void init_tls(TLSDescriptor &tls_descriptor) {
 void cleanup_tls(uintptr_t addr, uintptr_t size) {
   if (size == 0)
     return;
-  syscall_impl<long>(SYS_munmap, addr, size);
+  linux_syscalls::munmap(reinterpret_cast<void *>(addr), size);
 }
 
 bool set_thread_ptr(uintptr_t val) {

diff  --git a/libc/startup/linux/x86_64/CMakeLists.txt b/libc/startup/linux/x86_64/CMakeLists.txt
index d6459a657def8..12dc0eeef42e9 100644
--- a/libc/startup/linux/x86_64/CMakeLists.txt
+++ b/libc/startup/linux/x86_64/CMakeLists.txt
@@ -8,6 +8,7 @@ add_startup_object(
     libc.include.sys_syscall
     libc.src.__support.OSUtil.osutil
     libc.src.__support.OSUtil.linux.syscall_wrappers.mmap
+    libc.src.__support.OSUtil.linux.syscall_wrappers.munmap
     libc.src.string.memory_utils.inline_memcpy
   COMPILE_OPTIONS
     -fno-stack-protector

diff  --git a/libc/startup/linux/x86_64/tls.cpp b/libc/startup/linux/x86_64/tls.cpp
index 6d2f318e6f699..7856bdd14daae 100644
--- a/libc/startup/linux/x86_64/tls.cpp
+++ b/libc/startup/linux/x86_64/tls.cpp
@@ -8,6 +8,7 @@
 
 #include "hdr/sys_mman_macros.h"
 #include "src/__support/OSUtil/linux/syscall_wrappers/mmap.h"
+#include "src/__support/OSUtil/linux/syscall_wrappers/munmap.h"
 #include "src/__support/macros/config.h"
 #include "src/string/memory_utils/inline_memcpy.h"
 #include "startup/linux/do_start.h"
@@ -71,7 +72,7 @@ void init_tls(TLSDescriptor &tls_descriptor) {
 void cleanup_tls(uintptr_t addr, uintptr_t size) {
   if (size == 0)
     return;
-  syscall_impl<long>(SYS_munmap, addr, size);
+  linux_syscalls::munmap(reinterpret_cast<void *>(addr), size);
 }
 
 // Sets the thread pointer to |val|. Returns true on success, false on failure.


        


More information about the libc-commits mailing list