summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibC/sys/mman.cpp
diff options
context:
space:
mode:
authorJean-Baptiste Boric <jblbeurope@gmail.com>2021-05-14 17:38:33 +0200
committerAndreas Kling <kling@serenityos.org>2021-05-14 22:24:02 +0200
commiteecf7a20972b492d249884c1f725e7ae7cd36c8e (patch)
tree4fa0fa7ac06a2f277e73f375b43075dc37586af8 /Userland/Libraries/LibC/sys/mman.cpp
parente16894af5affa556d9198feef864e27d19d504fb (diff)
downloadserenity-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.cpp85
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, &params);
+ 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, &params);
+ 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, &params);
+ __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;
+}
+}