diff options
| -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 | 
