aboutsummaryrefslogtreecommitdiffstats
path: root/libc/bionic/mmap.cpp
diff options
context:
space:
mode:
authorDaniel Leung <daniel.leung@intel.com>2013-09-18 14:41:18 -0700
committerElliott Hughes <enh@google.com>2013-09-19 14:11:26 -0700
commitafcc0cccdafef0c67600cbbc72cee0e7a41f3f04 (patch)
tree506a007c24f06d7ec6415c22901f7485c06b8797 /libc/bionic/mmap.cpp
parentd5ddf40ecf72a03e38164389555ccdade779ab5a (diff)
downloadandroid_bionic-afcc0cccdafef0c67600cbbc72cee0e7a41f3f04.tar.gz
android_bionic-afcc0cccdafef0c67600cbbc72cee0e7a41f3f04.tar.bz2
android_bionic-afcc0cccdafef0c67600cbbc72cee0e7a41f3f04.zip
Add mmap64()
This adds mmap64() to bionic so that it is possible to have large offset passed to kernel. However, the syscall mechanism only passes 32-bit number to kernel. So effectively, the largest offset that can be passed is about 43 bits (since offset is signed, and the number passed to kernel is number of pages (page size == 4K => 12 bits)). Change-Id: Ib54f4e9b54acb6ef8b0324f3b89c9bc810b07281 Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
Diffstat (limited to 'libc/bionic/mmap.cpp')
-rw-r--r--libc/bionic/mmap.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/libc/bionic/mmap.cpp b/libc/bionic/mmap.cpp
index febc459fa..75bea588f 100644
--- a/libc/bionic/mmap.cpp
+++ b/libc/bionic/mmap.cpp
@@ -37,13 +37,13 @@ extern "C" void* __mmap2(void*, size_t, int, int, int, size_t);
#define MMAP2_SHIFT 12 // 2**12 == 4096
-void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) {
+void* mmap64(void* addr, size_t size, int prot, int flags, int fd, off64_t offset) {
if (offset & ((1UL << MMAP2_SHIFT)-1)) {
errno = EINVAL;
return MAP_FAILED;
}
- size_t unsigned_offset = static_cast<size_t>(offset); // To avoid sign extension.
+ uint64_t unsigned_offset = static_cast<uint64_t>(offset); // To avoid sign extension.
void* result = __mmap2(addr, size, prot, flags, fd, unsigned_offset >> MMAP2_SHIFT);
if (result != MAP_FAILED && (flags & (MAP_PRIVATE | MAP_ANONYMOUS)) != 0) {
@@ -53,3 +53,7 @@ void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) {
return result;
}
+
+void* mmap(void* addr, size_t size, int prot, int flags, int fd, off_t offset) {
+ return mmap64(addr, size, prot, flags, fd, static_cast<off64_t>(offset));
+}