diff options
author | Rob Landley <rob@landley.net> | 2007-03-08 18:00:42 +0000 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2007-03-08 18:00:42 +0000 |
commit | f95dae5414eee27c4d0f3ec71e7784ed6ba810f5 (patch) | |
tree | ddf9a9b330055ab003de6d5c939ebca595aa8370 /libc/sysdeps/linux/arm/mmap.c | |
parent | 449af02b4cd365fa95f38ffba8af47be49ca9316 (diff) |
Patch from Khem Raj that fixes running gcc on arm for me. (Otherwise it
says "virtual memory exhausted" trying to build hello world.)
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 |