diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-04-06 17:01:56 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-04-12 11:04:28 -0300 |
commit | 158d5fa0e1906e7810bdc6ecb7bf598dcc3cd17d (patch) | |
tree | 4314d7eeee6694b56c5c12153686f6a58d5ab890 /sysdeps/unix/sysv/linux/mips/mips64 | |
parent | 4fee33f8c11447d345b2b1118a98958b54d5fda3 (diff) | |
download | glibc-158d5fa0e1906e7810bdc6ecb7bf598dcc3cd17d.tar.gz glibc-158d5fa0e1906e7810bdc6ecb7bf598dcc3cd17d.tar.xz glibc-158d5fa0e1906e7810bdc6ecb7bf598dcc3cd17d.zip |
Consolidate Linux mmap implementation (BZ#21270)
This patch consolidates all Linux mmap implementations on default sysdeps/unix/sysv/linux/mmap{64}.c one. To accomodate all required architecture specific requeriments a new internal header is created (mmap_internal.h) where each architecture add its specific code requirements. Currently only x86_64 (to define MMAP_PREPARE to add MAP_32BITS), s390 (which have a different kernel ABI for mmap), m68k (which have variable minimum page sizes), and MIPS n32 (which zero extend the offset to handle negative one correctly) redefine the new header. The patch also fixes BZ#21270 where default mmap64 on architectures which uses mmap2 silent truncates large offsets value (larger than 1 << (page shift + 8 * sizeof (off_t)) or 1<<44 on architectures with 4096 bytes page size). The new consolidate implementation returns EINVAL as allowed by POSIX. It also adds a tests for on current tst-mmap-offset one. I have run a full make check on x86_64, x86_64-32, i686, aarch64, armhf, powerpc, powerpc64le, sparc64, and sparcv9 without any regressions. I also ran some basic tests (tst-mmap-offset) on sh4, m68k, and on qemu simulated MIPS32 and MIPS64. [BZ #21270] * posix/tst-mmap-offset.c (do_prepare): New function. (do_test): Rename to do_test_bz18877 and use FAIL_RET. (do_test_bz21270): New function. * sysdeps/unix/sysv/linux/aarch64/mmap.c: Remove file. * sysdeps/unix/sysv/linux/arm/mmap.c: Remove file. * sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c: Likewise. * sysdeps/unix/sysv/linux/hppa/mmap.c: Likewise. * sysdeps/unix/sysv/linux/i386/mmap.c: Likewise. * sysdeps/unix/sysv/linux/m68k/mmap.S: Likewise. * sysdeps/unix/sysv/linux/m68k/mmap64.c: Likewise. * sysdeps/unix/sysv/linux/microblaze/mmap.S: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/mmap.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/mmap.S: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S: Likewise. * sysdeps/unix/sysv/linux/s390/s390-64/mmap.S: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/mmap.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/mmap64.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/mmap.c: Likewise. * sysdeps/unix/sysv/linux/mmap_internal.h: New file. * sysdeps/unix/sysv/linux/m68k/mmap_internal.h: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/mmap_internal.h: Likewise. * sysdeps/unix/sysv/linux/s390/mmap_internal.h: Likewise. * sysdeps/unix/sysv/linux/x86_64/64/mmap_internal.h: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list: Remove mmap from auto-generation list. * sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/syscalls.list: Likewise. * sysdeps/unix/sysv/linux/mmap.c: New file. * sysdeps/unix/sysv/linux/mmap64.c (__mmap64): Add check for invalid offsets and support for mmap2 syscall.
Diffstat (limited to 'sysdeps/unix/sysv/linux/mips/mips64')
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips64/n32/mmap_internal.h (renamed from sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c) | 25 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list | 2 |
4 files changed, 9 insertions, 21 deletions
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap_internal.h index ca0a5b1442..4b65559ecb 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap_internal.h @@ -1,4 +1,4 @@ -/* mmap for MIPS n32. +/* Common mmap definition for Linux implementation. MIPS n32 version. Copyright (C) 2016-2017 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,20 +16,13 @@ License along with the GNU C Library. If not, see <http://www.gnu.org/licenses/>. */ -#include <sys/types.h> -#include <sys/mman.h> -#include <errno.h> -#include <stdint.h> -#include <sysdep.h> +#ifndef MMAP_MIPS_N32_INTERNAL_H +#define MMAP_MIPS_N32_INTERNAL_H -__ptr_t -__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) -{ - /* To handle negative offsets consistently with other architectures, - the offset must be zero-extended to 64-bit. */ - uint64_t offset_adj = (uint64_t) (uint32_t) offset; - return (__ptr_t) INLINE_SYSCALL (mmap, 6, addr, len, prot, flags, fd, - offset_adj); -} +/* To handle negative offsets consistently with other architectures, + the offset must be zero-extended to 64-bit. */ +#define MMAP_ADJUST_OFFSET(offset) (uint64_t) (uint32_t) offset -weak_alias (__mmap, mmap) +#include_next <mmap_internal.h> + +#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list b/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list index 7af317f69c..5f3d04728d 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list @@ -4,8 +4,6 @@ # return value. lseek64 - lseek i:iii __lseek64 __libc_lseek64 lseek64 llseek -mmap64 - mmap b:aniiii __mmap64 mmap64 - readahead - readahead i:iii __readahead readahead prlimit64 EXTRA prlimit64 i:iipp prlimit64 diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c deleted file mode 100644 index 0dbd384a6a..0000000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c +++ /dev/null @@ -1 +0,0 @@ -/* mmap64 is the same as mmap. */ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list b/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list index 5b5cfc2655..28664208d0 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list @@ -1,7 +1,5 @@ # File name Caller Syscall name # args Strong name Weak names -mmap - mmap b:aniiii __mmap mmap __mmap64 mmap64 - readahead - readahead i:iii __readahead readahead prlimit EXTRA prlimit64 i:iipp prlimit prlimit64 |