Parcourir la 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 il y a 19 ans
Parent
commit
f95dae5414
1 fichiers modifiés avec 42 ajouts et 6 suppressions
  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