Consolidate Linux mmap implementation (BZ#21270)
commit158d5fa0e1906e7810bdc6ecb7bf598dcc3cd17d
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 6 Apr 2017 20:01:56 +0000 (6 17:01 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 12 Apr 2017 14:04:28 +0000 (12 11:04 -0300)
tree4314d7eeee6694b56c5c12153686f6a58d5ab890
parent4fee33f8c11447d345b2b1118a98958b54d5fda3
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.
25 files changed:
ChangeLog
posix/tst-mmap-offset.c
sysdeps/unix/sysv/linux/aarch64/mmap.c [deleted file]
sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c [deleted file]
sysdeps/unix/sysv/linux/hppa/mmap.c [deleted file]
sysdeps/unix/sysv/linux/m68k/mmap.S [deleted file]
sysdeps/unix/sysv/linux/m68k/mmap64.c [deleted file]
sysdeps/unix/sysv/linux/m68k/mmap_internal.h [moved from sysdeps/unix/sysv/linux/arm/mmap.c with 62% similarity]
sysdeps/unix/sysv/linux/microblaze/mmap.S [deleted file]
sysdeps/unix/sysv/linux/mips/mips32/mmap.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips64/n32/mmap_internal.h [moved from sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c with 60% similarity]
sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list
sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list
sysdeps/unix/sysv/linux/mmap.c [copied from sysdeps/unix/sysv/linux/i386/mmap.c with 54% similarity]
sysdeps/unix/sysv/linux/mmap64.c
sysdeps/unix/sysv/linux/mmap_internal.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/s390/mmap_internal.h [moved from sysdeps/unix/sysv/linux/i386/mmap.c with 57% similarity]
sysdeps/unix/sysv/linux/s390/s390-32/mmap.S [deleted file]
sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S [deleted file]
sysdeps/unix/sysv/linux/s390/s390-64/mmap.S [deleted file]
sysdeps/unix/sysv/linux/wordsize-64/mmap.c [deleted file]
sysdeps/unix/sysv/linux/wordsize-64/mmap64.c [deleted file]
sysdeps/unix/sysv/linux/wordsize-64/syscalls.list
sysdeps/unix/sysv/linux/x86_64/64/mmap_internal.h [moved from sysdeps/unix/sysv/linux/x86_64/64/mmap.c with 88% similarity]