[libc-commits] [libc] [libc] Port munmap and mprotect to the new syscall interface (PR #199199)
Pavel Labath via libc-commits
libc-commits at lists.llvm.org
Fri May 22 03:56:02 PDT 2026
https://github.com/labath created https://github.com/llvm/llvm-project/pull/199199
Assisted by Gemini.
>From 5f5028e0706912c142d3f15949ce70cc89c21f27 Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Tue, 19 May 2026 09:11:38 +0000
Subject: [PATCH] [libc] Port munmap and mprotect to the new syscall interface
Assisted by Gemini.
---
libc/src/__support/OSUtil/linux/CMakeLists.txt | 1 +
libc/src/__support/OSUtil/linux/auxv.h | 5 +++--
.../OSUtil/linux/syscall_wrappers/mprotect.h | 8 ++------
.../__support/OSUtil/linux/syscall_wrappers/munmap.h | 7 ++-----
libc/src/__support/threads/linux/CMakeLists.txt | 2 ++
libc/src/__support/threads/linux/thread.cpp | 12 +++++++-----
libc/startup/linux/aarch64/CMakeLists.txt | 1 +
libc/startup/linux/aarch64/tls.cpp | 3 ++-
libc/startup/linux/riscv/CMakeLists.txt | 1 +
libc/startup/linux/riscv/tls.cpp | 3 ++-
libc/startup/linux/x86_64/CMakeLists.txt | 1 +
libc/startup/linux/x86_64/tls.cpp | 3 ++-
12 files changed, 26 insertions(+), 21 deletions(-)
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