From 5a6cc509215b62e94de3b798ea26944a375ce6cb Mon Sep 17 00:00:00 2001 From: Jingyu Qiu <51221277+SoftJing1@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:25:50 -0500 Subject: [libc] add mremap (#112804) --- libc/src/sys/mman/CMakeLists.txt | 7 ++++++ libc/src/sys/mman/linux/CMakeLists.txt | 13 ++++++++++ libc/src/sys/mman/linux/mremap.cpp | 45 ++++++++++++++++++++++++++++++++++ libc/src/sys/mman/mremap.h | 22 +++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 libc/src/sys/mman/linux/mremap.cpp create mode 100644 libc/src/sys/mman/mremap.h (limited to 'libc/src/sys') diff --git a/libc/src/sys/mman/CMakeLists.txt b/libc/src/sys/mman/CMakeLists.txt index 4ea43e14be02..4d4c2ad37605 100644 --- a/libc/src/sys/mman/CMakeLists.txt +++ b/libc/src/sys/mman/CMakeLists.txt @@ -106,3 +106,10 @@ add_entrypoint_object( DEPENDS .${LIBC_TARGET_OS}.shm_unlink ) + +add_entrypoint_object( + mremap + ALIAS + DEPENDS + .${LIBC_TARGET_OS}.mremap +) diff --git a/libc/src/sys/mman/linux/CMakeLists.txt b/libc/src/sys/mman/linux/CMakeLists.txt index 47c16f79bc8d..89a0ad1527a0 100644 --- a/libc/src/sys/mman/linux/CMakeLists.txt +++ b/libc/src/sys/mman/linux/CMakeLists.txt @@ -24,6 +24,19 @@ add_entrypoint_object( libc.src.errno.errno ) +add_entrypoint_object( + mremap + SRCS + mremap.cpp + HDRS + ../mremap.h + DEPENDS + libc.include.sys_mman + libc.include.sys_syscall + libc.src.__support.OSUtil.osutil + libc.src.errno.errno +) + add_entrypoint_object( munmap SRCS diff --git a/libc/src/sys/mman/linux/mremap.cpp b/libc/src/sys/mman/linux/mremap.cpp new file mode 100644 index 000000000000..38bcfce833d3 --- /dev/null +++ b/libc/src/sys/mman/linux/mremap.cpp @@ -0,0 +1,45 @@ +//===---------- Linux implementation of the POSIX mremap function----------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "src/sys/mman/mremap.h" + +#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/common.h" + +#include "src/__support/macros/config.h" +#include "src/errno/libc_errno.h" +#include // For EXEC_PAGESIZE. +#include +#include // For syscall numbers. + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(void *, mremap, + (void *old_address, size_t old_size, size_t new_size, + int flags, ... /* void *new_address */)) { + + long ret = 0; + void *new_address = nullptr; + if (flags & MREMAP_FIXED) { + va_list varargs; + va_start(varargs, flags); + new_address = va_arg(varargs, void *); + va_end(varargs); + } + ret = LIBC_NAMESPACE::syscall_impl(SYS_mremap, old_address, old_size, + new_size, flags, new_address); + + if (ret < 0 && ret > -EXEC_PAGESIZE) { + libc_errno = static_cast(-ret); + return MAP_FAILED; + } + + return reinterpret_cast(ret); +} + +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/sys/mman/mremap.h b/libc/src/sys/mman/mremap.h new file mode 100644 index 000000000000..208946bc58a2 --- /dev/null +++ b/libc/src/sys/mman/mremap.h @@ -0,0 +1,22 @@ +//===-- Implementation header for mremap function -------------------------===// +// +// 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_SYS_MMAN_MREMAP_H +#define LLVM_LIBC_SRC_SYS_MMAN_MREMAP_H + +#include "src/__support/macros/config.h" +#include // For size_t and off_t + +namespace LIBC_NAMESPACE_DECL { + +void *mremap(void *old_address, size_t old_size, size_t new_size, int flags, + ... /* void *new_address */); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_SYS_MMAN_MREMAP_H -- cgit v1.2.3