github.com/afumu/libc@v0.0.6/musl/src/mman/mmap.c (about) 1 #include <unistd.h> 2 #include <sys/mman.h> 3 #include <errno.h> 4 #include <stdint.h> 5 #include <limits.h> 6 #include "syscall.h" 7 8 static void dummy(void) { } 9 weak_alias(dummy, __vm_wait); 10 11 #define UNIT SYSCALL_MMAP2_UNIT 12 #define OFF_MASK ((-0x2000ULL << (8*sizeof(syscall_arg_t)-1)) | (UNIT-1)) 13 14 void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off) 15 { 16 long ret; 17 if (off & OFF_MASK) { 18 errno = EINVAL; 19 return MAP_FAILED; 20 } 21 if (len >= PTRDIFF_MAX) { 22 errno = ENOMEM; 23 return MAP_FAILED; 24 } 25 if (flags & MAP_FIXED) { 26 __vm_wait(); 27 } 28 #ifdef SYS_mmap2 29 ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT); 30 #else 31 ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off); 32 #endif 33 /* Fixup incorrect EPERM from kernel. */ 34 if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED)) 35 ret = -ENOMEM; 36 return (void *)__syscall_ret(ret); 37 } 38 39 weak_alias(__mmap, mmap); 40 41 weak_alias(mmap, mmap64);