patches/uClibc/0.9.29/100-fix-mmap.patch
author Cody Schafer <dev@codyps.com>
Fri May 09 19:13:49 2014 -0700 (2014-05-09)
changeset 3312 4876ff97e039
parent 291 64c57f736ec3
permissions -rw-r--r--
cc/gcc: allow CC_EXTRA_CONFIG_ARRAY on baremetal

The final bare-metal compiler is built using the core backend.
Currently the core uses the CC_CORE_EXTRA_CONFIG_ARRAY variable.

While this works as supposed to, this can leave the user puzzled
in the menuconfig, since all he can see is the core options, not
the final options.

Only show the core options if any of the core passes are needed,
and use the final options in the core-backend if we're issuing
the bare-metal compiler.

Signed-off-by: Cody P Schafer <dev@codyps.com>
[yann.morin.1998@free.fr: hide core options if no core pass needed;
use final option in core backend if issuing the bare-metal compiler]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Message-Id: <22181e546ba746202489.1399688067@localhost>
Patchwork-Id: 347586
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