summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2007-03-08 18:00:42 +0000
committerRob Landley <rob@landley.net>2007-03-08 18:00:42 +0000
commitf95dae5414eee27c4d0f3ec71e7784ed6ba810f5 (patch)
treeddf9a9b330055ab003de6d5c939ebca595aa8370 /libc/sysdeps/linux
parent449af02b4cd365fa95f38ffba8af47be49ca9316 (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')
-rw-r--r--libc/sysdeps/linux/arm/mmap.c48
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