diff options
Diffstat (limited to 'toolchain')
-rw-r--r-- | toolchain/uClibc/uClibc-0.9.29-001-fix-mmap.patch | 93 | ||||
-rw-r--r-- | toolchain/uClibc/uClibc-0.9.29.config | 2 |
2 files changed, 85 insertions, 10 deletions
diff --git a/toolchain/uClibc/uClibc-0.9.29-001-fix-mmap.patch b/toolchain/uClibc/uClibc-0.9.29-001-fix-mmap.patch index d1de25d7c..d07f8468f 100644 --- a/toolchain/uClibc/uClibc-0.9.29-001-fix-mmap.patch +++ b/toolchain/uClibc/uClibc-0.9.29-001-fix-mmap.patch @@ -1,22 +1,97 @@ ---- uClibc-0.9.29/libc/sysdeps/linux/arm/mmap.c 2007-03-08 19:00:42.000000000 +0100 -+++ uClibc/libc/sysdeps/linux/arm/mmap.c 2007-05-16 12:53:23.000000000 +0200 -@@ -39,9 +39,17 @@ +Index: test/mmap/mmap2.c +=================================================================== +--- test/mmap/mmap2.c (revision 0) ++++ test/mmap/mmap2.c (revision 18616) +@@ -0,0 +1,41 @@ ++/* When trying to map /dev/mem with offset 0xFFFFF000 on the ARM platform, mmap ++ * returns -EOVERFLOW. ++ * ++ * Since off_t is defined as a long int and the sign bit is set in the address, ++ * the shift operation shifts in ones instead of zeroes ++ * from the left. This results the offset sent to the kernel function becomes ++ * 0xFFFFFFFF instead of 0x000FFFFF with MMAP2_PAGE_SHIFT set to 12. ++ */ ++ ++#include <unistd.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <sys/mman.h> ++ ++#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \ ++ __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0) ++ ++#define MAP_SIZE 4096UL ++#define MAP_MASK (MAP_SIZE - 1) ++ ++int main(int argc, char **argv) { ++ void* map_base = 0; ++ int fd; ++ off_t target = 0xfffff000; ++ if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL; ++ printf("/dev/mem opened.\n"); ++ fflush(stdout); ++ ++ /* Map one page */ ++ map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, ++ fd, target & ~MAP_MASK); ++ if(map_base == (void *) -1) FATAL; ++ printf("Memory mapped at address %p.\n", map_base); ++ fflush(stdout); ++ if(munmap(map_base, MAP_SIZE) == -1) FATAL; ++ close(fd); ++ return 0; ++} +Index: libc/sysdeps/linux/arm/mmap.c +=================================================================== +--- libc/sysdeps/linux/arm/mmap.c (revision 18615) ++++ libc/sysdeps/linux/arm/mmap.c (revision 18616) +@@ -27,7 +27,6 @@ __ptr_t mmap(__ptr_t addr, size_t len, i + + #elif defined (__NR_mmap2) + #define __NR__mmap __NR_mmap2 +- + #ifndef MMAP2_PAGE_SHIFT + # define MMAP2_PAGE_SHIFT 12 + #endif +@@ -39,9 +38,17 @@ __ptr_t mmap(__ptr_t addr, size_t len, i { /* check if offset is page aligned */ if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1)) + { + __set_errno(EINVAL); return MAP_FAILED; -- return (__ptr_t) _mmap (addr, len, prot, flags, -- fd,(off_t) (offset >> MMAP2_PAGE_SHIFT)); + } +#ifdef __USE_FILE_OFFSET64 -+ return (__ptr_t) _mmap (addr, len, prot, flags, -+ fd, ((__u_quad_t) offset >> MMAP2_PAGE_SHIFT)); ++ return (__ptr_t) _mmap (addr, len, prot, flags, ++ fd,((__u_quad_t) offset >> MMAP2_PAGE_SHIFT)); +#else -+ return (__ptr_t) _mmap (addr, len, prot, flags, -+ fd, ((__u_long) offset >> MMAP2_PAGE_SHIFT)); + return (__ptr_t) _mmap (addr, len, prot, flags, +- fd,(off_t) (offset >> MMAP2_PAGE_SHIFT)); ++ fd,((__u_long) offset >> MMAP2_PAGE_SHIFT)); +#endif } #elif defined (__NR_mmap) # define __NR__mmap __NR_mmap +Index: libc/sysdeps/linux/common/mmap64.c +=================================================================== +--- libc/sysdeps/linux/common/mmap64.c (revision 18615) ++++ libc/sysdeps/linux/common/mmap64.c (revision 18616) +@@ -58,8 +58,13 @@ __ptr_t mmap64(__ptr_t addr, size_t len, + __set_errno(EINVAL); + return MAP_FAILED; + } +- +- return __syscall_mmap2(addr, len, prot, flags, fd, (off_t) (offset >> MMAP2_PAGE_SHIFT)); ++#ifdef __USE_FILE_OFFSET64 ++ return __syscall_mmap2(addr, len, prot, flags, ++ fd,((__u_quad_t)offset >> MMAP2_PAGE_SHIFT)); ++#else ++ return __syscall_mmap2(addr, len, prot, flags, ++ fd,((__ulong_t)offset >> MMAP2_PAGE_SHIFT)); ++#endif + } + + # endif diff --git a/toolchain/uClibc/uClibc-0.9.29.config b/toolchain/uClibc/uClibc-0.9.29.config index 14a36cda0..7764a79df 100644 --- a/toolchain/uClibc/uClibc-0.9.29.config +++ b/toolchain/uClibc/uClibc-0.9.29.config @@ -113,7 +113,7 @@ UCLIBC_HAS_CTYPE_SIGNED=y # UCLIBC_HAS_CTYPE_UNSAFE is not set UCLIBC_HAS_CTYPE_CHECKED=y # UCLIBC_HAS_CTYPE_ENFORCED is not set -UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_WCHAR is not set # UCLIBC_HAS_LOCALE is not set UCLIBC_HAS_HEXADECIMAL_FLOATS=y UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y |