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
|