Browse Source

Patch from Khem Raj that fixes running gcc on arm for me. (Otherwise it
says "virtual memory exhausted" trying to build hello world.)

Rob Landley 18 years ago
parent
commit
f95dae5414
1 changed files with 42 additions and 6 deletions
  1. 42 6
      libc/sysdeps/linux/arm/mmap.c

+ 42 - 6
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