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