From f95dae5414eee27c4d0f3ec71e7784ed6ba810f5 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 8 Mar 2007 18:00:42 +0000 Subject: Patch from Khem Raj that fixes running gcc on arm for me. (Otherwise it says "virtual memory exhausted" trying to build hello world.) --- libc/sysdeps/linux/arm/mmap.c | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'libc') 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 #include +#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 -- cgit v1.2.3