diff options
Diffstat (limited to 'libc/sysdeps/linux/arm/mmap.c')
-rw-r--r-- | libc/sysdeps/linux/arm/mmap.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/libc/sysdeps/linux/arm/mmap.c b/libc/sysdeps/linux/arm/mmap.c index 4d01caadb..2eea38efc 100644 --- a/libc/sysdeps/linux/arm/mmap.c +++ b/libc/sysdeps/linux/arm/mmap.c @@ -11,20 +11,56 @@ #include <sys/mman.h> #include <sys/syscall.h> +#if defined (__NR_mmap) || defined (__NR_mmap2) + libc_hidden_proto (mmap) +#if defined (__UCLIBC_MMAP_HAS_6_ARGS__) && defined (__NR_mmap) +#define __NR__mmap __NR_mmap +static inline _syscall6 (__ptr_t, _mmap, __ptr_t, addr, size_t, len, + int, prot, int, flags, int, fd, __off_t, offset); +__ptr_t mmap(__ptr_t addr, size_t len, int prot, + int flags, int fd, __off_t offset) +{ + return (__ptr_t) _mmap (addr, len, prot, flags, + fd, offset); +} -#if defined __ARM_EABI__ +#elif defined (__NR_mmap2) #define __NR__mmap __NR_mmap2 -#else -#define __NR__mmap __NR_mmap + +#ifndef MMAP2_PAGE_SHIFT +# define MMAP2_PAGE_SHIFT 12 #endif + static inline _syscall6 (__ptr_t, _mmap, __ptr_t, addr, size_t, len, int, prot, int, flags, int, fd, __off_t, offset); - __ptr_t mmap(__ptr_t addr, size_t len, int prot, - int flags, int fd, __off_t offset) + int flags, int fd, __off_t offset) { - return (__ptr_t) _mmap (addr, len, prot, flags, fd, offset); + /* check if offset is page aligned */ + if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1)) + return MAP_FAILED; + return (__ptr_t) _mmap (addr, len, prot, flags, + fd,(off_t) (offset >> MMAP2_PAGE_SHIFT)); } +#elif defined (__NR_mmap) +# define __NR__mmap __NR_mmap +static inline _syscall1(__ptr_t, _mmap, unsigned long *, buffer); +__ptr_t mmap(__ptr_t addr, size_t len, int prot, + int flags, int fd, __off_t offset) +{ + unsigned long buffer[6]; + buffer[0] = (unsigned long) addr; + buffer[1] = (unsigned long) len; + buffer[2] = (unsigned long) prot; + buffer[3] = (unsigned long) flags; + buffer[4] = (unsigned long) fd; + buffer[5] = (unsigned long) offset; + return (__ptr_t) _mmap(buffer); +} +#endif libc_hidden_def (mmap) +#else +# error "Your architecture doesn't seem to provide mmap() !?" +#endif |