OLD | NEW |
1 #include <unistd.h> | 1 #include <unistd.h> |
2 #include <sys/mman.h> | 2 #include <sys/mman.h> |
3 #include <errno.h> | 3 #include <errno.h> |
4 #include <stdint.h> | 4 #include <stdint.h> |
5 #include <limits.h> | 5 #include <limits.h> |
6 #include "syscall.h" | 6 #include "syscall.h" |
7 #include "libc.h" | 7 #include "libc.h" |
8 | 8 |
9 static void dummy(void) { } | 9 static void dummy(void) {} |
10 weak_alias(dummy, __vm_wait); | 10 weak_alias(dummy, __vm_wait); |
11 | 11 |
12 #define UNIT SYSCALL_MMAP2_UNIT | 12 #define UNIT SYSCALL_MMAP2_UNIT |
13 #define OFF_MASK ((-0x2000ULL << (8*sizeof(long)-1)) | (UNIT-1)) | 13 #define OFF_MASK ((-0x2000ULL << (8 * sizeof(long) - 1)) | (UNIT - 1)) |
14 | 14 |
15 void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off) | 15 void* __mmap(void* start, size_t len, int prot, int flags, int fd, off_t off) { |
16 { | 16 if (off & OFF_MASK) { |
17 » if (off & OFF_MASK) { | 17 errno = EINVAL; |
18 » » errno = EINVAL; | 18 return MAP_FAILED; |
19 » » return MAP_FAILED; | 19 } |
20 » } | 20 if (len >= PTRDIFF_MAX) { |
21 » if (len >= PTRDIFF_MAX) { | 21 errno = ENOMEM; |
22 » » errno = ENOMEM; | 22 return MAP_FAILED; |
23 » » return MAP_FAILED; | 23 } |
24 » } | 24 if (flags & MAP_FIXED) { |
25 » if (flags & MAP_FIXED) { | 25 __vm_wait(); |
26 » » __vm_wait(); | 26 } |
27 » } | |
28 #ifdef SYS_mmap2 | 27 #ifdef SYS_mmap2 |
29 » return (void *)syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT)
; | 28 return (void*)syscall(SYS_mmap2, start, len, prot, flags, fd, off / UNIT); |
30 #else | 29 #else |
31 » return (void *)syscall(SYS_mmap, start, len, prot, flags, fd, off); | 30 return (void*)syscall(SYS_mmap, start, len, prot, flags, fd, off); |
32 #endif | 31 #endif |
33 } | 32 } |
34 | 33 |
35 weak_alias(__mmap, mmap); | 34 weak_alias(__mmap, mmap); |
36 | 35 |
37 weak_alias(__mmap, mmap64); | 36 weak_alias(__mmap, mmap64); |
OLD | NEW |