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/s390 | |
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/s390')
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/mmap_internal.h | 32 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/mmap.S | 74 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S | 81 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/mmap.S | 78 |
4 files changed, 32 insertions, 233 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/mmap_internal.h b/sysdeps/unix/sysv/linux/s390/mmap_internal.h new file mode 100644 index 0000000000..2b11ce4e68 --- /dev/null +++ b/sysdeps/unix/sysv/linux/s390/mmap_internal.h @@ -0,0 +1,32 @@ +/* mmap - map files or devices into memory. Linux/s390 version. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef MMAP_S390_INTERNAL_H +# define MMAP_S390_INTERNAL_H + +#define MMAP_CALL(__nr, __addr, __len, __prot, __flags, __fd, __offset) \ + ({ \ + long int __args[6] = { (long int) (__addr), (long int) (__len), \ + (long int) (__prot), (long int) (__flags), \ + (long int) (__fd), (long int) (__offset) }; \ + INLINE_SYSCALL_CALL (__nr, __args); \ + }) + +#include_next <mmap_internal.h> + +#endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S deleted file mode 100644 index 99b56ed392..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap.S +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2000-2017 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - -#define EINVAL 22 - - .text -ENTRY(__mmap) - /* Save registers and setup stack frame. */ - stm %r6,%r15,24(%r15) - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - cfi_offset (%r12, -48) - cfi_offset (%r11, -52) - cfi_offset (%r10, -56) - cfi_offset (%r9, -60) - cfi_offset (%r8, -64) - cfi_offset (%r7, -68) - cfi_offset (%r6, -72) - lr %r1,%r15 - ahi %r15,-120 /* buy stack space */ - cfi_adjust_cfa_offset (120) - st %r1,0(%r15) /* store back chain */ - - /* Store parameters on stack, because mmap2 - * takes only one parameter: a pointer to the parameter area - */ - st %r6,0x70(%r15) /* Store 'fd'. */ - st %r5,0x6C(%r15) /* Store 'flags'. */ - st %r4,0x68(%r15) /* Store 'prot'. */ - st %r3,0x64(%r15) /* Store 'length'. */ - st %r2,0x60(%r15) /* Store 'start'. */ - l %r1,216(%r15) /* Load offset. */ - - tml %r1,0x0fff /* Offset page aligned ? */ - lhi %r2,-EINVAL - jnz 1f /* No -> EINVAL. */ - srl %r1,12 /* mmap2 takes the offset in pages. */ - st %r1,0x74(%r15) /* Store page offset. */ - la %r2,0x60(%r15) /* Load address of parameter list. */ - svc SYS_ify(mmap2) /* Do the system call trap. */ - -1: l %r15,0(%r15) /* Load back chain. */ - cfi_adjust_cfa_offset (-120) - lm %r6,%r15,24(%r15) /* Load registers. */ - - /* check gpr 2 for error */ - lhi %r0,-4096 - clr %r2,%r0 - jnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -PSEUDO_END (__mmap) - -weak_alias (__mmap, mmap) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S b/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S deleted file mode 100644 index f1825782a4..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-32/mmap64.S +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2000-2017 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - -#define EINVAL 22 -#define ENOSYS 38 - - .text -ENTRY(__mmap64) - /* Save registers and setup stack frame. */ - stm %r6,%r15,24(%r15) - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - cfi_offset (%r12, -48) - cfi_offset (%r11, -52) - cfi_offset (%r10, -56) - cfi_offset (%r9, -60) - cfi_offset (%r8, -64) - cfi_offset (%r7, -68) - cfi_offset (%r6, -72) - lr %r1,%r15 - ahi %r15,-120 /* Buy stack space. */ - cfi_adjust_cfa_offset (120) - st %r1,0(%r15) /* Store back chain. */ - - /* Store parameters on stack, because mmap2 - * takes only one parameter: a pointer to the parameter area. */ - st %r6,0x70(%r15) /* Store 'fd'. */ - st %r5,0x6C(%r15) /* Store 'flags'. */ - st %r4,0x68(%r15) /* Store 'prot'. */ - st %r3,0x64(%r15) /* Store 'length'. */ - st %r2,0x60(%r15) /* Store 'start'. */ - - lm %r0,%r1,216(%r15) /* Load 64 bit offset. */ - tml %r1,0x0fff /* Offset page aligned ? */ - jnz 2f /* No -> EINVAL. */ - srdl %r0,12 /* mmap2 takes the offset in pages. */ - ltr %r0,%r0 /* Offset > 2^44 ? */ - jnz 2f - st %r1,0x74(%r15) /* Store page offset. */ - - la %r2,0x60(%r15) /* Load address of parameter list. */ - svc SYS_ify(mmap2) /* Do the system call trap. */ - - l %r15,0(%r15) /* Load back chain. */ - cfi_adjust_cfa_offset (-120) - lm %r6,%r15,24(%r15) /* Load registers. */ - - /* Check gpr 2 for error. */ - lhi %r0,-4096 - clr %r2,%r0 - jnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -2: lhi %r2,-EINVAL - l %r15,0(%r15) /* Load back chain. */ - lm %r6,%r15,24(%r15) /* Load registers. */ - j SYSCALL_ERROR_LABEL - -PSEUDO_END (__mmap64) - -weak_alias (__mmap64, mmap64) diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S b/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S deleted file mode 100644 index 06d31bbb92..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-64/mmap.S +++ /dev/null @@ -1,78 +0,0 @@ -/* Wrapper around mmap system call. 64 bit S/390 version. - Copyright (C) 2001-2017 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> - -#define EINVAL 22 - - .text - -ENTRY(__mmap) - /* Save registers and setup stack frame. */ - stmg %r6,%r15,48(%r15) - cfi_offset (%r15,-40) - cfi_offset (%r14,-48) - cfi_offset (%r13,-56) - cfi_offset (%r12,-64) - cfi_offset (%r11,-72) - cfi_offset (%r10,-80) - cfi_offset (%r9,-88) - cfi_offset (%r8,-96) - cfi_offset (%r7,-104) - cfi_offset (%r6,-112) - lgr %r1,%r15 - lg %r0,8(%r15) /* Load eos. */ - aghi %r15,-208 /* Buy stack space. */ - cfi_adjust_cfa_offset (208) - stg %r1,0(%r15) /* Store back chain. */ - stg %r0,8(%r15) /* Store eos. */ - - /* Store parameters on stack, because old_mmap - takes only one parameter: a pointer to the parameter area. */ - mvc 200(8,%r15),368(%r15) /* Move 'offset'. */ - lgfr %r6,%r6 - stg %r6,192(%r15) /* Store 'fd'. */ - lgfr %r5,%r5 - stg %r5,184(%r15) /* Store 'flags'. */ - lgfr %r4,%r4 - stg %r4,176(%r15) /* Store 'prot'. */ - stg %r3,168(%r15) /* Store 'length'. */ - stg %r2,160(%r15) /* Store 'start'. */ - - la %r2,160(%r15) /* Load address of parameter list. */ - /* Do the system call trap. */ - svc SYS_ify(mmap) - - lg %r15,0(%r15) /* Load back chain. */ - cfi_adjust_cfa_offset (-208) - lmg %r6,%r15,48(%r15) /* Load registers. */ - - /* Check gpr 2 for error. */ - lghi %r0,-4096 - clgr %r2,%r0 - jgnl SYSCALL_ERROR_LABEL - - /* Successful; return the syscall's value. */ - br %r14 - -PSEUDO_END (__mmap) - -weak_alias (__mmap, mmap) -weak_alias (__mmap, mmap64) -weak_alias (__mmap, __mmap64) |