patches/uClibc/0.9.29/100-fix-mmap.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Jan 03 23:40:22 2011 +0100 (2011-01-03)
changeset 2267 7af68e6083aa
parent 291 64c57f736ec3
permissions -rw-r--r--
libc-glibc: remove 2.3.6

This is an obsolete version which is no longer used by any sample (the only
user, the ia64 sample, has been removed).

It also makes the code path a bit complex, with twists just to accomodate
that version. Removing the version will make those twists go away, and
will ease commonalisation of glibc and eglibc in the future (hopefully!).

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@281
     1
--- uClibc-0.9.29.oorig/test/mmap/mmap2.c	(revision 0)
yann@281
     2
+++ uClibc-0.9.29/test/mmap/mmap2.c	(revision 18616)
yann@281
     3
@@ -0,0 +1,41 @@
yann@281
     4
+/* When trying to map /dev/mem with offset 0xFFFFF000 on the ARM platform, mmap
yann@281
     5
+ * returns -EOVERFLOW.
yann@281
     6
+ *
yann@281
     7
+ * Since off_t is defined as a long int and the sign bit is set in the address,
yann@281
     8
+ * the shift operation shifts in ones instead of zeroes
yann@281
     9
+ * from the left. This results the offset sent to the kernel function becomes
yann@281
    10
+ * 0xFFFFFFFF instead of 0x000FFFFF with MMAP2_PAGE_SHIFT set to 12.
yann@281
    11
+ */
yann@281
    12
+
yann@281
    13
+#include <unistd.h>
yann@281
    14
+#include <stdio.h>
yann@281
    15
+#include <stdlib.h>
yann@281
    16
+#include <string.h>
yann@281
    17
+#include <errno.h>
yann@281
    18
+#include <fcntl.h>
yann@281
    19
+#include <sys/mman.h>
yann@281
    20
+
yann@281
    21
+#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
yann@281
    22
+  __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)
yann@281
    23
+
yann@281
    24
+#define MAP_SIZE 4096UL
yann@281
    25
+#define MAP_MASK (MAP_SIZE - 1)
yann@281
    26
+
yann@281
    27
+int main(int argc, char **argv) {
yann@281
    28
+    void* map_base = 0;
yann@281
    29
+    int fd;
yann@281
    30
+    off_t target = 0xfffff000;
yann@281
    31
+    if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
yann@281
    32
+    printf("/dev/mem opened.\n");
yann@281
    33
+    fflush(stdout);
yann@281
    34
+
yann@281
    35
+   /* Map one page */
yann@281
    36
+    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
yann@281
    37
+                        fd, target & ~MAP_MASK);
yann@281
    38
+    if(map_base == (void *) -1) FATAL;
yann@281
    39
+    printf("Memory mapped at address %p.\n", map_base);
yann@281
    40
+    fflush(stdout);
yann@281
    41
+    if(munmap(map_base, MAP_SIZE) == -1) FATAL;
yann@281
    42
+    close(fd);
yann@281
    43
+    return 0;
yann@281
    44
+}
yann@281
    45
--- uClibc-0.9.29.oorig/libc/sysdeps/linux/arm/mmap.c	(revision 18615)
yann@281
    46
+++ uClibc-0.9.29/libc/sysdeps/linux/arm/mmap.c	(revision 18616)
yann@281
    47
@@ -27,7 +27,6 @@ __ptr_t mmap(__ptr_t addr, size_t len, i
yann@281
    48
 
yann@281
    49
 #elif defined  (__NR_mmap2)
yann@281
    50
 #define __NR__mmap __NR_mmap2
yann@281
    51
-
yann@281
    52
 #ifndef MMAP2_PAGE_SHIFT
yann@281
    53
 # define MMAP2_PAGE_SHIFT 12
yann@281
    54
 #endif
yann@281
    55
@@ -39,9 +38,17 @@ __ptr_t mmap(__ptr_t addr, size_t len, i
yann@281
    56
 {
yann@281
    57
   /* check if offset is page aligned */
yann@281
    58
     if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
yann@281
    59
+    {
yann@281
    60
+        __set_errno(EINVAL);
yann@281
    61
         return MAP_FAILED;
yann@281
    62
+    }
yann@281
    63
+#ifdef __USE_FILE_OFFSET64
yann@281
    64
+  return (__ptr_t) _mmap (addr, len, prot, flags,
yann@281
    65
+						  fd,((__u_quad_t) offset >> MMAP2_PAGE_SHIFT));
yann@281
    66
+#else
yann@281
    67
   return (__ptr_t) _mmap (addr, len, prot, flags,
yann@281
    68
-						  fd,(off_t) (offset >> MMAP2_PAGE_SHIFT));
yann@281
    69
+                          fd,((__u_long) offset >> MMAP2_PAGE_SHIFT));
yann@281
    70
+#endif
yann@281
    71
 }
yann@281
    72
 #elif defined (__NR_mmap)
yann@281
    73
 # define __NR__mmap __NR_mmap
yann@281
    74
--- uClibc-0.9.29.oorig/libc/sysdeps/linux/common/mmap64.c	(revision 18615)
yann@281
    75
+++ uClibc-0.9.29/libc/sysdeps/linux/common/mmap64.c	(revision 18616)
yann@281
    76
@@ -58,8 +58,13 @@ __ptr_t mmap64(__ptr_t addr, size_t len,
yann@281
    77
 		__set_errno(EINVAL);
yann@281
    78
 		return MAP_FAILED;
yann@281
    79
 	}
yann@281
    80
-
yann@281
    81
-	return __syscall_mmap2(addr, len, prot, flags, fd, (off_t) (offset >> MMAP2_PAGE_SHIFT));
yann@281
    82
+#ifdef __USE_FILE_OFFSET64
yann@281
    83
+  return __syscall_mmap2(addr, len, prot, flags,
yann@281
    84
+                         fd,((__u_quad_t)offset >> MMAP2_PAGE_SHIFT));
yann@281
    85
+#else
yann@281
    86
+   return __syscall_mmap2(addr, len, prot, flags,
yann@291
    87
+                          fd,((__u_long)offset >> MMAP2_PAGE_SHIFT));
yann@281
    88
+#endif
yann@281
    89
 }
yann@281
    90
 
yann@281
    91
 # endif