summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldso/include/dl-syscall.h17
-rw-r--r--libc/sysdeps/linux/common/mmap.c2
2 files changed, 18 insertions, 1 deletions
diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h
index 0dd3f593d..184c12fb1 100644
--- a/ldso/include/dl-syscall.h
+++ b/ldso/include/dl-syscall.h
@@ -103,6 +103,7 @@ static inline _syscall0(gid_t, _dl_getpid);
#define __NR__dl_readlink __NR_readlink
static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz);
+#ifdef __NR_mmap
#if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
/* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
#define __NR__dl_mmap __NR_mmap
@@ -126,7 +127,21 @@ static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
return (void *) _dl_mmap_real(buffer);
}
#endif
-
+#elif defined __NR_mmap2
+#define __NR___syscall_mmap2 __NR_mmap2
+static inline _syscall6(__ptr_t, __syscall_mmap2, __ptr_t, addr,
+ size_t, len, int, prot, int, flags, int, fd, off_t, offset);
+/*always 12, even on architectures where PAGE_SHIFT != 12 */
+#define MMAP2_PAGE_SHIFT 12
+static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
+ int flags, int fd, unsigned long offset)
+{
+ if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
+ return MAP_FAILED;
+ return(__syscall_mmap2(addr, size, prot, flags,
+ fd, (off_t) (offset >> MMAP2_PAGE_SHIFT)));
+}
+#endif
#endif /* _LD_SYSCALL_H_ */
diff --git a/libc/sysdeps/linux/common/mmap.c b/libc/sysdeps/linux/common/mmap.c
index 36b98fa70..e7d67e2e9 100644
--- a/libc/sysdeps/linux/common/mmap.c
+++ b/libc/sysdeps/linux/common/mmap.c
@@ -11,6 +11,7 @@
#include <unistd.h>
#include <sys/mman.h>
+#ifdef __NR_mmap
#define __NR__mmap __NR_mmap
_syscall1(__ptr_t, _mmap, unsigned long *, buffer);
__ptr_t mmap(__ptr_t addr, size_t len, int prot,
@@ -26,3 +27,4 @@ __ptr_t mmap(__ptr_t addr, size_t len, int prot,
buffer[5] = (unsigned long) offset;
return (__ptr_t) _mmap(buffer);
}
+#endif