svn commit: trunk/uClibc/libc/sysdeps/linux/arm

landley at uclibc.org landley at uclibc.org
Thu Mar 8 18:00:42 UTC 2007


Author: landley
Date: 2007-03-08 10:00:42 -0800 (Thu, 08 Mar 2007)
New Revision: 18041

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


Modified:
   trunk/uClibc/libc/sysdeps/linux/arm/mmap.c


Changeset:
Modified: trunk/uClibc/libc/sysdeps/linux/arm/mmap.c
===================================================================
--- trunk/uClibc/libc/sysdeps/linux/arm/mmap.c	2007-03-08 17:52:36 UTC (rev 18040)
+++ trunk/uClibc/libc/sysdeps/linux/arm/mmap.c	2007-03-08 18:00:42 UTC (rev 18041)
@@ -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




More information about the uClibc-cvs mailing list