[352] | 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 | #include "libc.h"
|
---|
| 8 |
|
---|
| 9 | #ifndef __c2__
|
---|
| 10 | static void dummy(void) { }
|
---|
| 11 | weak_alias(dummy, __vm_wait);
|
---|
| 12 | #else
|
---|
| 13 | extern void __vm_wait(void);
|
---|
| 14 | #endif
|
---|
| 15 |
|
---|
| 16 | #define UNIT SYSCALL_MMAP2_UNIT
|
---|
| 17 | #define OFF_MASK ((-0x2000ULL << (8*sizeof(syscall_arg_t)-1)) | (UNIT-1))
|
---|
| 18 |
|
---|
| 19 | void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
|
---|
| 20 | {
|
---|
| 21 | long ret;
|
---|
| 22 | if (off & OFF_MASK) {
|
---|
| 23 | errno = EINVAL;
|
---|
| 24 | return MAP_FAILED;
|
---|
| 25 | }
|
---|
| 26 | if (len >= PTRDIFF_MAX) {
|
---|
| 27 | errno = ENOMEM;
|
---|
| 28 | return MAP_FAILED;
|
---|
| 29 | }
|
---|
| 30 | if (flags & MAP_FIXED) {
|
---|
| 31 | __vm_wait();
|
---|
| 32 | }
|
---|
| 33 | #ifdef SYS_mmap2
|
---|
| 34 | ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
|
---|
| 35 | #else
|
---|
| 36 | ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off);
|
---|
| 37 | #endif
|
---|
| 38 | /* Fixup incorrect EPERM from kernel. */
|
---|
| 39 | if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED))
|
---|
| 40 | ret = -ENOMEM;
|
---|
| 41 | return (void *)__syscall_ret(ret);
|
---|
| 42 | }
|
---|
| 43 |
|
---|
| 44 | #ifndef __c2__
|
---|
| 45 | weak_alias(__mmap, mmap);
|
---|
| 46 | #else
|
---|
| 47 | void *mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
|
---|
| 48 | {
|
---|
| 49 | return __mmap(start, len, prot, flags, fd, off);
|
---|
| 50 | }
|
---|
| 51 | #endif
|
---|
| 52 |
|
---|
| 53 | LFS64(mmap);
|
---|