Index: fusl/src/mman/mmap.c |
diff --git a/fusl/src/mman/mmap.c b/fusl/src/mman/mmap.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b85f25ca083e8aeff9a20f645a2e4d0f4bd701b6 |
--- /dev/null |
+++ b/fusl/src/mman/mmap.c |
@@ -0,0 +1,37 @@ |
+#include <unistd.h> |
+#include <sys/mman.h> |
+#include <errno.h> |
+#include <stdint.h> |
+#include <limits.h> |
+#include "syscall.h" |
+#include "libc.h" |
+ |
+static void dummy(void) { } |
+weak_alias(dummy, __vm_wait); |
+ |
+#define UNIT SYSCALL_MMAP2_UNIT |
+#define OFF_MASK ((-0x2000ULL << (8*sizeof(long)-1)) | (UNIT-1)) |
+ |
+void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off) |
+{ |
+ if (off & OFF_MASK) { |
+ errno = EINVAL; |
+ return MAP_FAILED; |
+ } |
+ if (len >= PTRDIFF_MAX) { |
+ errno = ENOMEM; |
+ return MAP_FAILED; |
+ } |
+ if (flags & MAP_FIXED) { |
+ __vm_wait(); |
+ } |
+#ifdef SYS_mmap2 |
+ return (void *)syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT); |
+#else |
+ return (void *)syscall(SYS_mmap, start, len, prot, flags, fd, off); |
+#endif |
+} |
+ |
+weak_alias(__mmap, mmap); |
+ |
+LFS64(mmap); |