Serenity Operating System
at hosted 99 lines 3.3 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <Kernel/Syscall.h> 28#include <errno.h> 29#include <sys/mman.h> 30#include <stdio.h> 31#include <string.h> 32 33extern "C" { 34 35#ifdef __serenity__ 36void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) 37{ 38 return mmap_with_name(addr, size, prot, flags, fd, offset, nullptr); 39} 40 41int munmap(void* addr, size_t size) 42{ 43 int rc = syscall(SC_munmap, addr, size); 44 __RETURN_WITH_ERRNO(rc, rc, -1); 45} 46 47int mprotect(void* addr, size_t size, int prot) 48{ 49 int rc = syscall(SC_mprotect, addr, size, prot); 50 __RETURN_WITH_ERRNO(rc, rc, -1); 51} 52 53int madvise(void* address, size_t size, int advice) 54{ 55 int rc = syscall(SC_madvise, address, size, advice); 56 __RETURN_WITH_ERRNO(rc, rc, -1); 57} 58#endif 59 60void* mmap_with_name(void* addr, size_t size, int prot, int flags, int fd, off_t offset, const char* name) 61{ 62#ifdef __serenity__ 63 Syscall::SC_mmap_params params { (u32)addr, size, prot, flags, fd, offset, { name, name ? strlen(name) : 0 } }; 64 int rc = syscall(SC_mmap, &params); 65 if (rc < 0 && -rc < EMAXERRNO) { 66 errno = -rc; 67 return MAP_FAILED; 68 } 69 return (void*)rc; 70#else 71 (void)name; 72 // XXX: purgeable memory not supported, turn it into an anonymous mapping 73 if (flags & MAP_PURGEABLE) 74 flags = (flags & ~MAP_PURGEABLE) | MAP_ANONYMOUS; 75 // Using fd 0 seems like a bug, and should be -1 or mmap will EINVAL 76 if (fd == 0 && (flags & MAP_ANONYMOUS)) 77 fd = -1; 78 return mmap(addr, size, prot, flags, fd, offset); 79#endif 80} 81 82int set_mmap_name(void* addr, size_t size, const char* name) 83{ 84#ifdef __serenity__ 85 if (!name) { 86 errno = EFAULT; 87 return -1; 88 } 89 Syscall::SC_set_mmap_name_params params { addr, size, { name, strlen(name) } }; 90 int rc = syscall(SC_set_mmap_name, &params); 91 __RETURN_WITH_ERRNO(rc, rc, -1); 92#else 93 (void)name; 94 (void)addr; 95 (void)size; 96 return 0; 97#endif 98} 99}