diff options
author | Jean-Baptiste Boric <jblbeurope@gmail.com> | 2021-05-14 17:38:33 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-14 22:24:02 +0200 |
commit | eecf7a20972b492d249884c1f725e7ae7cd36c8e (patch) | |
tree | 4fa0fa7ac06a2f277e73f375b43075dc37586af8 /Userland/Libraries/LibC/sys/mman.cpp | |
parent | e16894af5affa556d9198feef864e27d19d504fb (diff) | |
download | serenity-eecf7a20972b492d249884c1f725e7ae7cd36c8e.zip |
LibC: Move mman.h to sys/mman.h
POSIX mandates that it is placed there.
Diffstat (limited to 'Userland/Libraries/LibC/sys/mman.cpp')
-rw-r--r-- | Userland/Libraries/LibC/sys/mman.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Userland/Libraries/LibC/sys/mman.cpp b/Userland/Libraries/LibC/sys/mman.cpp new file mode 100644 index 0000000000..101860fafc --- /dev/null +++ b/Userland/Libraries/LibC/sys/mman.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sys/mman.h> +#include <syscall.h> + +extern "C" { + +void* serenity_mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset, size_t alignment, const char* name) +{ + Syscall::SC_mmap_params params { (uintptr_t)addr, size, alignment, prot, flags, fd, offset, { name, name ? strlen(name) : 0 } }; + ptrdiff_t rc = syscall(SC_mmap, ¶ms); + if (rc < 0 && -rc < EMAXERRNO) { + errno = -rc; + return MAP_FAILED; + } + return (void*)rc; +} + +void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) +{ + return serenity_mmap(addr, size, prot, flags, fd, offset, PAGE_SIZE, nullptr); +} + +void* mmap_with_name(void* addr, size_t size, int prot, int flags, int fd, off_t offset, const char* name) +{ + return serenity_mmap(addr, size, prot, flags, fd, offset, PAGE_SIZE, name); +} + +void* mremap(void* old_address, size_t old_size, size_t new_size, int flags) +{ + Syscall::SC_mremap_params params { (uintptr_t)old_address, old_size, new_size, flags }; + ptrdiff_t rc = syscall(SC_mremap, ¶ms); + if (rc < 0 && -rc < EMAXERRNO) { + errno = -rc; + return MAP_FAILED; + } + return (void*)rc; +} + +int munmap(void* addr, size_t size) +{ + int rc = syscall(SC_munmap, addr, size); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + +int mprotect(void* addr, size_t size, int prot) +{ + int rc = syscall(SC_mprotect, addr, size, prot); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + +int set_mmap_name(void* addr, size_t size, const char* name) +{ + if (!name) { + errno = EFAULT; + return -1; + } + Syscall::SC_set_mmap_name_params params { addr, size, { name, strlen(name) } }; + int rc = syscall(SC_set_mmap_name, ¶ms); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + +int madvise(void* address, size_t size, int advice) +{ + int rc = syscall(SC_madvise, address, size, advice); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + +void* allocate_tls(const char* initial_data, size_t size) +{ + ptrdiff_t rc = syscall(SC_allocate_tls, initial_data, size); + if (rc < 0 && -rc < EMAXERRNO) { + errno = -rc; + return MAP_FAILED; + } + return (void*)rc; +} +} |